Java初心者の登竜門! Java Bronze試験で間違えやすい問題6選

こんにちは。横尾です。
 
AMGの内定者研修ではオラクル社が提供しているOracle Certifies Java Programmer, Bronze SE7/8(通称Java Bronze)の取得をサポートしています。Java Bronzeはプログラミング初心者にはうってつけの試験で、試験勉強を通してプログラミングの基礎を学んでもらっています。
 
今回は、そのJava Bronzeで間違えやすい問題をピックアップします。

このプログラムを実行したときの結果は?

public class Main{
	public static void maim(String[] args){
		Product p = new Product();
		p.setName("feels");
		p.printName();
	}
}

class Product{
	private String name;
	
	public Product(String name){
		this.name = name;
	}
	
	public void setName(String name){
		this.name = name;
	}
	
	public void printName(){
		System.out.println(name);
	}
}

A.何も表示されない
B.「feels」と表示される
C.コンパイルエラーになる
D.実行時に例外が発生する

解答:C

 
デフォルトコンストラクタの問題です。
 
デフォルトコンストラクタは、クラスにコンストラクタを明示的に記述しない場合にコンパイラが自動的に追加する引数なしのコンストラクタです。
 
上記のプログラムだと、ProductクラスにはString型の引数を受け取るコンストラクタを定義しており、引数なしのデフォルトコンストラクタは定義されないため、コンパイルエラーになります。

12行目に挿入するコードして正しいものを選択してください。

public class Main{
	public static void main(String[] args){
		Fruit f = new Fruit();
		f.print();
	}

class Fruit{
	private String name;
	private int price;
	
	public Fruit(){
		// コードの挿入
	}
	public Fruit(String name, int price){
		this.name = name;
		this.price = price;
	}
	public void print(){
		System.out.println(name + "," + price)
	}
}

A.this("apple", 0);
B.Fruit("apple", 0);
C.this("apple");
D.Fruit("apple");

解答:A

 
this()とオーバーロードに関する問題です。
 
11~13行目は引数なしのコンストラクタを定義して、14~17行目は引数を2つとするコンストラクタをオーバーロードしています。コンストラクタからオーバーロードした異なるコンストラクタを呼び出すためにはメソッド名ではなくthis()で呼び出します。
 
また、上記のプログラムでは引数が1つのコンストラクタは定義されていないため、Aが正解となります。

このプログラムを実行したときの結果は?

public class Main{
	public static void main(String[] args){
		Counter c1 = new Counter();
		Counter c2 = new Counter();
		c1.count = 1;
		System.out.println(c2.count);
	}
}
class Counter{
	public static int count = 0;
}

A.何も表示されない
B.0が表示される
C.1が表示される
D.コンパイルエラーになる
E.実行時に例外が発生する

解答:C

 
staticフィールドの問題です。
 
staticフィールドは、すべてのインスタンスで共有されるフィールドです。インスタンスごとに値を管理できるインスタンスフィールドとは異なるので注意が必要です。
 
10行目でstaticフィールドcountを0で初期化を行った後、5行目でインスタンス変数c1を利用してcountに1を代入しています。
 
一見c1、c2は別々のインスタンスのようにも見受けられますが、countはstaticフィールドなので値が共有されています。そのため、c2からcountにアクセスしても1が保持されています。

次のコードをコンパイル、実行した時の結果はどれか

public class Main{
	public static void main(String[] args){
		System.out.println(5 + 10 + "5");
	}
}

A.「155」と表示される
B.「20」と表示される
C.「5105」と表示される
D.コンパイルエラーになる
E.実行時に例外が発生する

解答:A

 
Java Bronzeの教本を読み返していて、そういえばここ引っ掛かったなと思ってピックアップしました。
 
演算は算数と同じで、左から右へ順番に処理されます。なので、まずは5+10=15が処理されます。そうすると、次は「15+”5”」を処理することになるのですが、「”5”」は数値ではなく文字列です。
 
文字列がオペランドに含まれていると文字列連結の演算子として機能するため、155で出力されます。+が加算か文字列連結の演算子かの区別がつけば怖くない問題ですね。

「sub,super」と表示されるようにするには?

public class SuperClass{
	String val = "super";
}

public class SubClass extends SuperClass{
	String val = "sub";
	public void test(){
		System.out.println(val + "," + /*ここにコードを挿入*/);
	}
	public static void main(String[] args){
		SubClass sub = new SubClass();
		sub.test();
	}
}

A.super(val)
B.this.val
C.super.val
D.super().val
E.SuperClass.val

解答:C

 
スーパークラスに関する問題です。
 
サブクラスからスーパークラスのメソッドやフィールドにアクセスするときにはsuperを使います。なので、Eは誤りです。
 
また、AとDはスーパークラスや自クラス内の別のコンストラクタを呼び出すための書き方なので選択肢から外れます。Bのようにthisを使うと、出力結果は「sub,sub」となってしまうため、Cを選択するのが正解です。
 
継承の問題は多く出題された記憶があるので、苦手な方はしっかり勉強しておきましょう。

次のプログラムのコンパイルを成功させるには?

public interface Sample{
	// ここにコードを挿入
}

A.public void setVal(String val);
B.private void setval(String val);
C.String val;
D.void setVal(String val);
E.public static void setVal(String val);

解答:A、D

 
インタフェースに関する問題です。
 
インタフェースに定義するフィールドやメソッドはpublicである必要があるため、Bのprivateでは定義できません。また、定義できるフィールドは定数のみなので初期値を設定していないフィールドの宣言もNGなのでCは不正解です。
 
インタフェースで定義するメソッドはすべてpublic abstractで修飾される抽象メソッドです。抽象メソッドは実装を持つことができないため、別で実装メソッドを用意しておく必要があります。Eのようなstaticで修飾したメソッドの場合は実装を持たなければいけないため、Eは選択肢から外れます。
 
よって、答えはA、Dとなります。

まとめ

いかがでしたでしょうか?
 
Java BronzeはJavaそのものの知識と、プログラミングの基礎を学ぶにはうってつけの資格です。プログラミングについてはどれだけ論理的な理解ができるかがポイントになってくると思います。Javaの知識の問題は確実に点を取れるように備えておきましょう!
 
何かと引っかけてくる試験でしたが、たくさん問題を解いているうちに引っかけ問題にも慣れていきました。下で紹介している問題集の問題を間違えなくなるまで解いていれば、心配ない試験です。
 
みなさんは、Java初心者にぴったりなこの試験、合格目指して頑張ってください。
 
 
 
 
《使用した本》

記事をシェア
MOST VIEWED ARTICLES