0

クラスとインスタンス変数のアクセス修飾子について学んでいます。パッケージ内でデフォルトのアクセス修飾子にアクセスできることは知っています。

しかし、このコードが機能しない理由がわかりません:

A.java :

defaultこれは、アクセスできるインスタンス変数が 1 つだけあるスーパー クラス ファイルです。

package foo;
public class A {
    int a = 10;
}

B.java :

スーパークラスのfooインスタンス変数を使用しようとする、同じパッケージ内のサブクラス ファイルaclass A

package foo;
class B extends A {
    public static void main(String[] args) {
        B b = new B();
        b.test();
    }
    public void test(){
        System.out.println("Variable is : " + a);
    }
}

このプログラムは動作するはずですが、cannot find symbolエラーが発生しました。

B.java:2: error: cannot find symbol
class B extends A {
                ^
    symbol: class A
B.java:8: error: cannot find symbol
                System.out.println("Variable is : " + a);
                                                      ^
    symbol:     variable a
    location:   class B
2 errors

defaultルールに従って、アクセス修飾子を持つインスタンス変数はパッケージ内でアクセスできるため、このエラーの理由は何ですか。ここでは、class Aは公開されているため、 に表示されますclass B。のインスタンス変数aclass Aはアクセス権があるため、同じパッケージ内の他のクラスによって が拡張されdefaultている場合にアクセスできます。class A

4

2 に答える 2

1

最初の問題は、コンパイラがクラス A を見つけられないことです。それができると、メンバーも見つけることができますa。あなたの問題は、おそらく Java コンパイラーの実行方法にあります。コマンドラインからコンパイルしていると思いますよね?

この場合、ソースルートがある場所にいる必要があります。次に実行しjavac foo/B.javaます。これは問題なく動作するはずです。

引き続きコマンド ライン オプション-classpath-sourcepath. 次に、IDE の使用を開始することをお勧めします。

于 2013-06-05T17:37:26.497 に答える