错误:m1() has protected access in A
当我尝试使用超类引用变量(A obj=new B()
)
这是pkg1包中的第一个类;
package pkg1;
public class A {
protected void m1() {
System.out.println("protected method");
}
}
这是第二个类,它在另一个包pkg2中导入pkg1;
package pkg2;
import pkg1.A;
public class B extends A {
@Override
protected void m1() {
System.out.println("override m1");
}
public static void main(String ar[]) {
A obj=new B();
obj.m1();
}
}
答案 0 :(得分:1)
我觉得你仍然对protected m1()
无法看见的原因感到有些困惑。
您了解main
是B
中的一种方法,B
是A
的子类,因此您觉得它应该可以访问。
关键是obj
被强制转换为类型A
。然后,您尝试从m1
中的静态上下文中调用实例方法 B
(请参阅上面的this链接,了解其重要性) 。按类A
定义,m1
可通过以下方式访问:
//example package pkg1; public class C { protected void m1() { System.out.println("protected method"); } public static void callM1(C anInstanceOfC){ anInstanceOfC.m1(); } }
package pkg2; import pkg1.C; public class D extends C { @Override public void m1() { System.out.println("override m1"); } public static void main(String ar[]) { C obj=new D(); C.callM1(obj);//output would be "override m1" } }
//example package pkg1; public class C { protected void m1() { System.out.println("protected method"); } public void m2() { m1();//call to instance method m1 } public static void callM1(C anInstanceOfC){ anInstanceOfC.m2(); } }
package pkg2; import pkg1.C; public class D extends C { @Override public void m1() { System.out.println("override m1"); } public void m3() { //super.m2() m2();//call to superclass method } public static void main(String ar[]) { D obj=new D(); D.m3(); // output "override m1" } }
答案 1 :(得分:0)
protected 关键字表示您可以从子类访问受保护定义的数据。例如,您尝试从非子静态上下文访问受保护的数据。你应该试试这个:
$ echo hello | ts -i
00:00:00 hello
$ ( sleep 3 && echo hello ) | ts -i
00:00:03 hello
答案 2 :(得分:0)
m1()的访问级别受到保护。受保护的方法只能由子类或同一包中的其他类访问。在静态'main'方法中,您无法在其他包中调用类的受保护实例方法。如果B类与A类在同一个包中,那么您将没有错误,并且您的代码可以正常工作。