请参阅以下代码:
package bk;
public class A {
protected void methodA() {
System.out.println("Calling the method A !");
}
}
// And I have an another package :
package com;
import bk.A;
public class B extends A {
public void methodB() {
System.out.println("Goi phuong thuc B !");
}
public static void main(String[] args) {
A a = new B();
a.methodA();
}
}
如何允许a
拨打methodA()
?
答案 0 :(得分:6)
原因methodA()受保护,只能在派生类中调用。如果您想像这样调用它,请将其更改为公开
答案 1 :(得分:0)
受保护的方法只能从类本身或派生类中调用。
a
变量声明为A
类型的变量。类A
本身没有公开methodA
,因此您无法调用它。
是的,您为B
变量分配了一个新的a
实例,a.methodA()
语句位于派生的B
类中,但编译器只看到a
1}}属于A
类型。它也可以是 A
的任何其他子类,在这种情况下,您仍然无法访问methodA
。
您必须告诉编译器a
变量实际上是B
类型。然后,您就可以拨打methodA
,因为您是在课程B
内拨打的。
B a = new B();
答案 2 :(得分:0)
您正试图访问methodA()
,因为它是公开的。在B类中简单地声明methodA()
很好,但你不能a.methodA()
。
相反,如果它不是一种方法而只是protected int a;
你可以做到
a = 1;
中的 B
但是
A a = new A();
a.a = 1;
不合法
继承类可以看到protected
方法,甚至不是同一个包的一部分。包范围(默认)方法不是。这是受保护范围和包范围之间的唯一区别。
理论上,有人使用protected
访问权限扩展您的课程,而不是仅仅使用public
访问权限的人知道他们所做的事情。他们还需要更多访问你班级的内部工作。除此之外,protected
的行为类似于默认包访问。