[ Java Silver 対策 ] 演習問題1(パッケージとクラス)

目次

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!");
    }
}
どうして、コンパイルエラーが発生するかというと、、、

MyClasscom.example.project1パッケージに、MyOtherClasscom.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)ClassAmethodA メソッドは ClassB からアクセス可能ですか?

 ClassB からは、アクセス可能です。

 理由は、ClassBClassA をインポートしており、ClassAmethodA メソッドを静的に呼び出しています。

B)ClassBmain メソッドは ClassA からアクセス可能ですか?

ClassA からは、アクセスできません。

 理由は、main メソッドは public であるため、他のクラスからアクセス可能ですが、ClassBClassA は異なるパッケージに所属しています。そのため、ClassBmain メソッドは ClassA からは直接アクセスできません。

ちょこっとコラム アクセス修飾子について

 アクセス修飾子によるアクセス制御についての問題が出題されることがあります。パッケージプライベート、protected、publicなどのアクセス修飾子の使い方や影響を理解していきましょう。

 「アクセス」とはプログラムの中で作成した、「フィールド」名や「メソッド」名を書き込むことで、使用する値や文字列、処理した内容を外部(他のクラスやパッケージ)からの利用や操作することを指します。

アクセス修飾子働き
パッケージプライベート同じパッケージ内の他のクラスからはアクセス可能ですが、パッケージ外のクラスからはアクセスできません。
右のアクセス修飾子の欄にカタカナで書いてありますが、パッケージ宣言自体にアクセス修飾子を指定することはできません。そのため各クラス、メソッドで宣言しておく必要があります。
protectedこのアクセス修飾子を書き込んだクラス、またはそのサブクラスからアクセスが可能です。また、同じパッケージ内の他のクラスからもアクセスが可能です。
private他のクラスや同じパッケージ内のクラスからはアクセスできません。
publicすべてのパッケージやクラスからアクセスできます。

 問題にあるように、パッケージが違っているためアクセスできないなどの条件もありますので、回答するときには、注意しましょう。

 他のページで「パッケージ」と「クラス」の解説をしています。ぜひ訪れて基本的な理解を深めていきましょう。

(Visited 536 times, 1 visits today)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社NEUGATEは、都内で企業研修や職業訓練を運営している会社です。主に、IT系の教育事業に力を入れています。
この記事は、株式会社NEUGATEの教育事業部が執筆をしています。

企業ホームページ:https://neugate.co.jp/

コメント

コメントする

目次