3

当我发现一些没有编译的东西时,我正在从另一个包中扩展一个类,即使我认为它应该编译。

我有两个课程,在不同的包中。在 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()' 的可见性更改为受保护”,但它已经受到保护。

那么,这里到底发生了什么?在 oracle 规范中,它使用 Class、Package、Subclass 和 World 表示访问级别。应该将“实例”添加到此列表中,如果是,规则是什么?

4

2 回答 2

3

如果你想在子类中访问这个方法,你可以像这样使用它:

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

创建对象并尝试访问受保护的方法与访问超类受保护的方法不同。

于 2013-05-14T09:47:47.533 回答
0

this.foo1();会工作,但不会obj.foo1();obj.foo1();在课堂内不可见B。唯一foo1()可见的是继承的,实际上是this.foo1(). 这里的问题是您正在创建一个对象A并试图调用它foo1()。这是预期的行为,protected意味着继承的类和相同的包类可以看到该方法。

于 2013-05-14T09:47:27.640 回答