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

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

ランダム グループに公開済み
こんにちは!特別な訓練なしに飛行機の操縦方法を学ぶのが不可能であるのと同様に、必要な理論的基礎を長時間かけて勉強しないと Java 開発者になることはできません。そして、それがまさに今日私たちが取り組むことです。私たちは Java 開発者の就職面接で遭遇する質問を引き続き調査し、もちろん答えを見ていきます。この概要の前半後半 は次のとおりです。これらの質問をすべてしなくても、優れた Java 開発者になれることは間違いありません。とはいえ、Java の複雑さをすべてよく理解していれば、間違いなく有利になり、将来の雇用主の目にはより魅力的に映るでしょう。 Java 開発者の職の面接での質問と回答を調査します。 パート 3 - 1

20. カプセル化を可能にする言語の要素は何ですか?

カプセル化とは、クラスの実装の詳細を隠すことであることを思い出してください。言い換えれば、クラスが使用されるとき、その内部と内部ロジックは部外者には明らかではありません。そして、言語のどの要素がこれに関与しているのでしょうか? もちろんアクセス修飾子です。隠す必要があるものはすべて、private修飾子でマークします。たとえば、クラスのプライベート フィールドや、内部機能の実装に役立つ内部メソッドなどです。また、外部アクセスを提供したいものには、publicアクセス修飾子を追加します。たとえば、いくつかの機能 (内部で多くのプライベート メソッドを使用する可能性がある) を実装するメソッド、またはもちろん、クラスのプライベート フィールドにアクセスするためのゲッターとセッターです。デフォルト修飾子と保護された修飾子についてはまだ言及していませんが、これらはより柔軟に使用でき、特定のクラス部分へのアクセスを具体的にカスタマイズできます。

21. 言語のどの要素が継承を可能にしますか?

継承は、別のクラスに基づいてクラスを作成できるようにするメカニズムです。Java にはこのためのextendsキーワードがあります。たとえば、Catクラスがあり、 Lionの子クラスを作成するとします。コードでは次のようになります。
public class Lion extends Cat
これは、Lionクラスが静的変数を除くCatクラスのすべてのメソッドと変数を継承することを意味します。継承を担当する言語のもう 1 つの要素はsuperです。これと同様のリファレンスです。thisキーワードは、それが参照されているオブジェクトを参照します。superキーワードは、現在のオブジェクトの親を参照します。通常はsuperが使用されます。
  1. スーパークラスのコンストラクターを呼び出すため。たとえば、Catクラスには、コンストラクターで初期化する必要がある内部名変数があります。Lionクラスのコンストラクターでは、次のようになります。

    public Lion(final String name) {
       super(name);
    }

  2. 親のフィールドとメソッドを参照します。たとえば、Catクラスには、初期化された年齢フィールドがあります。

    public class Cat {
       int age = 10;

しかし、 Lionにも同じ初期化されたフィールドがあります。
public class Lion extends Cat {
   int age = 15;
そして、Lionオブジェクトで親オブジェクトのage変数を参照したい場合は、 superを使用してそれを行う必要があります。
super.name

22. ポリモーフィズムの原因となる言語の要素は何ですか?

ポリモーフィズムとは、1 つのシグネチャを持つオブジェクトがさまざまな形式 (多数の実装) を取ることができる機能です。 Java のimplements キーワードextendsキーワードがポリモーフィズムの原因であるJava 開発者の職の面接での質問と回答を調査します。 パート 3 - 2と自信を持って言えます。インターフェイスがある場合、implements を使用すると、可能な実装を 1 つ提供できますが、それが唯一の実装である必要はありません。implements を使用することがどのようなものかをもう一度見てみましょう。
public class Cat implements Animal
次に、Catクラスで、 Animalインターフェイスのすべての抽象メソッドを実装する必要があります。継承も同様です。子クラスでは、メソッドの既存の実装をオーバーライドできます。これは、複数の子クラスを使用すると、同じメソッドの複数の異なるオーバーライドができることを意味します。または、スーパークラスは抽象クラスであり、その子クラスのそれぞれに特別な方法で実装する必要がある特定のメソッドを持つ場合もあります。言い換えれば、このメソッドにはさまざまな実装が可能になります。@Overrideアノテーションもこれに役立ちます。これは実装されたメソッドの上に配置され、スーパークラスまたはインターフェイスの特定のメソッドを実装またはオーバーライドすることを示します (実装がスーパークラスにすでに存在する場合)。これはオプションであり、エラーをより簡単に検出するのに役立ちます。このアノテーションを使用して、スーパークラス/インターフェイス メソッドをオーバーライド/実装することをコンパイラーに伝えます。コンパイラは、メソッドのシグネチャに間違いがないことを確認します。

23.ソリッドとは何ですか?例を提供する

SOLID は、Robert Martin の 5 つの基本的な OOP 設計原則の頭字語です。 S (単一責任原則) : クラスは 1 つの目的/責任のみを持つべきであると述べています。言い換えれば、すべてを実行するクラスを作成すべきではありません。そうすると、「God Object」のアンチパターンが再現される可能性があります。Catオブジェクトがある場合、その内部機能と対話するためのメソッドのみを含める必要がありますが、そのインスタンスに関係のないビジネス ロジックを含めるべきではありません。たとえば、このタイプのオブジェクトを保存するためのメカニズムなどです。この機能 ( Catのエンティティの外部) は、対応するオブジェクトにビジネス ロジックを提供することをタスクとする他のクラスまたはサービスに移動する必要があります。 O (オープンクローズ原則) : この原則は次のように説明されます: ソフトウェア エンティティ (クラス、モジュール、関数など) は拡張に対してオープンである必要がありますが、変更に対してはクローズされている必要があります。たとえば、既存のCatクラスの機能と似ているが、少し異なる機能が必要だとします。Catクラスの機能を変更して、既に使用されているコードを破壊する代わりに、継承または合成を 使用できます。このようにして、 Catクラスの機能を変更するという目標を達成しました。これは、クラス自体を変更せず、何も壊すことなく変更を行います。 L (リスコフ置換原理) : これはバーバラ・リスコフの置換原理です。この原則では、基本型を受け取る関数は、何が起こっているかを知らなくても、その基本型のサブタイプを使用できる必要があると述べています。たとえば、Catクラスは、その動作を根本的に変更することなく、その子孫 (たとえばLion )のいずれかに置き換えることができる必要があります。一般的なロジック (動作) は変わりませんが、特定の機能の実装の詳細が変更されます。 I (インターフェース分離原則) : この原則は、1 つの汎用インターフェースよりも、多くの特殊化された (焦点が絞られた) インターフェースを持つほうが良いと述べています。たとえば、開発者が何らかのインターフェイスを実装するとします。必要なのはそのメソッドの 1 つだけですが、インターフェイスには、必要なメソッドのロジックに関連しないさらに 9 つのメソッドがあります。この場合、開発者は 10 個のインターフェース メソッドを実装する必要がありますが、そのうち 9 個は開発者にとって不要です。代わりに、必要に応じて実装できる 10 個の異なるインターフェイスを作成する方が良いでしょう。そうですね、10 ではないにしても、いくつかのメソッドがあり、それぞれがインターフェイスの 1 つの目的に密接に関連したメソッドを備えています。 D (依存関係逆転の原理): 原則は、上位レベルのモジュールが下位レベルのモジュールに依存すべきではないということです。この原則はまた、「抽象化は詳細に依存すべきではない。詳細は抽象化に依存すべきである」とも述べています。インターフェイスを参照してロジックを構築し、必要なインターフェイスを実装するクラスの具体的なオブジェクトを渡す必要があります。たとえば、Catインターフェースといくつかの実装 ( LionHouseCat など) があるとします。Catインターフェイスと対話するために特別にロジックを構築します。その後、インターフェースを特定の実装 ( LionまたはHouseCat )に置き換えるだけですが、その逆は行いません。

24. クラス、オブジェクト、インターフェイスとは何ですか?

Java が OOP 言語であることを思い出してください。つまり、Java プログラムはオブジェクト間の対話に基づいて構築されます。プログラムは蟻塚のようなもので、それぞれの蟻がオブジェクトです。 Java 開発者の職の面接での質問と回答を調査します。 パート 3 - 3オブジェクトは、この内部データと対話するためのさまざまなメソッド (関数) を含むデータのコレクションです。 クラスは、オブジェクトを作成するための命令またはテンプレートです。これは、同じ命令に従って構築された多数のオブジェクトを異なる (または同じ) データで埋めることができることを意味します。現実の例を挙げると、クラスは建物の設計図であり、オブジェクトはその設計図に従って特別に構築された建物であると言えます。 インターフェイスはクラスに似ていますが、インターフェイスを使用してオブジェクトを作成することはできません。その目的は、Java に抽象化を追加することです。より正確には、クラスとオブジェクト間の関係に柔軟性を加えます。柔軟性とは、前述したポリモーフィズムと抽象化を意味し、アプリケーションの内部アーキテクチャを構築するための多くの機会を生み出します。

25. POJOクラスとは何ですか? そのようなクラスの例を挙げてください

Java 開発者の職の面接での質問と回答を調査します。 パート 3 ~ 4POJO (Plain Old Java Object) は、特定のクラスを継承せず、ビジネス モデルに必要なサービス インターフェイスを超えるサービス インターフェイスを実装しない単純なクラス オブジェクトです。言い換えれば、POJOクラスは特別な要件を持たない単なるクラスです。唯一の要件は、特定のフレームワークに関連付けられたさまざまな付加機能がないことです。原則として、これらのクラスは他のクラスを継承せず (同じパッケージ内のPOJOクラスを除く)、インターフェイスを実装せず ( SerializableCloneableなどの標準ライブラリからのマーカー インターフェイスについては例外が発生する場合があります)、アノテーションを使用しません。 、サードパーティのライブラリに依存しません。POJOには、あらゆる種類のビジネス ロジックとコンストラクターを含むメソッドを含めることができることに注意してください。クラスのセマンティクスを変更しないアノテーション (つまり、存在しなくてもオブジェクトの目的やロジックが変更されないアノテーション) を許可する場合、 POJO には XML またはJSONからシリアル化されたJPAエンティティおよびDTOオブジェクトも含めることができます。そのルールは次のとおりです。注釈で指定されています。POJOクラスに関して留意すべきもう 1 つの点は、そのequals メソッドhashCodeメソッドをオーバーライドすると、その役割をより適切に果たせるようになるため、オーバーライドすることをお勧めします。POJOクラスの例:
public class User {
   private Long id;
   private String firstName;
   private String lastName;
   private Long age;

   public User(final Long id, final String firstName, final String lastName, final long age) {
       this.id = id;
       this.firstName = firstName;
       this.lastName = lastName;
       this.age = age;
   }

   public Long getId() {
       return this.id;
   }

   public String getFirstName() {
       return this.firstName;
   }

   public String getLastName() {
       return this.lastName;
   }

   public Long getAge() {
       return this.age;
   }

   @Override
   public boolean equals(final Object o) {
       if (this == o) return true;
       if (o == null || this.getClass() != o.getClass()) return false;
       final User user = (User) o;
       return Objects.equals(this.id, user.id) &&
               Objects.equals(this.firstName, user.firstName) &&
               Objects.equals(this.lastName, user.lastName) &&
               Objects.equals(this.age, user.age);
   }

   @Override
   public int hashCode() {
       return Objects.hash(this.id, this.firstName, this.lastName, this.age);
   }
}

26. クラスにはどのような要素を含めることができますか?

クラスには次の要素を含めることができます。
  • インスタンスフィールド。
  • 静的フィールド。
  • 初期化ブロック。
  • 静的初期化ブロック。
  • コンストラクター (空のコンストラクターはデフォルトで常に宣言されます)。
  • メソッド。
  • 静的メソッド。
  • さまざまなアノテーション (クラス自体またはその構成部分に適用できます)。
  • ジェネリックス ;
  • 他のクラスの継承 ( extends ) またはインターフェイスの実装 ( implements )。

27. Java の継承について教えてください。スーパーキーワードの詳細は何ですか?

上記では、Java の継承とsuperキーワードについて説明しました。さらに重要な点をいくつか挙げておきます。
  1. 継承できるクラスは 1 つだけです。Java には多重継承がありません。Java 8 でデフォルトのメソッドが登場すると、この記述は非常に物議を醸すことになるでしょう。
  2. プライベート メソッドとフィールドも継承されます。これらは単に子クラスからアクセスすることはできません (ただし、たとえばプライベート フィールドがあり、パブリックまたは保護されたゲッターとセッターがある場合は、それらを使用してフィールドにアクセスできます)。
  3. 最終クラスは継承できません。
  4. Finalメソッドはオーバーライドできません (ただし、継承およびオーバーロードは可能です)。
  5. 静的メソッドと変数は継承されません (オブジェクトではなくクラスにアタッチされているため)。
  6. 抽象クラスを継承する場合、その抽象メソッドを実装するか、子クラスも抽象として宣言する必要があります。
  7. 親にデフォルト以外のコンストラクターがある場合は、子クラスでオーバーライドする必要があります (ただし、それらの上に@Overrideは記述されません)。
  8. アクセス修飾子を子クラスのオーバーライドされたメソッドに拡張できます ( private -> default -> protected -> public )
  9. 子クラスでオーバーライドされるメソッドは、より狭い例外 (例: Exception -> IOException -> FileNotFoundException) をスローする可能性があります。
Java 開発者の職の面接での質問と回答を調査します。 パート 3 ~ 5

28. メソッド シグネチャとは何ですか? 正しい署名と間違った署名の例を提供する

メソッド シグネチャは 、メソッドの名前に入力パラメータの型を加えたものです (パラメータの順序は重要です)。メソッドのシグネチャには、メソッドがスローする戻り値や例外は含まれません。正しい署名の例:
doSomething(int, double, double)
間違った署名の例:
void doSomething(int firstArg, int secondArg) throws Exception
メソッド シグネチャは、戻り値の型とスローされる例外のリストと組み合わされて、メソッド コントラクトと呼ばれます。それが今日のすべてです!また後で!
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION