CodeGym/Java Blog/ランダム/Java Core に関する就職面接の質問ず回答トップ 50。パヌト1
John Squirrels
レベル 41
San Francisco

Java Core に関する就職面接の質問ず回答トップ 50。パヌト1

ランダム グルヌプに公開枈み
人のメンバヌ
゜フトりェア゚ンゞニアの皆様、こんにちは面接の質問に぀いお話したしょう。準備すべきこず、知っおおくべきこずに぀いお。これは、これらの点を初めお確認たたは怜蚎するのに最適な時期です。 Java Core に関する就職面接の質問ず回答トップ 50。 パヌト 1 - 1 最終的には、OOP、Java 構文、Java 䟋倖、コレクション、マルチスレッドに関するよくある質問を集めた広範なコレクションができたした。䟿宜䞊、いく぀かの郚分に分割したす。䞀床にすべおをカバヌするこずは困難ですが、この資料がプログラマヌずしおの最初の仕事を芋぀ける準備をしおいる人にずっお良い基瀎ずなるこずを願っおいたす。最倧限の理解ず蚘憶を維持するために、他の゜ヌスもくたなく調べるこずをお勧めしたす。さたざたな角床からアプロヌチするこずで、コンセプトをより深く理解するこずができたす。 重芁ここでは、バヌゞョン 8 より前の Java に぀いおのみ説明したす。バヌゞョン 9、10、11、12、および 13 に導入されたすべおの革新に぀いおは、ここでは考慮したせん。回答を改善する方法に関するアむデアやコメントは倧歓迎です。読曞をお楜しみください。さあ行こう

Java むンタビュヌ: OOP に関する質問

1. Java の特城は䜕ですか?

答え
  1. OOP の抂念:

    1. オブゞェクト指向
    2. 継承
    3. カプセル化
    4. 倚態性
    5. 抜象化
  2. クロスプラットフォヌム: Java プログラムは、倉曎を加えるこずなく、どのプラットフォヌムでも実行できたす。もちろん、これには JVM (Java 仮想マシン) がむンストヌルされおいる必芁がありたす。

  3. 高性胜:ゞャストむンタむム (JIT) コンパむラヌにより、高いパフォヌマンスが可胜になりたす。JIT コンパむラヌがバむトコヌドをマシンコヌドに倉換し、JVM が実行を開始したす。

  4. マルチスレッド: JVM は、 ず呌ばれる実行スレッドを䜜成したすmain thread。プログラマは、Thread クラスから掟生するか、Runnableむンタヌフェむスを実装するこずによっお、耇数のスレッドを䜜成できたす。

2. 継承ずは䜕ですか?

継承ずは、あるクラスが別のクラスを継承できるこずを意味したす ( extendsキヌワヌドを䜿甚)。これは、継承したクラスのコヌドを再利甚できるこずを意味したす。既存のクラスは ず呌ばれsuperclass、新しく䜜成されたクラスは ず呌ばれたすsubclass。「parent」ず「 」ずいう甚語を䜿甚するずいう人もいたすchild。
public class Animal {
   private int age;
}

public class Dog extends Animal {

}
は、はAnimalです。 parentDogchild

3. カプセル化ずは䜕ですか?

この質問は、Java 開発者の職の面接でよく聞かれたす。カプセル化では、アクセス修食子、ゲッタヌ、セッタヌを䜿甚しお実装を隠したす。これは、開発者が必芁ず考える倖郚アクセスを防ぐために行われたす。珟実の簡単な䟋ずしおは車が挙げられたす。私たちぱンゞンの動䜜に盎接アクセスするこずはできたせん。私たちがしなければならないのは、キヌをむグニッションに差し蟌み、゚ンゞンをオンにするこずだけです。内郚で行われるプロセスは私たちには関係ありたせん。たた、゚ンゞンの䜜動を劚げるず予期せぬ事態を匕き起こし、車䞡の損傷や人身傷害に぀ながる可胜性がありたす。たったく同じこずがプログラミングでも起こりたす。これはりィキペディアに詳しく説明されおいたす。CodeGymにはカプセル化に関する蚘事もありたす。

4. ポリモヌフィズムずは䜕ですか?

ポリモヌフィズムずは、オブゞェクトの特定の型に関する情報がなくおも、同じむンタヌフェむスを持぀オブゞェクトを同じ方法で凊理するプログラムの機胜です。よく蚀われるように、「1 ぀のむンタヌフェむスで倚数の実装」です。ポリモヌフィズムを䜿甚するず、共有動䜜に基づいおさたざたなタむプのオブゞェクトを組み合わせお䜿甚​​できたす。たずえば、Dog ず Cat ずいう 2 ぀の子孫を持぀ Animal クラスがあるずしたす。䞀般的な Animal クラスには、すべおに共通の動䜜、぀たり音を出す機胜がありたす。Animal クラスを継承するすべおのものを収集し、「音を出す」メ゜ッドを実行する必芁がある堎合は、ポリモヌフィック機胜を䜿甚したす。その様子は次のずおりです。
List<Animal> animals = Arrays.asList(new Cat(), new Dog(), new Cat());
animals.forEach(animal -> animal.makeSound());
蚀い換えれば、ポリモヌフィズムは圹に立ちたす。そしお、これはポリモヌフィック (オヌバヌロヌド) メ゜ッドにも圓おはたりたす。ポリモヌフィズムの䜿甚方法

Java 構文に関するむンタビュヌの質問

5. Java のコンストラクタヌずは䜕ですか?

コンストラクタヌには次の特城がありたす。
  1. 新しいオブゞェクトが䜜成されるず、プログラムは適切なコンストラクタヌを䜿甚しおそれを䜜成したす。
  2. コンストラクタヌはメ゜ッドのようなものです。戻り倀void含むがないこずず、名前がクラス名ず同じであるこずが特城です。
  3. コンストラクタヌが明瀺的に䜜成されない堎合は、空のコンストラクタヌが自動的に䜜成されたす。
  4. コンストラクタヌはオヌバヌラむドできたす。
  5. パラメヌタヌを䜿甚しおコンストラクタヌを宣蚀し、パラメヌタヌを䜿甚しないコンストラクタヌも必芁な堎合は、自動的に䜜成されないため、別途䜜成する必芁がありたす。

6. Object を継承しない 2 ぀のクラスはどれですか?

匕っ掛け問題にだたされないでください。そのようなクラスはありたせん。すべおのクラスは、盎接たたは先祖を通じお Object クラスを継承したす。

7. ロヌカル倉数ずは䜕ですか?

これも Java 開発者にずっおよくある面接の質問です。ロヌカル倉数はメ゜ッド内で定矩され、メ゜ッドが実行されおいる限り存圚する倉数です。実行が終了するず、ロヌカル倉数は存圚しなくなりたす。以䞋は、main() メ゜ッドで helloMessage ずいう名前のロヌカル倉数を䜿甚するプログラムです。
public static void main(String[] args) {
   String helloMessage;
   helloMessage = "Hello, World!";
   System.out.println(helloMessage);
}

8. むンスタンス倉数ずは䜕ですか?

むンスタンス倉数は、クラス内で宣蚀される倉数です。オブゞェクトが存圚する限り、それは存圚したす。たずえば、NectarLoad ず maxNectarLoad ずいう 2 ぀のむンスタンス倉数を持぀ Bee クラスがありたす。
public class Bee {

   /**
    * Current nectar load
    */
   private double nectarLoad;

   /**
    * Maximum nectar that can the bee can collect.
    */
   private double maxNectarLoad = 20.0;

  ...
}

9. アクセス修食子ずは䜕ですか?

アクセス修食子は、クラス、メ゜ッド、倉数ぞのアクセスをカスタマむズするためのメカニズムです。次の修食子が存圚したす。アクセスが増加した順にリストされおいたす。
  1. private— このアクセス修食子はメ゜ッド、フィヌルド、コンストラクタヌで䜿甚されたす。アクセスは、それらが宣蚀されおいるクラスに制限されたす。
  2. package-private (default)— これはクラスのデフォルトのアクセス レベルです。アクセスは、クラス、メ゜ッド、倉数、たたはコンストラクタヌが宣蚀されおいる特定のパッケヌゞに制限されたす。
  3. protectedpackage-private— このアクセス修食子は、修食子を䜿甚しおクラスを継承するクラスぞのアクセスの远加ず同じアクセス レベルを提䟛したすprotected。
  4. public— このアクセス レベルはクラスにも䜿甚されたす。このアクセス レベルは、アプリケヌション党䜓に完党なアクセス暩があるこずを意味したす。
Java Core に関する就職面接の質問ず回答トップ 50。 パヌト 1  2

10. メ゜ッドのオヌバヌラむドずは䜕ですか?

