3

コンパイルする必要があると思っていたにもかかわらず、コンパイルされていないものを見つけたときに、別のパッケージからクラスを拡張していました。

異なるパッケージに2つのクラスがあります。パッケージ com.foobar.a:

package com.foobar.a;

public class A {

    protected void foo1() {
        System.out.println("foo1() was called!");
    }

    protected static void foo2() {
        System.out.println("foo2() was called!");
    }

}

そして、パッケージ com.foobar.b では:

package com.foobar.b;

import com.foobar.a.A;

public class B extends A {

    public void bar() {
        A obj = new A();
        obj.foo1(); // This doesn't compile
        A.foo2(); // This does compile
    }

}

さて、これによると:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.htmlサブクラスは、同じパッケージの外にある場合でも、メソッドにアクセスできるはずです(そして、メソッドは静的であり、機能します)。実際、私は Eclipse でプログラミングを行っており、問題を修正するための提案は「'foo1()' の可視性を保護されたものに変更する」ことですが、既に保護されています。

それで、ここで正確に何が起こっているのですか?オラクルの仕様では、Class、Package、Subclass、World を使用してアクセス レベルを示します。このリストに「インスタンス」を追加する必要があります。追加する場合、ルールはどれになりますか?

4

2 に答える 2

3

サブクラスでこのメソッドにアクセスする場合は、次のように使用できます。

public void bar() {
    this.foo1();
}

オブジェクトを作成して保護されたメソッドにアクセスしようとすることは、スーパークラスの保護されたメソッドにアクセスすることとは異なります。

于 2013-05-14T09:47:47.533 に答える