Javaの認定資格「Oracle Certified Java Programmer, Gold SE 7」。通称JavaGoldのオリジナル問題を紹介していきたいと思います。
前回の解答
まずは、前回の解答から。
正解は「(2)」となります。
5、6行目でBikeクラスからオブジェクトを2つ作成しています。その各々に対して8、9行目でup()メソッドを実行しています。up()メソッドはインスタンスメソッドであり、ここまでは特に問題ありません。
この問題のポイントは11、12行目になります。
11行目ではchange()メソッドを呼び出していますが、このメソッドはstaticメソッドとして定義されています。そのため、本来であればb1.change(…)ではなく、Bike.change(…)のように「クラス名.メソッド名()」と呼び出すのが通常です。しかし、Javaではstaticメソッドもこのように「変数名.メソッド名()」の形で呼び出すことを許可していますので、ここは特に問題ありません。
問題はありませんが、コンパイル時に以下の様な警告は発生してしまいます。合わせて押さえておきましょう。
型 Bike からの static メソッド change(String) には static にアクセスする必要があります
次に12行目では、static変数であるmodelにアクセスしています。こちらも本来は「Bike.model」のように「クラス名.static変数名」のようにアクセスしなくてはいけないところですが、「変数名.static変数名」の形でアクセスしています。(これはインスタンス変数と同じアクセス方法です。)
こちらもメソッドの時と同様にJavaではどちらのアクセス方法も許容していますので特に問題ありません。
ただし、実行結果は11行目で実行した結果が反映し、選択肢(2)の結果となります。
model変数はb1とb2で共有している形になります。static変数の基本となりますが、必ず抑えておきましょう。
それではもう一問、static変数とインスタンス変数の問題です。
問11
次のプログラムの実行結果として正しいものを1つ選んでください
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package techpjin; public class Lesson11 { public static void main(String[] args) { Sample11 s = new Sample11(); s.m1(); } } class Sample11{ int i; static double d; int m1(){ return i; } double m2(){ return d; } static int m3(){ return i; } static double m4(){ return d; } } |
- コンソールに0が出力される
- NullPointerExceptionが発生する
- 14行目でコンパイルエラーが発生する
- 15行目でコンパイルエラーが発生する
- 16行目でコンパイルエラーが発生する
- 17行目でコンパイルエラーが発生する
問11の解答・解説と問12はこちら