JavaRush /Java Blog /Random-JA /Java開発者へのインタビューからの質問と回答の分析。パート 3
Константин
レベル 36

Java開発者へのインタビューからの質問と回答の分析。パート 3

Random-JA グループに公開済み
こんにちは!特別な訓練なしに飛行機の操縦を学ぶのが不可能であるのと同様に、必要な理論的基礎を長時間かけて勉強せずに Java 開発者になることも不可能です。今日、私たちはまさにこれに取り組みます。Java 開発者に対する250 を超える面接の質問と、それに応じた回答の分析を続けます。ここでは、分析の前半部分後半部分を紹介します。はい、もちろん、これらの質問をすべてしなくても優れた Java 開発者になることができます。ただし、Java 言語を隅から隅までよく理解していれば有利になり、将来の雇用主にとってより望ましい候補者となります。Java開発者へのインタビューからの質問と回答の分析。 パート 3 - 1

20. カプセル化を担当する言語要素は何ですか?

ご存知のとおり、カプセル化はクラスの実装の詳細を隠します。つまり、クラスが外部で使用される場合、内部の内容とロジックは明らかではありません。そして、言語のどの要素がこれに関与しているのでしょうか? 当然、修飾子にアクセスします。非表示にする必要があるものをprivate修飾子でマークします。たとえば、クラスのプライベート フィールドや、特定の内部機能の実装に役立ついくつかの内部メソッドなどです。そして、外部アクセスを提供したいものに、publicアクセス修飾子 を追加します。たとえば、いくつかの機能 (その中で多くのプライベート メソッドを使用できる) を提供するメソッド、またはクラスのプライベート フィールドにアクセスするための同じゲッターとセッターを提供します。ああ、デフォルト修飾子と保護された修飾子もあります。これを使用すると、クラスの選択された部分へのアクセスをより柔軟かつ具体的に構成できます。

21. 継承を担当する言語要素はどれですか?

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

    public Lion(final String name) {
       super(name);
    }
  2. 親フィールドとメソッドにアクセスするには: たとえば、Catクラスには、初期化されたageフィールドがあります。

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

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

ポリモーフィズムは、1 つのシグネチャのオブジェクトがさまざまな形式 (複数の実装) を取ることができる機能です。Java では、 implements キーワードextendsJava開発者へのインタビューからの質問と回答の分析。 パート 3 - 2キーワードがポリモーフィズムの原因であると言って間違いありません。 実装- インターフェイスを作成するとき、その可能な形式の 1 つをクラスに実装しますが、それが唯一の形式ではありません。実装の実装がどのようなものかを思い出してみましょう。
public class Cat implements Animal
そして、Catクラスでは、 Animalインターフェイスで提供されるすべての抽象メソッドを実装する必要があります。継承についても同様です。子孫クラスでは、メソッドの既存の実装をオーバーライドできます。例: 複数の子孫 -> 同じメソッドの複数の異なるオーバーライド。スーパークラスは抽象クラスであり、その子孫ごとに特別な方法で実装する必要がある特定のメソッドを持っています。つまり、その手法には様々な形態があると言えます。また、 @Overrideアノテーションは this に役立ちます。これは実装されたメソッドの上に配置され、スーパークラスまたはインターフェイスの 1 つまたは別のメソッドを実装またはオーバーライドすることを示します (実装がスーパークラスにすでに存在する場合)。これはオプションであり、エラーを検出しやすくするために使用されます。このアノテーションを使用すると、スーパークラス/インターフェイス メソッドをオーバーライド/実装することをコンパイラーに示し、メソッドのシグネチャで間違いを犯さないことが保証されます。

23.ソリッドとは何ですか? 例を上げてください

SOLID は、Robert Martin が考案した OOP の 5 つの基本設計原則の頭字語です。 S - 単一責任の原則- クラスは 1 つの目標と 1 つの目的のみを持つべきであるという単一責任の原則。つまり、すべてを実行するクラスを作成すべきではありません。この場合、「Divine Object」のアンチパターンを再現できます。Catオブジェクトがある場合は、その内部機能とのみ対話するメソッドを含める必要があり、このインスタンスに関係のないビジネス ロジックは含めないでください。たとえば、このタイプのオブジェクトをどこかに保存するなどです。この外部機能 ( Catに関連) は、他のクラス (このタイプのオブジェクトにビジネス ロジックを提供することをタスクとする一部のサービス) に転送する必要があります。 O - オープンクローズド原則- オープン/クローズの原則。これは、ソフトウェア エンティティ (クラス、インターフェイス) は拡張に対してオープンである必要があるが、変更に対してはクローズされる必要があることを意味します。たとえば、既存のCatクラスの機能と似ていますが、少し異なる機能が必要でした。Catクラスの機能を変更して、すでに使用されている場所を壊す代わりに、継承または合成を使用します。結果として、Catクラスの機能を変更することで目標を達成しましたが、同時にそれを変更したり、何も壊したりすることはありませんでした。 L - リスコフ置換原理- バーバラ・リスコフの置換原理。この原則では、基本型を使用する関数は、意識せずに基本型のサブタイプを使用できる必要があると規定されています。たとえば、 Catクラスは、動作を根本的に変更することなく、その子孫のいずれかと、たとえばLion と交換可能である必要があります。一般的なロジック (動作) は変わりませんが、特定の機能の実装の詳細は変更されます。 I - 界面分離原理- 界面分離の原理。この原則は、1 つの汎用インターフェースよりも、多くの特殊な (焦点を絞った) インターフェースを持つ方が良いと述べています。たとえば、ユーザーが何らかのインターフェイスを実装し、その中で必要なのはこのメソッドだけですが、このインターフェイスには、目的のメソッドのロジックとは何の関係もないさらに 9 つのメソッドがあります。この場合、ユーザーは 10 個のインターフェース メソッドを実装する必要がありますが、そのうち 9 個はユーザーにとって不要です。代わりに、必要に応じて実装できる 10 個の異なるインターフェイスを作成する方が良いでしょう。そうですね、10 ではなく、いくつかのインターフェイスの共通の目的に密接に関連するメソッドがあります。 D - 依存関係逆転の原則— 依存関係逆転の原理。この原則では、より高いレベルのモジュールがより低いレベルのモジュールに依存すべきではないと述べています。この原則は、「抽象化は詳細に依存すべきではなく、詳細は抽象化に依存すべきである」とも説明されています。つまり、インターフェイスを参照してロジックを構築し、その後でのみ特定のオブジェクトをこの機能に渡し、そのクラスが必要なインターフェイスを実装する必要があります。たとえば、Catインターフェイスとその実装の一部 (たとえば、LionHomeCat )がある場合、特にCatインターフェイス タイプを使用して対話ロジックを構築し、その場合にのみLionまたはHomeCatの特定の実装を置き換えますが、その逆は行いません。

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

覚えているとおり、Java は OOP 言語です。つまり、Java プログラムはオブジェクト間の対話に基づいて構築されます。このプログラムは蟻塚のようなもので、それぞれの蟻がオブジェクトであることがわかりました。Java開発者へのインタビューからの質問と回答の分析。 パート 3 - 3オブジェクトは、この内部データと対話するためのさまざまなメソッド (関数) を含むグループ化されたデータです。そしてクラスはオブジェクトを作成するための命令、テンプレートです。つまり、同じ命令に従って構築され、異なるまたは同一のデータ値が埋め込まれたオブジェクトが多数存在する可能性があります。人生の例を挙げると、クラスは建物の図面であり、オブジェクトはこの図面に基づいて特別に作成された建物であると言えます。 インターフェイスはクラスに似ていますが、インターフェイスを使用してオブジェクトを作成できない点が異なります。彼らの目標は、Java に抽象化の要素を追加することです。より正確には、クラスとオブジェクト間の関係に柔軟性を加えるためです。柔軟性とは、前述のポリモーフィズムと抽象化を意味し、アプリケーションの内部アーキテクチャを構築するための多くの機会が開かれます。

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

Java開発者へのインタビューからの質問と回答の分析。 パート 3 ~ 4POJO - Plain Old Java Object - 古き良き Java オブジェクト: 特定のクラスから継承されず、ビジネス モデルに必要なサービス インターフェイスを超えるサービス インターフェイスを実装していないクラスの単純なオブジェクト。言い換えれば、 POJOクラスは特別な要件を持たない単なるクラスです。唯一の要件は、特定のフレームワークに関連付けられたさまざまな付加機能がないことです。原則として、そのようなクラスは他のクラスから継承せず (同じパッケージのPOJOクラスを除く)、インターフェイスを実装しません。SerializableCloneableなどの標準ライブラリからのマーカー インターフェイスについては例外が発生する場合があります。 注釈は使用しません。サードパーティのライブラリに依存しません。ただし、POJO にはビジネス ロジックを含むメソッドやあらゆる種類のコンストラクターを含めることができることに注意してください。クラスのセマンティクスを変更しないアノテーションを許可する場合 (オブジェクトの目的と操作のロジックは変更されません)、POJO には、 XMLまたはJSONから逆シリアル化されたJPAエンティティ エンティティおよびDTOオブジェクトも含めることができます。ルールは注釈で指定されます。POJOクラスのequalshashCodeをオーバーライドすることもお勧めします。これにより、役割をより適切に実行できるようになります。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
メソッド シグネチャは、戻り値の型とスローされる例外のリストと組み合わされて、メソッド コントラクトと呼ばれます。それが今日のすべてです。また後で!Java開発者へのインタビューからの質問と回答の分析。 パート 3 ~ 6
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION