CodeGym /Java Blog /ランダム /Java 開発者の職の面接での質問と回答を調査します。パート5
John Squirrels
レベル 41
San Francisco

Java 開発者の職の面接での質問と回答を調査します。パート5

ランダム グループに公開済み
やあやあ!Java 開発者は現在、大きな需要があります。もちろん、あなたに求人を紹介することはできませんが、新しい知識を獲得し、ギャップを埋めるお手伝いをしたいと思います。それでは、Java 開発者の面接の質問のレビューを続けましょう。記事の最後にレビューの前の部分へのリンクがあります。 Java 開発者の職の面接での質問と回答を調査します。 パート5-1

39. Java のアクセス修飾子とは何ですか? 名前を付けてください。それらは何に使われますか?

以前、カプセル化を実現するために使用される Java の要素に関する質問でアクセス修飾子について説明しました。それでも、思い出させてもらいます。Java のアクセス修飾子は、特定の Java コンポーネントに付与されるアクセスのレベルを記述するキーワードです。次のアクセス修飾子が存在します。
  • public — この修飾子でマークされた要素は public です。つまり、フィールドとメソッド、および public 修飾子を使用して宣言されたクラスは、独自のパッケージと外部パッケージの両方で他のクラスから参照できます。
  • protected — この修飾子でマークされた要素は、現在のパッケージ内の独自のクラスまたは派生クラス (他のパッケージ内にある場合でも) のどこからでもアクセスできます。
  • アクセス修飾子が指定されていない場合、デフォルト(または修飾子がまったくない) が暗黙的に適用されます。これは、他のパッケージにある派生クラスで表示される点を除いて、前のものと似ています。
  • private — これはすべての修飾子の中で最もプライベートです。現在のクラス内の要素のみにアクセスできます。

40. 静的メソッドと非静的メソッドの主な機能に名前を付けます

主な違いは、静的メソッドがクラスに属していることです。実際、このクラスのインスタンスを作成する必要はありません。静的メソッドはクラス型からのみ呼び出すことができます。たとえば、猫を撫でるための静的メソッドがあるとします。
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Pet the cat: " + cat.getName());
   }
これを呼び出すために CatServiceクラス のインスタンスは必要ありません。
Cat cat = new Cat(7, "Bobby");
CatService.petTheCat(cat);
対照的に、通常のメソッドはオブジェクトにバインドされます (属します)。これらを呼び出すには、メソッドが呼び出されるインスタンス (オブジェクト) が必要です。たとえば、猫に非静的メソッドmeow() があるとします。
class Cat {
   public void meow() {
       System.out.println("Meow! Meow! Meow!");
   }
このメソッドを呼び出すには、猫の特定のインスタンスが必要です。
Cat cat = new Cat(7, "Bobby");
cat.meow();

41. 静的メソッドと非静的メソッドに適用される主な制限は何ですか?

前に述べたように、通常の (非静的) メソッドの主な制限は、メソッドが呼び出されるインスタンスが常に存在する必要があることです。ただし、静的メソッドではこれは必要ありません。さらに、静的メソッドでは、メソッドの現在のオブジェクトが存在するため、オブジェクトの要素への this参照を使用できません。

42. static キーワードは何を意味しますか? 静的メソッドはオーバーライドまたはオーバーロードできますか?

staticキーワードでマークされた要素は、クラスのインスタンスではなく、クラス自体に属します。クラス自体がロードされるときにロードされます。静的要素はプログラム全体で同じですが、非静的要素は特定のオブジェクトでのみ同じです。次の要素は静的にすることができます。
  • クラスのフィールド。
  • クラスの初期化ブロック。
  • クラスのメソッド。
  • クラスのネストされたクラス (もちろん、これもトートロジーです)。
静的メソッドはオーバーライドできません。静的メソッドはクラスに属し、継承されませんが、同時にオーバーロードすることができます。

43. メソッドは静的であると同時に抽象的であることはできますか?

これについては、以前の記事ですでに回答しました。メソッドは抽象的であると同時に静的であることはできません。メソッドが抽象メソッドである場合、それは子クラスでオーバーライドする必要があることを意味します。ただし、静的メソッドはクラスに属しているため、オーバーライドできません。これにより矛盾が生じ、コンパイラーはそれに気づき、怒ることになります。このような状況に陥った場合は、アプリケーションのアーキテクチャが正しいかどうか真剣に検討する必要があります (ヒント: 明らかに何かが間違っています)。 Java 開発者の職の面接での質問と回答を調査します。 パート5-2

44. 静的メソッドを非静的メソッドの途中で使用できますか? およびその逆?なぜ?

静的メソッドを非静的メソッドで使用できます。それを妨げるものは何もありません。ただし、その逆は不可能です。静的メソッドは、クラスの特定のインスタンスを参照せずに非静的メソッドを使用できません。クラスの静的メンバーはthis参照にアクセスできないことに注意してください。クラスの具象オブジェクトは好きなだけ持つことができ、それぞれに自己参照であるthis参照が含まれます。では、どの参照を使用するかを決定するにはどうすればよいでしょうか? ええと、そうではありません。そのため、静的要素は、特定のオブジェクトへの参照がなければ、非静的要素を参照できません。基本的に、静的メソッドは、特定のオブジェクトへの参照がある場合にのみ、非静的メソッドを使用できます。たとえば、メソッドの引数として入力されたものは次のとおりです。
public static void petTheCat(Cat cat) {
   System.out.println("Pet the cat: " + cat.getName());
}
ここでは、静的petTheCat()メソッドが、 Catオブジェクトの通常の非静的メソッドであるgetNameを呼び出していることがわかります。

45. インターフェースとは何ですか? 最終的なインターフェースは存在するのでしょうか?

Java には多重継承がないことを思い出してください。インターフェースはそれに代わるものです。インターフェイスは、非常に無駄を省いたクラスのようなものです。これらは機能を定義しますが、具体的な実装は定義しません。そのタスクは、これらのインターフェイスを実装するクラスに任されます。インターフェースの例:
public interface Animal {
    void speak();
}
クラスによるインターフェースの実装例
class Cat implements Animal {

   @Override
   public void speak() {
       System.out.println("Meow! Meow! Meow!");
   }
}
インターフェイスの使用に関して知っておくべき重要な主な事項は次のとおりです。
  1. インターフェイス メソッドにはヘッダーのみを含める必要があります。それらは特定のメソッド本体を持ってはなりません。つまり、抽象的である必要があります (ただし、 abstractキーワードは使用しません)。例外として、メソッド本体が必要な静的メソッドとデフォルト メソッドがあります。

  2. クラスは多くのインターフェイスを実装できます (前述したように、インターフェイスは多重継承の代替手段です)。インターフェイス名はメソッド ヘッダー内でカンマで区切られます。class Lion は Animal, Wild を実装します

  3. インターフェイスは、 interfaceキーワードを使用して作成されます。

  4. クラスがインターフェイスを実装する場合、implementsキーワードを使用します。

  5. 特定のインターフェイスを実装するクラスは、その抽象メソッドをすべて実装するか、それ自体を抽象メソッドとして宣言する必要があります。

  6. インターフェイスを使用する主な目的は、ポリモーフィズムを実装することです (オブジェクトにさまざまな形式を取る能力を与えること)。

  7. 原則として、メソッドのアクセス修飾子はインターフェイスには示されません。これらはデフォルトでpublicであり、 public以外の修飾子を指定することはできません。Java 9 以降では、メソッドでプライベート修飾子を使用できるようになりました。

  8. デフォルトでは、インターフェイス変数はstatic Finalです。言い換えれば、これらは定数です。常にインターフェイス内で直接初期化する必要があります。

  9. インターフェイスのインスタンスを作成することはできません。

インターフェースが最終的なものになり得るかどうかという質問に対する答えは、もちろん「ノー」です。実際、インターフェイスを持つことの重要な点は、インターフェイスを実装することです。そして、誰もがよく覚えているように、クラス レベルの最後の修飾子により、クラスは継承できなくなり、インターフェイスの場合は実装できなくなります。実装して使用できないインターフェースがなぜ必要なのでしょうか? おっしゃるとおりです。私たちはそうしません。そしてコンパイラもこれに同意します。:) Java 開発者の職の面接での質問と回答を調査します。 パート5-3実際には、Java 8 以降の静的インターフェイス メソッドの導入には意味があるかもしれませんが、インターフェイスを Final にできないという事実は変わりません。これは広範なトピックなので、インターフェイスについては非常に表面的にしか話しませんでした。詳細については、Java のインターフェイス に関する記事と、抽象クラスとインターフェイスの違いを 参照してください。

46. 静的フィールドはどこで初期化できますか?

静的フィールドは初期化できます。
  • 宣言直後に等号 ( = ) を使用します。
  • 静的初期化ブロック内。
  • 非静的初期化ブロック内 (ただし、オブジェクトが作成されるたびに、この初期化ブロックが実行されると静的フィールドが上書きされることを理解する必要があります。
  • クラスコンストラクター内。コンストラクターが呼び出されるたび (つまり、このコンストラクターを使用してオブジェクトが作成されるたび)、フィールドは上書きされます。
  • 静的メソッドの場合。
  • 非静的メソッドの場合。
  • 入れ子になった静的クラスと非静的クラス、ローカルな匿名クラス。

47. 匿名クラスとは何ですか?

匿名クラスは、独自の型を持たないクラスです。私は何を話しているのでしょうか?インターフェイスについて話したときに、オブジェクトのインスタンスは作成できないと述べました。作成できるのは、インターフェイスを実装するクラスのインスタンスのみです。クラスにインターフェイスを実装させたくないが、インターフェイスを実装するオブジェクトが必要な場合はどうすればよいでしょうか? そして、おそらくこれがオブジェクトの唯一の用途です。また、本格的な実装クラスを作成する必要はありません。どうやってやりますか?それは正しい!匿名クラスを使用することで! いくつかのAnimalJava 開発者の職の面接での質問と回答を調査します。 パート5 - 4インターフェースがあるとします。
public final interface Animal {
   public void speak();
}
匿名クラスを使用して特定のインターフェイスをインスタンス化する場合は、次のようにします。
Animal cat = new Animal() {
   @Override
   public void speak() {
       System.out.println("Meow! Meow! Meow!");
   }
};
その後、このオブジェクトとその実装されたspeech()メソッドを安全に使用できるようになります。言い換えれば、匿名クラスはインターフェイスとそのすべての抽象メソッドを今ここで実装します。そうしないと、実装されていない/抽象メソッドが存在するため、インターフェイス/抽象クラス オブジェクトを作成できません。前述したように、匿名クラスは、インターフェイスの抽象メソッドを実装するためだけでなく、抽象クラスの抽象メソッドを実装するためにも使用されます。このアプローチは、オブジェクトが 1 回使用される場合、または特定のメソッド実装が 1 回だけ必要な場合に適しています。必要な抽象クラス/インターフェイスを実装する別のクラスを作成する必要はありません。ただし、匿名クラスが仕事で使用されることはほとんどないことにも注意してください。原則として通常クラスが優先されます。匿名クラスの詳細については、この記事を 参照してください。

48. プリミティブクラスとは何ですか?

Java にはプリミティブ クラスのようなものが存在しないため、これは誤解を招く質問、おそらくひっかけの質問だと思います。存在するのは、以前に検討したプリミティブ型の概念のみです。Java には、 byteshortintlongfloatdoublecharbooleanの 8 つのプリミティブ型があることを思い出してください。

49. ラッパークラスとは何ですか?

Java でプリミティブ型を使用する場合の主な問題は、プリミティブ型がクラスではなく、Java が OOP 言語であることです。つまり、この言語で書かれたプログラムは、オブジェクト間の対話に相当します。しかし、プリミティブはオブジェクトではありません。これらには、 Objectクラスの標準メソッドであってもメソッドがありません。しかし、マップ内のキーとしてプリミティブを使用する必要がある場合はどうすればよいでしょうか? 次に、そのhashCode()メソッドを呼び出す必要があります。そこでそのquals()メソッドを呼び出すこともできます。じゃあ何?プリミティブではなくクラスが必要になる瞬間がたくさんあります。これにより、プリミティブは OOP の概念そのものに違反するため、プログラム内で使用できなくなり、望ましくない要素になります。しかし、状況は思ったほど悪くはありません。結局のところ、Java にはプリミティブ ラッパーの概念があります。Java では、すべてのプリミティブ型に 1 つのツイン、つまりラッパー クラスがあります。
  • バイト-> Byte.class
  • short -> Short.class
  • int -> Integer.class
  • ロング-> Long.class
  • float -> Float.class
  • double -> Double.class
  • 文字->文字.クラス
  • ブール値-> Boolean.class
これらの型は単純な型を表しますが、多様で便利なメソッドを多数備えた本格的なクラスになります。オートボックス化とアンボックス化の概念は、これらのクラスを便利に使用できるようにするために導入されました。 オートボックス化は、必要に応じて、プリミティブ型をその類似クラスに自動的に変換することです (たとえば、intからIntegerへの変換)。 アンボックス化はその逆のプロセスです。つまり、プリミティブ ラッパー クラスからプリミティブ型への自動変換 (たとえば、Integerからintへの変換) です。プリミティブ ラッパー クラスとオートボックス化およびボックス化解除プロセスの導入のおかげで、プリミティブ型は OOP 言語としての Java の本格的なメンバーになりました。 Java 開発者の職の面接での質問と回答を調査します。 パート5 - 5このトピックについてさらに詳しく説明するには、この記事 を読むことを強くお勧めします。

50. 入れ子クラスとは何ですか? どこで使われていますか?

ネストされたクラスは、それ自体が別のクラスのメンバーであるクラスです。Java には、これらのネストされたクラスが 4 種類あります。 1. 内部クラス この種類のクラスは、別のクラスの本体内で直接宣言されます。内部クラスは非静的ネストされたクラスであり、外部クラスのプライベート フィールドまたはインスタンス メソッドにアクセスできます。例として、シマウマという動物がいる動物園を作成してみましょう。
public class Zoo {
   class Zebra {
       public void eat(String food) {
           System.out.println("Zebra eats " + food);
       }
   }
}
複雑ではありませんね?内部クラスのインスタンスを作成する例を見てみましょう。
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.eat("apple");
すでに見たように、最初にそれを囲むクラスのオブジェクトを作成する必要があります。次に、オブジェクト参照を使用して内部クラスのインスタンスを作成します。また、内部クラス (非静的ネストされたクラス) は静的メソッドや静的フィールドを持つことができないことも指摘しておきます。これはまさに、内部クラスがその外部クラスのインスタンスに暗黙的に関連付けられているため、内部クラス内で静的メソッドを宣言できないためです。 2. 静的ネストされたクラス これらのクラスは前のカテゴリに似ていますが、クラス宣言にstaticアクセス修飾子が含まれています。この種のクラスは外部クラスの非静的フィールドにアクセスできないため、内部クラスというよりも外部クラスの静的部分のように見えます。ただし、このクラスは、プライベート メンバーも含め、外部クラスのすべての静的メンバーにアクセスできます。静的ネストされたクラスの例:
public class Zoo {
   static class Zebra {
       public void eat(String food) {
           System.out.println("Zebra eats " + food);
       }
   }
}
前のものとは少し異なる方法で作成されています。
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.eat("apple");
ここでは、静的ネストされたクラスのオブジェクトを作成するために外部クラスのオブジェクトは必要ありません。外部クラス内でネストされたクラスを見つけるには、ネストされたクラスの名前を知る必要があるだけです。 3. ローカル クラス ローカル クラスは、メソッドの本体内で宣言されたクラスです。ローカル クラスのオブジェクトは、それを囲んでいるメソッド内でのみ作成および使用できます。例:
public class Zoo {
   public void feed(String animal, String food) {
       switch(animal) {
           case "zebra":
               class Zebra {
                   public void eat(String food) {
                       System.out.println("Zebra eats " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.eat(food);
               ...
以下に例を示します。
Zoo zoo = new Zoo();
zoo.feed("zebra", "apple");
feed()メソッド のコードを見ていなかったら、ローカル クラスが存在することさえ疑わないでしょう? ローカル クラスはstaticまたはtransientにすることはできませんが、 abstractまたはFinalとしてマークすることはできます(これら 2 つの修飾子を同時に使用すると競合が発生するため、一方または他方を指定しますが、両方を指定することはできません)。 4. 匿名クラス 匿名クラスについては上ですでに説明しましたが、覚えているとおり、匿名クラスはインターフェイスとクラスという 2 つのソースから作成できます。 それらを使用する理由 ネストされた静的クラスと非静的クラスが使用されるのは、より一般的なクラスに小さなクラスを埋め込み、それらをまとめて保持し、より高い凝集性と共通の目的を持たせる方がよい場合があるためです。基本的に、ネストされたクラスを使用すると、コードのカプセル化を強化できます。クラスが単一のメソッド内で排他的に使用される場合は、ローカル クラスの使用を選択することもできます。この場合、コードをアプリケーション全体に分散する必要があるでしょうか? いいえ。とはいえ、私の経験上、ローカル クラスを使用している人を見たことがないことを付け加えておきます。なぜなら、ローカル クラスが必要かどうかは非常に議論の余地があるからです。インターフェイスまたは抽象クラスの特定の実装が 1 回だけ必要な場合は、匿名クラスを使用することがあります。その場合、実装を備えた本格的なクラスを別個に作成する必要はありません。代わりに、シンプルさを保ち、匿名クラスを使用して必要なメソッドを実装し、オブジェクトを使用したら、それを忘れました (もちろん、ガベージ コレクターは忘れませんでした)。ここの記事を読むと、ネストされたクラスについての理解が深まります。

51. クラスにはどのようなアクセス修飾子を含めることができますか?

さまざまなタイプのクラスがあり、さまざまなアクセス修飾子がそれらに適用されます。
  • 外部クラスにはpublicアクセス修飾子を指定することも、修飾子をまったく指定しないこともできます(デフォルトの修飾子)。
  • 内部クラス(非静的入れ子クラス) は、4 つのアクセス修飾子のいずれかを使用できます。
  • 入れ子になった静的クラスは、protectedを除くアクセス修飾子を 1 つ持つことができます。これは、この修飾子が継承を意味し、クラスの静的メンバーと矛盾するためです (静的メンバーは継承されません)。
  • ローカル クラスはデフォルトの修飾子のみを持つことができます (つまり、修飾子はまったくありません)。
  • 匿名クラスにはクラス宣言がないため、アクセス修飾子がまったくありません。
今日はこれで終わります。また近いうちにお会いしましょう!Java 開発者の職の面接での質問と回答を調査します。 パート 5 ~ 6
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION