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

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

ランダム グループに公開済み
こんにちは、みんな!今日は Java 開発者の面接の質問のレビューを続けます。 Java 開発者の職の面接での質問と回答を調査します。 パート 4 - 1

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. クラスヘッダーの要素は何ですか? 例を書いてください

クラス ヘッダーを構成する要素を説明するために、小さなスキーマを見てみましょう。
  • 必須要素は括弧 <> 内に表示されます
  • オプションの要素は {} 内にあります
{アクセス修飾子}{static}{final}{abstract}<クラス名>{親クラスの継承}{インターフェースの実装} したがって、次のようになります: {アクセス修飾子} — パブリック および デフォルトアクセス修飾子のみが、クラス。 {static}static修飾子は、このクラスが静的であることを示します。これは内部クラス (他のクラス内のクラス) にのみ適用されます。 {final} — これは、もちろん、クラスを継承不可能にする最後の修飾子です (すぐに使用できる例はStringです)。 {abstract} —クラスに実装されていないメソッドがある可能性があることを示す抽象修飾子。この修飾子は最終修飾子と競合します。抽象修飾子はクラスが継承され、その抽象要素が実装されることを意味するため、クラス ヘッダーにはこれらのうち 1 つだけを含めることができます。ただし、final は、これがクラスの最終バージョンであり、継承できないことを示します。実際、両方の修飾子を同時に使用するのは不合理です。コンパイラではこれを実行できません。 <class>はクラス宣言を示す必須キーワードです。 <class name>は、特定の Java クラスの識別子となる単純なクラス名です。完全修飾クラス名は、修飾パッケージ名と「.」で構成されます。単純なクラス名を加えます。 {親クラスの継承} は、extendsキーワードを使用して親クラス (存在する場合) を示します。たとえば、 ... はParentClass を拡張します{implementation of Interfaces} — このクラスが実装するインターフェイス (存在する場合) のリスト ( implementsキーワードを使用)。例: ... FirstInterface、SecondInterface を実装します... 例として、 Catを継承し、 WildAnimalインターフェイス を実装するLionクラスのクラス見出しを考えてみましょう。
public final class Lion extends Cat implements WildAnimal
Java 開発者の職の面接での質問と回答を調査します。 パート 4 - 3

32. メソッドヘッダーの要素は何ですか? 例を書いてください

メソッド ヘッダーを構成する要素を検討するとき、もう一度小さなスキーマを考えてみましょう。
  • 必須要素は括弧 <> 内に表示されます
  • オプションの要素は {} 内にあります
{アクセス修飾子}{static}{abstract}{final}{synchronized} {native} <戻り値><メソッド名> <(>{メソッドパラメータ}<}>{例外をスローする} {アクセス修飾子} - すべてのアクセス 修飾子はメソッドで利用可能なもの — publicprotecteddefaultprivate . {static}静的修飾子、メソッドが静的であるため、オブジェクトではなくクラスに関連付けられていることを示します {abstract}抽象修飾子、それを示しますメソッドには実装 (本体) がありません。正しく動作するには、メソッドを宣言するクラスにも抽象修飾子が必要です。クラス ヘッダーと同様、この修飾子は最終修飾子と競合し、静的修飾子とも競合します。 abstract メソッドは、子孫内のメソッドをオーバーライドすることを意味し、静的メソッドはオーバーライドできません。 {finale} —このメソッドがオーバーライドできないことを示す 最後の修飾子。 {synchronized}同期された修飾子。メソッドが保護されていることを意味します。異なるスレッドからの同時アクセス。メソッドが静的でない場合、オブジェクトのこのミューテックスに対して閉じられます。メソッドが静的である場合、メソッドは現在のクラスのミューテックスに対して閉じられます。 {native}ネイティブ修飾子は、メソッドが別のプログラミング言語で記述されていることを示します。 <戻り値の型> — メソッドが返さなければならない値の型。メソッドが何も返さない場合は、void を返します。 <method name> — メソッド名の名前、つまりシステム内のその識別子。 {メソッドパラメータ} — メソッドが受け入れるパラメータ。メソッドの機能を実装するために必要です。 {thrownExceptions}throws <ExceptionType> — このメソッドがスローできるチェック済み例外のリスト。メソッドヘッダーの例として以下を提供します。
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 はオブジェクトのフィールドであり、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オブジェクトを作成すると、両方のインスタンス フィールドが正常に初期化されます。ここにはいくつかのニュアンスがあります。
  1. this() はコンストラクター内でのみ機能します。
  2. 別のコンストラクターへの参照は、コンストラクター ブロック (本体) の最初の行になければなりません。これは、コンストラクターがそのクラスの複数の (他の) コンストラクターを呼び出すことができないことを意味します。
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. Parent を拡張する public Child クラスを指定して、オブジェクトの初期化順序を書き出します。

Childクラスをロードするときの初期化順序は次のようになります。
  1. クラスの静的クラス フィールド。
  2. クラスの静的初期化ブロック。
  3. Сhildクラスの静的フィールド。
  4. Childクラスの静的初期化ブロック。
  5. クラスの非静的フィールド。
  6. クラスの非静的初期化ブロック。
  7. クラスのコンストラクター。
  8. Сhildクラスの非静的フィールド。
  9. Сhildクラスの非静的初期化ブロック。
  10. Сhildクラスのコンストラクター。
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("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 台以上に所属することはできません。今日はこれで十分だと思いますので、ここで終わりにします。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION