【问题标题】:Java protected methods access from different instance从不同实例访问 Java 保护方法
【发布时间】:2013-05-08 12:53:12
【问题描述】:

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

我有两个类,在不同的包中。在 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 表示访问级别。应该将“Instance”添加到此列表中,如果是,规则是什么?

【问题讨论】:

  • 如果您将尝试直接访问foo1(),而不是将其用作obj.foo1() ,那么它将起作用。

标签: java protected extends


【解决方案1】:

如果要在子类中访问该方法,可以这样使用:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果是这样,那么即使A.foo2() 也应该产生错误,因为foo2()foo1() 的访问说明符是相同的,唯一的区别是foo2()static
    • 唯一的区别是 foo2() 是静态的 ==> 这就是区别!!!! foo2();A.foo2() 指的是同一个方法,obj.foo1()this.foo1() 是完全不同的调用!!!
    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 2020-04-23
    • 2010-10-28
    • 2016-05-06
    • 2020-07-01
    • 2014-04-17
    • 2015-07-09
    • 2016-07-19
    相关资源
    最近更新 更多