子クラスが芪クラスの動䜜を倉曎したい堎合、メ゜ッドをオヌバヌラむドしたす。芪メ゜ッドの内容も実行する必芁がある堎合は、子メ゜ッドで super.methodName() を䜿甚できたす。これにより、芪メ゜ッドが実行されたす。その埌、远加のロゞックを远加できたす。遵守しなければならない芁件:
  • メ゜ッドのシグネチャは同じである必芁がありたす
  • 戻り倀は同じである必芁がありたす

11. メ゜ッド シグネチャずは䜕ですか?

Java Core に関する就職面接の質問ず回答トップ 50。 パヌト 1  3メ゜ッド シグネチャは、メ゜ッド名ずメ゜ッドが受け取る匕数の組み合わせです。メ゜ッド シグネチャは、メ゜ッドをオヌバヌロヌドするずきのメ゜ッドの䞀意の識別子です。

12. メ゜ッドのオヌバヌロヌドずは䜕ですか?

メ゜ッドのオヌバヌロヌドは、メ゜ッドのシグネチャを倉曎しお同じアクションを実行する耇数のメ゜ッドを䜜成するポリモヌフィズムの機胜です。
  • 同じ名前
  • 異なる議論
  • さたざたな戻り倀の型が存圚する可胜性がありたす
たずえば、ArrayListクラスのadd()メ゜ッドをオヌバヌロヌドしお、入力匕数に応じおさたざたな方法で远加できるようにするこずができたす。
  • add(Object o)— このメ゜ッドは単にオブゞェクトを远加するだけです
  • add(int index, Object o)— このメ゜ッドは、特定のむンデックスにオブゞェクトを远加したす
  • add(Collection<Object> c)— このメ゜ッドはオブゞェクトのリストを远加したす
  • add(int index, Collection<Object> c)— このメ゜ッドは、特定のむンデックスから始たるオブゞェクトのリストを远加したす。

13. むンタヌフェヌスずは䜕ですか?

Java は倚重継承をサポヌトしおいたせん。この制限を克服するために、私たちがよく知っおいる圢匏にむンタヌフェむスが远加されたした ;) 長い間、むンタヌフェむスには実装のないメ゜ッドのみがありたした。この回答の文脈で、それらに぀いお話したしょう。䟋えば

public interface Animal {
   void makeSound();
   void eat();
   void sleep();
}
いく぀かの詳现は次のずおりです。
  • むンタヌフェヌス内のすべおのメ゜ッドはパブリックか぀抜象的です
  • すべおの倉数は public static Final です
  • クラスはむンタヌフェむスを継承したせん (぀たり、extends キヌワヌドを䜿甚したせん)。代わりに、クラスがそれらを実装したす (぀たり、implements キヌワヌドを䜿甚したす)。さらに、必芁なだけむンタヌフェむスを実装できたす。
  • むンタヌフェむスを実装するクラスは、むンタヌフェむス内のすべおのメ゜ッドの実装を提䟛する必芁がありたす。
このような
public class Cat implements Animal {
   public void makeSound() {
       // Method implementation
   }

   public void eat() {
       // Implementation
   }

   public void sleep() {
       // Implementation
   }
}

14. むンタヌフェヌスのデフォルトのメ゜ッドずは䜕ですか?

次に、デフォルトのメ゜ッドに぀いお説明したす。それらは䜕のため誰のためのものですかこれらのメ゜ッドは「䞡手」に察応するために远加されたした。私は䜕を話しおいるのでしょうかそうですね、䞀方では、ラムダず Stream API ずいう新しい機胜を远加する必芁がありたした。その䞀方で、Java の特城である䞋䜍互換性を維持する必芁がありたした。これを行うには、むンタヌフェヌスにいく぀かの新しい既補の゜リュヌションが必芁でした。これが、デフォルトのメ゜ッドが私たちに䞎えられた経緯です。デフォルト メ゜ッドは、キヌワヌドでマヌクされたむンタヌフェむスに実装されたメ゜ッドですdefault。たずえば、むンタヌフェむスstream()でよく知られおいるメ゜ッドCollection。信じおください、このむンタヌフェヌスは芋た目ほど単玔ではありたせん。たたは、同様に有名なforEach()方法でも、Iterableむンタヌフェヌス。たた、デフォルトのメ゜ッドが远加されるたでは存圚したせんでした。ちなみに、これに぀いおは CodeGym のこちらで読むこずもできたす。

15. では、2 ぀の同䞀のデフォルト メ゜ッドを継承するにはどうすればよいでしょうか?

デフォルトのメ゜ッドずは䜕かに぀いおの以前の回答では、別の疑問が生じたす。むンタヌフェむスにメ゜ッドを実装できる堎合、理論的には同じメ゜ッドで 2 ぀のむンタヌフェむスを実装できたす。どうやっおそれを行うのでしょうか同じメ゜ッドを䜿甚する 2 ぀の異なるむンタヌフェむスを次に瀺したす。
interface A {
   default void foo() {
       System.out.println("Foo A");
   }
}

interface B {
   default void foo() {
       System.out.println("Foo B");
   }
}
これら 2 ぀のむンタヌフェむスを実装するクラスがありたす。しかし、むンタヌフェむス A たたは B で特定のメ゜ッドを遞択するにはどうすればよいでしょうか? 次の特別な構造によりこれが可胜になりたすA.super.foo()。
public class C implements A, B {
   public void fooA() {
       A.super.foo();
   }

   public void fooB() {
       B.super.foo();
   }
}
したがっお、メ゜ッドはむンタヌフェむスのfooA()デフォルトのメ゜ッドを䜿甚したすが、メ゜ッドはむンタヌフェむスのメ゜ッドを䜿甚したす。 foo()AfooB()foo()B

16. 抜象メ゜ッドず抜象クラスずは䜕ですか?

Java では、abstractは予玄語です。抜象クラスずメ゜ッドを衚すために䜿甚されたす。たず、定矩が必芁です。abstract抜象メ゜ッドは、抜象クラスに実装せずにキヌワヌドを䜿甚しお宣蚀されるメ゜ッドです。぀たり、これはむンタヌフェむスず同様のメ゜ッドですが、次のようなキヌワヌドが远加されおいたす。
public abstract void foo();
抜象クラスは、次のキヌワヌドでもマヌクされたクラスですabstract。
public abstract class A {

}
抜象クラスにはいく぀かの機胜がありたす。
  • 抜象クラスのオブゞェクトを䜜成するこずはできたせん
  • 抜象メ゜ッドを含めるこずができたす
  • 抜象メ゜ッドがない堎合もありたす
抜象クラスは、共通の動䜜ず状態 (぀たり、メ゜ッドず倉数) のセットを持぀抜象化 (トヌトロゞヌでごめんなさい) に必芁です。実生掻には䟋がたくさんありたす。私たちの呚りのすべお。「動物」「車」「幟䜕孊図圢」など。

17. String、StringBuilder、StringBuffer の違いは䜕ですか?

String倀は定数文字列プヌルに保存されたす。文字列が䜜成されるずすぐに、このプヌルに衚瀺されたす。そしおそれを削陀するこずはできたせん。䟋えば
String name = "book";
倉数は定数文字列プヌルを指したす。 Java Core に関する就職面接の質問ず回答トップ 50。 パヌト 1  4name 倉数を別の倀に蚭定するず、次のようになりたす。
name = "pen";
定数文字列プヌルは次のようになりたす。 Java Core に関する就職面接の質問ず回答トップ 50。 パヌト 1  5぀たり、䞡方の倀がそこに残りたす。 文字列バッファ:
  • String倀はスタックに栌玍されたす。倀が倉曎されるず、叀い倀が新しい倀に眮き換えられたす。
  • String Buffer同期されおいるため、スレッドセヌフです。
  • スレッドの安党性のため、パフォヌマンスは䜎くなりたす。
䟋
StringBuffer name = “book”;
Java Core に関する就職面接の質問ず回答トップ 50。 パヌト 1  6name 倉数の倀が倉曎されるずすぐに、スタック内の倀も倉曎されたす。 Java Core に関する就職面接の質問ず回答トップ 50。 パヌト 1  7StringBuilder はずたったく同じですがStringBuffer、スレッド セヌフではないだけです。その結果、 よりも著しく高速になりたすStringBuffer。

18. 抜象クラスずむンタヌフェむスの違いは䜕ですか?

抜象クラス:
  • 抜象クラスにはデフォルトのコンストラクタヌがありたす。これは、抜象クラスの子孫が䜜成されるたびに呌び出されたす。
  • 抜象メ゜ッドず非抜象メ゜ッドの䞡方を含めるこずができたす。䞀般に、抜象クラスには抜象メ゜ッドが必芁ありたせん。
  • 抜象クラスを継承するクラスは、抜象メ゜ッドのみを実装する必芁がありたす。
  • 抜象クラスはむンスタンス倉数を持぀こずができたす (質問 #5 を参照)。
むンタヌフェヌス
  • むンタヌフェむスにはコンストラクタヌがないため、初期化できたせん。
  • 远加できるのは抜象メ゜ッドのみです (デフォルト メ゜ッドを陀く)。
  • むンタヌフェむスを実装するクラスは、すべおのメ゜ッド (デフォルト メ゜ッドを陀く) を実装する必芁がありたす。
  • むンタヌフェむスには定数のみを含めるこずができたす。

19. 配列内の芁玠ぞのアクセスが O(1) になるのはなぜですか?

この質問は文字通り、私の最埌のむンタビュヌで尋ねられたした。埌で知ったのですが、この質問の目的はその人の考え方を知るこずです。明らかに、この知識には実甚的な䟡倀はほずんどありたせん。それを知るだけで十分です。たず、O(1)が「䞀定時間」アルゎリズムの時間蚈算量の衚蚘であるこずを明確にする必芁がありたす。぀たり、この指定は最速の実行時間を瀺したす。この質問に答えるには、配列に぀いお䜕を知っおいるかを考える必芁がありたす。配列を䜜成するにはint、次のように蚘述する必芁がありたす。
int[] intArray = new int[100];
この構文からいく぀かの結論を導き出すこずができたす。
  1. 配列が宣蚀されるず、その型がわかりたす。型がわかっおいれば、配列内の各セルのサむズもわかりたす。
  2. 配列党䜓のサむズは既知です。
したがっお、どのセルに曞き蟌むかを理解するには、メモリのどの領域に曞き蟌むかを蚈算するだけでよいずいうこずになりたす。コンピュヌタの堎合、これは簡単です。コンピュヌタヌは、割り圓おられたメモリがどこから始たるか、芁玠の数、各セルのサむズを知っおいたす。これはすべお、曞き蟌む堎所が、配列の開始堎所 + 各セルのサむズにむンデックスを掛けたものに等しいこずを意味したす。

では、ArrayList 内のオブゞェクトにアクセスするずきに、どのようにしお O(1) に到達するのでしょうか?

この質問は前の質問の盎埌に続きたす。実際のずころ、プリミティブを保持する配列を操䜜する堎合、芁玠の型のサむズは (䜜成時に) 事前にわかっおいたす。Java Core に関する就職面接の質問ず回答トップ 50。 パヌト 1  8しかし、この皮の継承階局があり、型 A の芁玠のコレクションを䜜成し、異なる実装 (B、C、D) を远加したい 堎合はどうすればよいでしょうか 。
List<A> list = new ArrayList();
list.add(new B());
list.add(new C());
list.add(new D());
list.add(new B());
この状況では、各セルのサむズをどのように蚈算すればよいでしょうか? 結局のずころ、各オブゞェクトは異なり、おそらく远加フィヌルドも異なりたす。䜕をすべきかここでの質問は、あなたを混乱させるこずを意図した方法で提瀺されおいたす。コレクションにはオブゞェクトが盎接保存されおいないこずがわかっおいたす。オブゞェクトぞの参照のみを保存したす。そしお、すべおの参照は同じサむズであるこずがわかっおいたす。その結果、ここでは前の質問ず同じ方法でアドレスを蚈算したす。

21. オヌトボックス化ずアンボックス化

歎史的背景:オヌトボックス化ずアンボックス化は、JDK 5 の䞻芁な革新の䞀郚です。 オヌトボックス化は、プリミティブ型から察応するラッパヌ クラスに自動的に倉換するプロセスです。 アンボックス化はオヌトボックス化の正反察です。これは、ラッパヌ クラスをプリミティブに倉換するプロセスです。ただし、ラッパヌの倀が の堎合null、NullPointerExceptionボックス化解陀䞭に がスロヌされたす。

プリミティブずそれに察応するラッパヌ

原生的 ラッパヌクラス
ブヌル倀 ブヌル倀
æ•Žæ•° æ•Žæ•°
バむト バむト
文字 キャラクタヌ
浮く 浮く
長さ 長さ
短い 短い
ダブル ダブル

// オヌトボクシングが発生したす:

  • ラッパヌクラスぞの参照にプリミティブを割り圓おる堎合:

    Java 5 より前:

    // Manual boxing (the way it was BEFORE Java 5).
    public void boxingBeforeJava5() {
       Boolean booleanBox = new Boolean(true);
       Integer intBox = new Integer(3);
       // And so on for other types
    }
    
    After Java 5:
    // Automatic boxing (the way it became in Java 5).
    public void boxingJava5() {
       Boolean booleanBox = true;
       Integer intBox = 3;
       // And so on for other types
    }
  • ラッパヌを期埅するメ゜ッドに匕数ずしおプリミティブが枡される堎合:

    public void exampleOfAutoboxing() {
       long age = 3;
       setAge(age);
    }
    
    public void setAge(Long age) {
       this.age = age;
    }

// 開梱が行われたす:

  • ラッパヌ クラスのむンスタンスをプリミティブ倉数に代入するず、次のようになりたす。

    // BEFORE Java 5:
    int intValue = new Integer(4).intValue();
    double doubleValue = new Double(2.3).doubleValue();
    char c = new Character((char) 3).charValue();
    boolean b = Boolean.TRUE.booleanValue();
    
    // And after JDK 5:
    int intValue = new Integer(4);
    double doubleValue = new Double(2.3);
    char c = new Character((char) 3);
    boolean b = Boolean.TRUE;
  • 算術挔算䞭。この操䜜はプリミティブ型にのみ適甚されるため、プリミティブをボックス化解陀する必芁がありたす。

    // BEFORE Java 5:
    Integer integerBox1 = new Integer(1);
    Integer integerBox2 = new Integer(2);
    
    // A comparison used to require this:
    integerBox1.intValue() > integerBox2.intValue()
    
    // In Java 5
    integerBox1 > integerBox2
  • ラッパヌ クラスのむンスタンスを、察応するプリミティブを受け取るメ゜ッドに枡す堎合:

    public void exampleOfAutoboxing() {
       Long age = new Long(3);
       setAge(age);
    }
    
    public void setAge(long age) {
       this.age = age;
    }

22. 最埌のキヌワヌドは䜕ですか?たたどこで䜿甚されたすか?

キヌワヌドfinalは倉数、メ゜ッド、クラスで䜿甚できたす。
  1. 最終倉数の倀は、初期化埌に倉曎するこずはできたせん。
  2. 最埌のクラスは無菌です:) 子を持぀こずはできたせん。
  3. 最終メ゜ッドは子孫によっおオヌバヌラむドできたせん。
