こんにちは、みんな!今日は Java 開発者の面接の質問のレビューを続けます。
ここで、初期化ブロックがいつ呼び出されるのかをよりよく理解するために、クラスの初期化の順序 (その親クラスとともに) を見てみましょう。

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演算子を使用しています。

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. クラスヘッダーの要素は何ですか? 例を書いてください
クラス ヘッダーを構成する要素を説明するために、小さなスキーマを見てみましょう。- 必須要素は括弧 <> 内に表示されます
- オプションの要素は {} 内にあります
public final class Lion extends Cat implements WildAnimal

32. メソッドヘッダーの要素は何ですか? 例を書いてください
メソッド ヘッダーを構成する要素を検討するとき、もう一度小さなスキーマを考えてみましょう。- 必須要素は括弧 <> 内に表示されます
- オプションの要素は {} 内にあります
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);
}
}

34. this キーワードはいつ使用されますか?
Java では、これには2 つの異なる意味があります。1. これは、現在のオブジェクトへの参照です (例: this.age = 9 )。つまり、thisは、 this が使用されるオブジェクト、およびthisを含むコードが参照するオブジェクトを指します。主な目的は、コードの可読性を向上させ、曖昧さを回避することです。たとえば、インスタンス フィールドとメソッドの引数が同じ名前の場合、次のようになります。public void setName(String name) {
this.name = name;
}
つまり、this.name はオブジェクトのフィールドであり、nameはメソッドのパラメータです。this参照は静的メソッドでは使用できません。2. コンストラクターでは、this(value)などのメソッドのようにこれを呼び出すことができます。この場合、同じクラスの別のコンストラクターへの呼び出しになります。基本的に、オブジェクトの作成プロセス中に 2 つのコンストラクターを呼び出すことができます。
public Cat(int age, String name) {
this(name);
this.age = age;
}
public Cat(String name) {
this.name = name;
}
最初のコンストラクターを呼び出してCatオブジェクトを作成すると、両方のインスタンス フィールドが正常に初期化されます。ここにはいくつかのニュアンスがあります。
- this() はコンストラクター内でのみ機能します。
- 別のコンストラクターへの参照は、コンストラクター ブロック (本体) の最初の行になければなりません。これは、コンストラクターがそのクラスの複数の (他の) コンストラクターを呼び出すことができないことを意味します。

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 ) への参照などの非静的データを使用できません。
36. Parent を拡張する public Child クラスを指定して、オブジェクトの初期化順序を書き出します。
Childクラスをロードするときの初期化順序は次のようになります。- 親クラスの静的クラス フィールド。
- 親クラスの静的初期化ブロック。
- Сhildクラスの静的フィールド。
- Childクラスの静的初期化ブロック。
- 親クラスの非静的フィールド。
- 親クラスの非静的初期化ブロック。
- 親クラスのコンストラクター。
- Сhildクラスの非静的フィールド。
- Сhildクラスの非静的初期化ブロック。
- Сhildクラスのコンストラクター。

37. クラス(オブジェクト)間の関係にはどのようなものがあるか知っていますか?
Java には、プリミティブ型と本格的なオブジェクトへの参照という 2 種類の変数があります。- IS-A関係
Lion IS-A Cat
(ただし、すべての猫がライオンであるわけではありません) インターフェースにも同じ状況が存在します。LionクラスがWildAnimalインターフェースを実装している場合、これらのインターフェースも関係内に存在します。
Lion IS-A WildAnimal
- HAS-A関係
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("Transporting passenger - " + passenger.toString());
}
passengers.clear();
}
}
言い換えれば、乗客の数は (いかなる場合も) 私たちにとって重要ではありません。Carクラスの機能はこれに依存しません。集約は、別のオブジェクトが 1 つのオブジェクトを使用するときに、最初のオブジェクトを他のオブジェクトが使用できることも意味します。たとえば、同じ生徒が編み物クラブとロック バンドの両方に所属し、同時にスペイン語のクラスに参加している場合があります。ご想像のとおり、集約はクラス間のより緩やかな結合関係です。 構成は、オブジェクトが別のオブジェクトの一部であるだけでなく、あるオブジェクトの動作が別のオブジェクトに大きく依存する、さらに緊密な関係です。たとえば、車にはエンジンが付いています。エンジンは車がなくても存在するかもしれませんが、車の外では役に立ちません。そして、車はエンジンがなければ動きません。
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
void startMoving() {
engine.start();
...
}
合成は、別のオブジェクトがオブジェクトを使用する場合、最初のオブジェクトが他のオブジェクトに属することができないことも意味します。先ほどの例に戻ると、エンジンは 1 台の車にのみ所属でき、同時に 2 台以上に所属することはできません。今日はこれで十分だと思いますので、ここで終わりにします。
GO TO FULL VERSION