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

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

Random-JA グループに公開済み
皆さん、こんにちは。今日も私はJava 開発者向けの250 以上の面接の質問を分析し続けています。Java開発者へのインタビューからの質問と回答の分析。 パート 4 - 1分析の前の部分: firstSecondthird。それでは続けましょう。

29. コンストラクターで return を使用することはできますか?

可能ですが、 returnの右側に戻り値はありません。つまり、return を使用できます。追加のコードの実行を緊急に終了 (中断) し、オブジェクトの初期化を完了するために、コンストラクターでの計算中に補助的な構造として使用されます。たとえば、クラスCatがあり、Cat がホームレスである場合 - isHomeless = true、初期化を完了し、他のフィールドに値を入力する必要はありません (結局のところ、猫はホームレスなので、これらのフィールドは私たちにはわかりません)。
public Cat(int age, String name, boolean isHomeless) {
   if (isHomeless){
       this.isHomeless = isHomeless;
       return;
   }
   this.isHomeless = isHomeless;
   this.age = age;
   this.name = name;
}
ただし、特定の値に関しては、次の理由により、コンストラクターは return を使用して値を返すことができません。
  • コンストラクターを宣言する場合、戻り値の型に似たものは何もありません。
  • 通常、コンストラクターはインスタンス化中に暗黙的に呼び出されます。
  • コンストラクターはメソッドではありません。コンストラクターはインスタンス変数を初期化することを唯一の目的とする別個のメカニズムであり、new演算子はオブジェクトの作成を担当します。
Java開発者へのインタビューからの質問と回答の分析。 パート4-2

30. コンストラクターから例外をスローすることはできますか?

コンストラクターはメソッドとまったく同じ方法で例外を処理します。また、メソッド ヘッダーにthrows <ExceptionType> を記述することでメソッドで例外をスローできる場合、コンストラクターによってこれが可能になります。また、継承コンストラクターを継承して定義するときに、例外の型を拡張することもできます。たとえば、IOException -> Exception (ただし、その逆はありません)。コンストラクターによって例外をスローする例として、Catクラスを考えてみましょう。作成時にコンソールから名前と年齢を入力するとします。
public Cat() throws IOException {
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   this.name = reader.readLine();
   this.age = Integer.parseInt(reader.readLine());
}
Reader.readLine() はIOException をスローする ため、スローされる可能性のある例外としてヘッダーで指定します。

31. クラスヘッダーはどのような要素で構成されていますか? 例を書いてください

クラスヘッダーを構成する要素について、小さな図を見てみましょう。
  • 必須コンポーネントは括弧 <> で囲みます。
  • オプション - {} 内
{クラス アクセス修飾子}{クラスの静的性}{クラスのファイナリティ}{クラスの抽象化} <クラス名>{親クラスからの継承} {インターフェース実装} つまり、 {class access modifier} - public修飾子と欠落しているアクセス修飾子 (つまり、default )のみが class で使用可能です。 {class static} - staticは、このクラスが静的であることを示す修飾子であり、内部クラス (他のクラス内のクラス) にのみ適用されます。 {クラスの最終性} - 覚えているとおり、これは最後の修飾子であり、この修飾子が存在するとクラスは継承できなくなります (ボックスの例 - String )。 {class abstraction} - modifier - abstract。このクラスに実装されていないメソッドがある可能性があることを示します。この修飾子は、 final修飾子と競合します。つまり、抽象修飾子は、指定されたクラスが継承され、その抽象部分が実装されることを意味するため、クラス ヘッダーに含めることができるのは 1 つだけです。そして、final は、これがクラスの最終 (最終) バージョンであり、継承できないことを示します。実際、両方の修飾子を同時に使用するのは不合理であり、コンパイラーはこれを許可しません。 <class>はクラス宣言を示す必須キーワードです。 <class name>は単純なクラス名で、特定の Java クラスの識別子です。完全修飾クラス名は、完全修飾パッケージ名 + で構成されます。+ 単純なクラス名。 {親クラスからの継承} - extendsキーワードを使用して親クラス (存在する場合) を指定します。たとえば、 .. はParentClass を拡張します{インターフェイス実装} - このクラスが実装するインターフェイス (存在する場合) を、implementsキーワードを使用して指定します。例: ... FirstInterface、SecondInterface を実装します... さて、クラス ヘッダーの例として、Catから継承し、 WildAnimalインターフェイスを実装するLionクラスのヘッダーを考えてみましょう。
public final class Lion extends Cat implements WildAnimal
Java開発者へのインタビューからの質問と回答の分析。 パート 4 - 3

32. メソッドヘッダーはどのような要素で構成されていますか? 例を書いてください

繰り返しになりますが、メソッド ヘッダーを構成する要素を確認するときは、次のような小さな図を考慮してください。
  • 必須コンポーネントは括弧 <> 内にあります
  • オプション - {} 内
{アクセス修飾子}{メソッド静的}{メソッド抽象化}{メソッドファイナリティ}{同期修飾子} {ネイティブ修飾子}<戻り値><メソッド名> <(> {メソッド引数} <)>{スローされた例外} {アクセス修飾子 } — このメソッドではすべてのアクセス修飾子が利用可能です: publicprotecteddefaultprivate{method static} - staticは、このメソッドが静的であること、つまりオブジェクトではなくクラスに関連付けられていることを示す修飾子です。 {method abstraction} は、メソッドの実装 (本体) が存在しないことを示すabstract修飾子です。正しく動作させるには、メソッドが提供されるクラスの抽象修飾子も必要です。クラスヘッダーと同様に、この修飾子はFinal modifier と競合しますが、それに加えてstatic modifier とも競合します。抽象メソッドは子孫内のメソッドをオーバーライドすることを意味し、静的メソッドはオーバーライドされません。 {メソッドの最終性} - Final - このメソッドをオーバーライドできないことを示す修飾子。 {synchronization modifier} - synchronized - このメソッドが異なるスレッドからの同時アクセスから保護されていることを意味する修飾子。メソッドが静的でない場合、オブジェクトのこのミューテックスを閉じます。メソッドが静的である場合、メソッドは現在のクラスのミューテックスで閉じます。 {ネイティブ修飾子} -ネイティブ- この修飾子は、メソッドが別のプログラミング言語で記述されていることを示します。 <戻り値> は、メソッドが返す値のタイプです。何も返さない場合は、void を指定します。 <メソッド名>はメソッドの名前、システム内でのその識別子です。 {メソッド引数} はメソッドが受け取る引数 (パラメータ) であり、メソッドの機能を実装するために必要です。 {スロー可能な例外} - throwsExceptionType - このメソッドがスローできるチェック済み例外のリスト。メソッドヘッダーの例として、これを示します。
public static void main(String[] args) throws IOException

33. 基本オブジェクトにデフォルトのコンストラクターが定義されていない場合は、子孫オブジェクトにデフォルトのコンストラクターを作成します (ただし、別のコンストラクターが定義されている場合)。

質問自体は完全には理解できませんが、おそらく、たとえば親にカスタム コンストラクターがあることを意味します。
public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
したがって、祖先クラスでは、親コンストラクターを埋める (呼び出す) コンストラクターを定義する必要があります。
public  class Lion extends Cat {

   public Lion(int age, String name) {
       super(age, name);
   }
}
Java開発者へのインタビューからの質問と回答の分析。 パート 4 - 4

34. this キーワードはいつ使用されますか?

Java では、これには2 つの異なる意味があります。1. this.age = 9のように、現在のオブジェクトへの参照として。つまり、thisは、 thisが呼び出されたオブジェクト、およびthis を使用するコードが参照するオブジェクトを指します。主な機能は、コードの可読性を高め、曖昧さを回避することです。たとえば、内部クラス フィールドの名前とメソッドの引数が同じ場合は、次のようになります。
public void setName(String name) {
   this.name = name;
}
つまり、this.name はオブジェクトのフィールドであり 、メソッドの引数であり、静的メソッドではthis参照を使用できません。2. this は、this(value)などのメソッド呼び出しの形式でコンストラクター内で使用できます。この場合、同じクラスの別のコンストラクターへの呼び出しになります。つまり、オブジェクトの作成時に 2 つのコンストラクターを同時に呼び出すことができます。
public Cat(int age, String name) {
   this(name);
   this.age = age;
}

public Cat(String name) {
   this.name = name;
}
Catオブジェクトが作成され、最初のコンストラクターが呼び出される とき、オブジェクトの両方のフィールドが呼び出され、正常に初期化されます。いくつかのニュアンスがあります。
  1. this() はコンストラクター内でのみ機能します。
  2. 別のコンストラクターへの参照は、コンストラクター ブロック (本体) の最初の行になければなりません。したがって、特定のクラスの複数の (他の) コンストラクターを 1 つのコンストラクターで呼び出すことはできません。
Java開発者へのインタビューからの質問と回答の分析。 パート 4 ~ 5他の例はこの記事にあります。

35. イニシャライザとは何ですか?

私の理解する限り、この質問では通常の統計的初期化ブロックについて話しています。まず、初期化とは何かを思い出してください。初期化とは、作成、起動、作業の準備、パラメータの決定です。プログラムまたはコンポーネントを使用可能な状態にすること。覚えているとおり、オブジェクトの作成中、クラス変数は宣言時に直接初期化できます。
class Cat {
   private int age = 9;
   private  String name = "Tom";
または、コンストラクターを介して外部から設定します。
class Cat {
   private int age;
   private  String name;

   public Cat(int age, String name) {
       this.age = age;
       this.name = name;
   }
しかし、別の方法もあります。初期化ブロックを通じて内部オブジェクト変数を設定する方法です。これは、クラス内で中括弧{ }のように見え、名前 (メソッドやコンストラクターなど) はありません。
class Cat {
   private int age;
   private  String name;

   {
       age = 10;
       name = "Tom";
   }
つまり、初期化ブロックは、オブジェクトの作成時にロードされるコードの一部です。通常、このようなブロックは、クラスをロードするときに必要な複雑な計算を実行するために使用されます。これらの計算の結果は、変数の値として指定できます。また、通常の初期化ブロックに加えて、見た目は同じですが、中括弧の前にstaticキーワードが含まれる静的な初期化ブロックもあります。
class Cat {
   private static int age;
   private static String name;

   static{
       age = 10;
       name = "Tom";
   }
このブロックは前のブロックとまったく同じです。ただし、各オブジェクトが初期化されるときに通常のものがトリガーされる場合、静的のものはクラスがロードされるときに 1 回だけトリガーされます。このようなブロックでは、原則として、後続の静的クラス変数の初期化のためにいくつかの複雑な計算も実行されます。静的ブロックには、静的メソッドと同じ制限が適用されます。静的でないデータや、現在のオブジェクトthisへの参照は使用できません。Java開発者へのインタビューからの質問と回答の分析。 パート 4 ~ 6次に、初期化ブロックがトリガーされる瞬間をよりよく理解するために、クラスの初期化の順序 (その祖先とともに) を確認します。

36. public class Child extends Parentのクラスを継承するには、オブジェクトの初期化の順序を書きます

Child クラスがロードされるときの初期化順序は次のようになります。
  1. クラスの静的フィールド。
  2. クラスの静的初期化ブロック。
  3. Сhildクラスの静的フィールド。
  4. Childクラスの静的初期化ブロック。
  5. クラスの非静的フィールド。
  6. クラスの静的初期化ブロックではありません。
  7. クラスのコンストラクター。
  8. Childクラスの非静的フィールド。
  9. Childクラスの静的初期化ブロックではありません。
  10. Childクラスのコンストラクター。
Java開発者へのインタビューからの質問と回答の分析。 パート 4 ~ 7実際の初期化順序を説明した短い記事を次に示します。

37. クラス (オブジェクト) 間の関係は何ですか?

Java のクラス間には 2 種類の関係があります。
  • IS-A関係
OOP の IS-A 原則は、クラスの継承またはインターフェイスの実装に基づいています。たとえば、クラスLion がCatから継承する場合、 Lion はCatであると言います。
Lion IS-A Cat
(ただし、すべての猫がライオンであるわけではありません) インターフェースの場合も状況はまったく同じです。LionクラスがWildAnimalインターフェイスを実装している場合、それらは関係にもあります。
Lion IS-A WildAnimal
  • HAS-A関係
このタイプの関係は、他のクラスによるクラスの使用に基づいており、「関連付け」とも呼ばれます。アソシエーションとは、あるクラスが別のクラスを参照することです (または相互参照することもできます)。たとえば、CarクラスはPassengerクラスを参照することができ、その関係は次のようになります。
Car HAS-A Passenger
逆も同様です。Passenger に Car への参照がある場合の関係になります。
Passenger HAS-A Car

38. オブジェクト間のどのような関連関係を知っていますか?

集約と合成は、関連付けの特殊なケースにすぎません。 集約とは、あるオブジェクトが別のオブジェクトの一部である関係です。たとえば、乗客が車に乗っているとします。また、乗客が数名いる場合もあれば、まったく乗客がいない場合もあります (テスラについて話している場合、運転手は必要ありません)。例えば:
public class Car {
   private List passengers = new ArrayList<>();

 void setPassenger(Passenger passenger) {
     passengers.add(passenger);
 }

   void move() {
       for (Passenger passenger : passengers) {
           System.out.println("Перевозка пассажира - " + passenger.toString());
       }
       passengers.clear();
   }
}
つまり、乗客の数 (または乗客がいるかどうか) は気にしません。Car クラスの機能はこれに依存しません。集約は、あるオブジェクトが別のオブジェクトによって使用されるときに、最初のオブジェクトを他のオブジェクトでも使用できることも意味します。たとえば、同じ生徒が編み物クラブとロッカーの音楽グループの両方のメンバーになることができ、同時に英語学習者のグループに参加することもできます。ご存知のとおり、集約はクラス間のより緩やかな結合関係です。Java開発者へのインタビューからの質問と回答の分析。 パート 4 ~ 8オブジェクトが別のオブジェクトの一部であるだけでなく、他のオブジェクトの働きが最初のオブジェクトに大きく依存している場合、構成はさらに厳格な関係になります。たとえば、車のエンジン。エンジンは車がなくても存在するかもしれませんが、車の外では役に立ちません。そうですね、車はエンジンがなければ動きません。
public class Car {
   private Engine engine;

   public Car(Engine engine) {
       this.engine = engine;
   }

   void startMoving() {
       engine.start();
           ...
   }
合成は、あるオブジェクトが別のオブジェクトによって使用される場合、最初のオブジェクトは他の誰にも属せないことも意味します。例に戻ると、エンジンは 1 台の車にのみ所属できますが、同時に 2 台以上の車に所属することはできません。今日はおそらくここで終わります。Java開発者へのインタビューからの質問と回答の分析。 パート 4 ~ 9
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION