難易度: 中級 以下の Java プログラムの出力を予測します。 プログラム 1 : Java public class Calculator { int num = 100; public void calc(int num) { this.num = num * 10; } public void printNum() { System.out.println(num); } public static void main(String[] args) { Calculator obj = new Calculator(); obj.calc(2); obj.printNum(); } } オプション: A) 20 B) 100 C) 1000 D) 2 答え:A) 20 説明 : ここで、クラスインスタンス変数名(num)は次と同じです。 計算() メソッドのローカル変数名(num)。したがって、クラスインスタンス変数を参照するには 計算() 方法 これ というキーワードが使われています。したがって、声明では this.num = num * 10 で 値が 2 であるメソッドのローカル変数を表し、 この番号 初期値が100のクラスインスタンス変数を表します。 printNum() メソッドにはクラスインスタンス変数と同じ名前のローカル変数がないため、直接使用できます で インスタンス変数を参照しますが、 この番号 使用できます。 プログラム 2 : Java public class MyStuff { String name; MyStuff(String n) { name = n; } public static void main(String[] args) { MyStuff m1 = new MyStuff('guitar'); MyStuff m2 = new MyStuff('tv'); System.out.println(m2.equals(m1)); } @Override public boolean equals(Object obj) { MyStuff m = (MyStuff) obj; if (m.name != null) { return true; } return false; } } オプション: A) 出力は true であり、MyStuff は Object.equals() コントラクトを満たしています。 B) 出力は false で、MyStuff は Object.equals() コントラクトを満たします。 C) 出力は true ですが、MyStuff は Object.equals() コントラクトを満たしていません。 D) 出力は false であり、MyStuff は Object.equals() コントラクトを満たしていません。 答え : C) 出力は true ですが、MyStuff は Object.equals() コントラクトを満たしていません。 説明 : として 等しい(オブジェクトオブジェクト) Object クラスのメソッドは、2 つのオブジェクトを同値関係に基づいて比較します。ただし、ここではオブジェクトが null かどうかを確認しているだけなので、満たされません。 Object.equals() 契約。として m1 null ではない true が出力されます。 プログラム 3 : Java class Alpha { public String type = 'a '; public Alpha() { System.out.print('alpha '); } } public class Beta extends Alpha { public Beta() { System.out.print('beta '); } void go() { type = 'b '; System.out.print(this.type + super.type); } public static void main(String[] args) { new Beta().go(); } } オプション: A) アルファ ベータ b b B) アルファ ベータ a b C) ベータ アルファ b b D) ベータ アルファ a b 答え : A) アルファ ベータ b b 説明 : 声明 新しいベータ().go() 2 つのフェーズで実行されます。第一段階では ベータ クラスコンストラクターが呼び出されます。インスタンスメンバーが存在しません ベータ クラス。それで今 ベータ クラスコンストラクターが実行されます。として ベータ クラスが拡張する アルファ クラスなので呼び出し先は アルファ デフォルトで最初のステートメントとしてのクラス コンストラクター (コンパイラによって配置される) は 素晴らしい() で ベータ クラスコンストラクター。これで 1 つのインスタンス変数として ( タイプ ) が存在します アルファ クラスなのでメモリを取得します。 アルファ クラス コンストラクターが実行されてから return を呼び出します。 ベータ クラスコンストラクターの次のステートメント。それで アルファベータ と印刷されています。第二段階中 行く() メソッドがこのオブジェクトに対して呼び出されます。変数は 1 つだけなので ( タイプ ) 値が次のオブジェクト内の ある 。したがって、次のように変更されます b そして2回印刷しました。の スーパーキーワード ここは役に立たない。 プログラム 4 : Java public class Test { public static void main(String[] args) { StringBuilder s1 = new StringBuilder('Java'); String s2 = 'Love'; s1.append(s2); s1.substring(4); int foundAt = s1.indexOf(s2); System.out.println(foundAt); } } オプション: A) -1 B) 3 C) 4 D) A StringIndexOutOfBoundsException 実行時にスローされます。 答え : C) 4 説明 : 追加(文字列str) メソッド str を連結します s1 。の 部分文字列(int インデックス) メソッドは、指定されたインデックスから最後までの文字列を返します。ただし、返された文字列を格納する文字列変数がないため、破棄されます。 IndexOf(文字列 s2) メソッドは最初に出現したインデックスを返します。 s2 。したがって、4 は s1='JavaLove' として出力されます。 プログラム 5 : Java class Writer { public static void write() { System.out.println('Writing...'); } } class Author extends Writer { public static void write() { System.out.println('Writing book'); } } public class Programmer extends Author { public static void write() { System.out.println('Writing code'); } public static void main(String[] args) { Author a = new Programmer(); a.write(); } } オプション: A) 書く... B) 本を書く C) コードを書く D) コンパイルが失敗する 答え : B) 執筆本 説明 : 静的メソッドはオーバーライドできないため、どのクラス オブジェクトが作成されるかは関係ありません。として ある です 著者 参照型なので常に 著者 クラスメソッドが呼び出されます。取り除いたら 書く() からのメソッド 著者 それからクラス ライター クラスメソッドは次のように呼び出されます 著者 クラスが拡張する ライター クラス。