makoto_blog

パパさん_blog

プログラミング勉強メモや雑記など。

Java Silver 無名パッケージ

これから運動会なので急いでメモる。

無名パッケージに関する問題

Java Silver の問題集を進めている。子どもたちがドリルを頑張っているので、私も勉強っぽい事をしようと思って。アプリ作りは遊びみたいだけど、試験勉強は勉強っぽいのだ。受験するかは未知数です。

さて、こんな問題がある。

これ、どうなる?

public class Sample {
    protected int num = 10;
}

↑と↓の2つのクラスがある。

package ex;

public class SampleImpl extends Sample {
    public static void main(String[] args) {
        System.out.println(num);
        }
}

正解はコンパイルエラー。
Sampleクラスはパッケージ宣言がないが、無名パッケージに属するので、明示的にパッケージ宣言をしたクラスから、無名パッケージは使えない。

答えはわかった。ではこいつを動かしてみようではないか

まず、Sampleを作成しコンパイルコンパイルOK
次にその下の階層にexフォルダを作りSampleImplを作りコンパイルコンパイルエラー

ここまでは想定どおりだね。

exフォルダにSampleを作る

こんな感じにパッケージ宣言をしてコンパイル

package ex;

public class Sample {
    protected int num = 10;
}

exフォルダにSampleImplをコンパイル

エラーやん。

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp . SampleImpl.java 
SampleImpl.java:3: エラー: シンボルを見つけられません
public class SampleImpl extends Sample {
                                ^
  シンボル: クラス Sample
SampleImpl.java:5: エラー: シンボルを見つけられません
        System.out.println(num);
                           ^
  シンボル:   変数 num
  場所: クラス SampleImpl
エラー2個

ああそうか、上から呼ばねば。ね。

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp .. SampleImpl.java 
SampleImpl.java:5: エラー: staticでない変数 numをstaticコンテキストから参照することはできません
        System.out.println(num);
                           ^
エラー1個

エラーやん。

ああ、インスタンスないからか。

こう変えてみた。

package ex;

public class SampleImpl extends Sample {
    public static void main(String[] args) {
        Sample a = new Sample();
        System.out.println(a.num);
        }
}

オッケー

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ java -cp .. ex.SampleImpl
10

問題集の問題は問題にすぎないから、実際に動くようにするにはそのままではダメなのね。