JavaSilverの取得を目指されている方へ
Javaプログラムの勉強をされて、自分の実力を試すために受験される方も、就職に役立てたい方もいらっしゃるかともいますが、何はともあれ、取得するために、問題は多い方がいいと思います。ここでも Java Silver 取得に関連する問題を出題していくので、一緒に解いてみましょう!!
パッケージに関する問題
次のクラス定義の中から、正しいパッケージ名を選択してください。
package com.example.project1;
public class MyClass {
// クラスの内容
}
選択肢
- A.
com.project1.example
- B.
project1.example.com
- C.
com.example
- D.
com.example.project1
正解は、
D. com.example.project1
です。パッケージ名は、ドメイン名を逆順にしたものが一般的に使われます。
不正解選択肢の理由を考えてみましょう。
「A. com.project1.example
」これは、書かれているパッケージと順番が違いますね。
「B. project1.example.com
」これは、順番を逆に書いてあります。
「C. com.example
」これは、最後の「project1」が抜けていますね。
パッケージ名は、「package」から「;」までの部分になります。
以下のコードを見て、コンパイルエラーが発生する理由を教えてください。
package com.example.project1;
public class MyClass {
public static void main(String[] args) {
MyOtherClass other = new MyOtherClass();
other.sayHello();
}
}
package com.example.project2;
public class MyOtherClass {
public void sayHello() {
System.out.println("Hello from MyOtherClass!");
}
}
どうして、コンパイルエラーが発生するかというと、、、
MyClass
がcom.example.project1
パッケージに、MyOtherClass
がcom.example.project2
パッケージに所属しているため、MyClass
からMyOtherClass
を使用することはできません。そのため、コンパイルエラーが発生します。
お気づきになりました?
以下のコードを手順に従って操作したとき、結果はどうなるでしょうか?
package com.example.project1;
public class MyClass {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
このコードをコンパイルし、次のディレクトリ構造でコマンドを実行したとします。
project/
└── src/
└── com/
└── example/
└── project2/
└── MyOtherClass.java
次のコマンドを実行した場合、コンパイルは成功するでしょうか?
javac com/example/project1/MyClass.java
結果は、、、、、
コンパイルが失敗します。MyClass.java
のパッケージ宣言はcom.example.project1
ですが、実際に存在するディレクトリ構造はcom/example/project2
です。パッケージ名とディレクトリ構造が一致しないため、コンパイラはMyClass.java
を見つけることができません。
パッケージとクラスのアクセスに関する問題
以下のプログラムを見て、それぞれのクラスやメソッドが他のクラスからアクセス可能かどうかを判断してください。
//ClassA
package sample.package1;
public class ClassA {
public static void methodA() {
System.out.println("Method A");
}
}
//ClassB
package sample.package2;
import sample.package1.ClassA;
public class ClassB {
public static void main(String[] args) {
ClassA.methodA();
}
}
A)ClassA
の methodA
メソッドは ClassB
からアクセス可能ですか?
ClassB からは、アクセス可能です。
理由は、ClassB
は ClassA
をインポートしており、ClassA
の methodA
メソッドを静的に呼び出しています。
B)ClassB
の main
メソッドは ClassA
からアクセス可能ですか?
ClassA からは、アクセスできません。
理由は、main
メソッドは public
であるため、他のクラスからアクセス可能ですが、ClassB
と ClassA
は異なるパッケージに所属しています。そのため、ClassB
の main
メソッドは ClassA
からは直接アクセスできません。
ちょこっとコラム
アクセス修飾子についてアクセス修飾子によるアクセス制御についての問題が出題されることがあります。パッケージプライベート、protected、publicなどのアクセス修飾子の使い方や影響を理解していきましょう。
「アクセス」とはプログラムの中で作成した、「フィールド」名や「メソッド」名を書き込むことで、使用する値や文字列、処理した内容を外部(他のクラスやパッケージ)からの利用や操作することを指します。
アクセス修飾子 | 働き |
パッケージプライベート | 同じパッケージ内の他のクラスからはアクセス可能ですが、パッケージ外のクラスからはアクセスできません。 右のアクセス修飾子の欄にカタカナで書いてありますが、パッケージ宣言自体にアクセス修飾子を指定することはできません。そのため各クラス、メソッドで宣言しておく必要があります。 |
protected | このアクセス修飾子を書き込んだクラス、またはそのサブクラスからアクセスが可能です。また、同じパッケージ内の他のクラスからもアクセスが可能です。 |
private | 他のクラスや同じパッケージ内のクラスからはアクセスできません。 |
public | すべてのパッケージやクラスからアクセスできます。 |
問題にあるように、パッケージが違っているためアクセスできないなどの条件もありますので、回答するときには、注意しましょう。
他のページで「パッケージ」と「クラス」の解説をしています。ぜひ訪れて基本的な理解を深めていきましょう。
コメント