【问题标题】:Call a protectedmethods from another package?从另一个包调用受保护的方法?
【发布时间】:2020-08-02 15:29:39
【问题描述】:
package1:
public class A{
    protected void Display(){
        System.out.println("Hello");
    }
}

package2:
import package1.*;

class C extends A{}

public class B{
    public static void main(String[] args){
        C var = new C();
        var.Display(); //error
    }
}

CA 的子类。而访问修饰符protected 表示同一个包或通过继承(可以通过子类从另一个包访问)。但是当我尝试从另一个包中调用 protected 方法时。没用。

【问题讨论】:

  • 您可以在 C 中调用该方法,而不是通过 C IN B 的实例
  • 谢谢,我做到了

标签: java methods scope protected


【解决方案1】:

protected 对子类可见。如果该类本身不是A 的子类,则它无权访问该方法(即,该类可能无法调用或引用该方法)。

B 不是A 的子类。即使它调用受保护方法的对象是A 的子类的实例,B 本身也无权访问该方法,因为它不是A 的子类。

换句话说,对Display() 的调用将在C 中有效,而不是通过C 的实例在B 中有效。即使在C 内,也只能在C 自己的实例上使用。

【讨论】:

  • 谢谢,我明白了。
【解决方案2】:

您收到错误是因为Displayprotected 成员,因此它在A 的子类中可见,而B 不是A 的子类。

package1

package package1;
public class A{
    protected void Display(){
        System.out.println("Hello");
    }
}

package2

 package package2;

import package1.A;

class C extends A {
    public void someMethod() {
        Display();// No error
    }
}
public class B {
    public static void main(String[] args) {
        C var = new C();
        var.Display();// Error
    }
}

附注:

  1. 关注Java naming conventions方法Display应该命名为display
  2. 尝试发布无编译错误的代码。您发布的代码有很多编译错误,例如您错过了包声明中的关键字package

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2016-05-26
    • 2021-12-31
    • 2012-03-21
    • 2014-11-07
    • 2018-06-29
    相关资源
    最近更新 更多