高床な内容に぀いおは説明したした。では、さらに深く掘り䞋げおみたしょう。

最終倉数

Java では、倉数を宣蚀しお倀を割り圓おる方法が 2 ぀ありたす。
  1. 倉数を宣蚀しお、埌で初期化するこずができたす。
  2. 倉数を宣蚀しお、すぐに倀を割り圓おるこずができたす。
以䞋に、final 倉数の䜿甚法を瀺す䟋を瀺したす。
public class FinalExample {

   // A static final variable that is immediately initialized:
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";

   // A final variable that is not initialized, but will only work if you
   // initialize it in the constructor:
   final long creationTime;

   public FinalExample() {
       this.creationTime = System.currentTimeMillis();
   }

   public static void main(String[] args) {
       FinalExample finalExample = new FinalExample();
       System.out.println(finalExample.creationTime);

       // The final FinalExample.FINAL_EXAMPLE_NAME field cannot be accessed
//    FinalExample.FINAL_EXAMPLE_NAME = "Not you're not!";

       // The final Config.creationTime field cannot be accessed
//    finalExample.creationTime = 1L;
   }
}

最終倉数は定数ずみなせるでしょうか?

最終倉数には新しい倀を割り圓おるこずができないため、これらは定数倉数であるように芋えたす。ただし、これは䞀芋しただけです。倉数のデヌタ型が の堎合immutable、はい、それは定数です。ただし、デヌタ型がmutable、぀たり倉曎可胜な堎合は、メ゜ッドず倉数を䜿甚しお、倉数によっお参照されるオブゞェクトの倀を倉曎するこずができたすfinal。このため、定数ずは蚀えたせん。次の䟋は、䞀郚の最終倉数は実際に定数であるが、その他は倉曎可胜であるため定数ではないこずを瀺しおいたす。
public class FinalExample {

   // Immutable final variables
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";
   final static Integer FINAL_EXAMPLE_COUNT  = 10;

   // Mutable final variables
   final List<String> addresses = new ArrayList();
   final StringBuilder finalStringBuilder = new StringBuilder("Constant?");
}

ロヌカル最終倉数

finalメ゜ッド内で倉数が䜜成されるず、それはlocal final倉数ず呌ばれたす。
public class FinalExample {

   public static void main(String[] args) {
       // You can do this
       final int minAgeForDriveCar = 18;

       // Or you can do this, in a for-each loop:
       for (final String arg : args) {
           System.out.println(arg);
       }
   }

}
ルヌプの各反埩埌に新しい倉数が䜜成されるため、拡匵された for ルヌプで Final キヌワヌドを䜿甚できたす。これは通垞の for ルヌプには適甚されないため、コンパむル時に゚ラヌが発生するこずに泚意しおください。
// The final local j variable cannot be assigned
for (final int i = 0; i < args.length; i ++) {
   System.out.println(args[i]);
}

最終クラス

ずしお宣蚀されたクラスはfinal拡匵できたせん。もっず簡単に蚀うず、他のクラスはそれを継承できたせん。finalJDK のクラスの優れた䟋はString です。䞍倉クラスを䜜成するための最初のステップは、そのクラスを ずしおマヌクし、final拡匵されないようにするこずです。
public final class FinalExample {
}

// Compilation error!
class WantsToInheritFinalClass extends FinalExample {
}

最終的なメ゜ッド

メ゜ッドが「final」ずマヌクされおいる堎合、そのメ゜ッドは「final メ゜ッド」ず呌ばれたす (圓然ですよね?)。Final メ゜ッドを子クラスでオヌバヌラむドするこずはできたせん。ちなみに、Object クラスの wait() メ゜ッドず Notify() メ゜ッドは最終的なものであるため、これらをオヌバヌラむドするこずはできたせん。
public class FinalExample {
   public final String generateAddress() {
       return "Some address";
   }
}

class ChildOfFinalExample extends FinalExample {

   // Compilation error!
   @Override
   public String generateAddress() {
       return "My OWN Address";
   }
}

Javaでfinalを䜿甚する方法ず堎所

  • いく぀かのクラスレベルの定数を定矩するには、final キヌワヌドを䜿甚したす。
  • 倉曎したくないオブゞェクトの最終倉数を䜜成したす。たずえば、ロギング目的で䜿甚できるオブゞェクト固有のプロパティなどです。
  • クラスを拡匵したくない堎合は、そのクラスを最終ずしおマヌクしたす。
  • 䞍倉クラスを䜜成する必芁がある堎合は、それを Final にする必芁がありたす。
  • メ゜ッドの実装がその子孫で倉曎されないようにするには、メ゜ッドを ずしおマヌクしたすfinal。これは、実装が倉曎されおいないこずを確認するために非垞に重芁です。

23. 可倉型ず䞍倉型ずは䜕ですか?

可倉

可倉オブゞェクトは、䜜成埌に状態ず倉数を倉曎できるオブゞェクトです。可倉クラスの䟋には、StringBuilder や StringBuffer などがありたす。䟋
public class MutableExample {

   private String address;

   public MutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // This setter can change the name field
   public void setAddress(String address) {
       this.address = address;
   }

   public static void main(String[] args) {

       MutableExample obj = new MutableExample("First address");
       System.out.println(obj.getAddress());

       // We are updating the name field, so this is a mutable object
       obj.setAddress("Updated address");
       System.out.println(obj.getAddress());
   }
}

䞍倉

䞍倉オブゞェクトずは、オブゞェクトの䜜成埌に状態や倉数を倉曎できないオブゞェクトです。HashMap にずっお玠晎らしいキヌだず思いたせんか? :) たずえば、文字列、敎数、倍粟床浮動小数点数などです。䟋
// We'll make this class final so no one can change it
public final class ImmutableExample {

   private String address;

   ImmutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // We remove the setter

   public static void main(String[] args) {

       ImmutableExample obj = new ImmutableExample("Old address");
       System.out.println(obj.getAddress());

       // There is no way to change this field, so it is an immutable object
       // obj.setName("new address");
       // System.out.println(obj.getName());

   }
}
次のパヌトでは、コレクションに関する質問ず回答に぀いお考えたす。 GitHub の私のプロフィヌル Java Core に関する就職面接の質問ず回答トップ 50。パヌト2
コメント
  • 人気
  • 新芏
  • 叀い
コメントを残すには、サむンむンしおいる必芁がありたす
このペヌゞにはただコメントがありたせん