2016-01-13 73 views
1

错误: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(); 
    } 
} 
+1

你试图访问'obj.m1()'和'obj'是类型A'的'。所以... –

+0

确实。请解释你为什么期望*工作。 (未来,请注意代码格式化,现在我已经解决了它,但之前它是一团糟)。 –

+0

@denys Seguret,@ jon Skeet如果我不是worng java给出了动态方法的机制派遣,所以我想我可以通过使用类型A的参考变量来访问从A重写的m1()方法。 –

回答

1

我觉得你仍然有些困惑,为什么protected m1()不可见。

你明白mainBB的方法的A一个子类,所以你会觉得它应该是可访问的。

关键是obj被铸造为类型A。然后,您尝试拨打实例方法m1静态上下文在B(请参阅上面的this链接为什么这很重要)。按类A定义,m1是通过访问:

  1. 类定义本身对自身的给定实例。
 
//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" 
        } 
    } 
    
    0

    保护关键字,您可以从子类访问受保护的自定义数据。例如,您尝试从非子静态上下文访问受保护的数据。您应该试试这个:

    package pkg2; 
    
    import pkg1.A; 
    public class B extends A { 
        @Override 
        public void m1() { 
         System.out.println("override m1"); 
        } 
    
        public static void main(String ar[]) { 
         B obj=new B(); 
         obj.m1(); 
        } 
    } 
    
    +0

    @ SeniorJD当我在类B中扩展A时,意味着B是类A的子项。 –

    +0

    但是'主'方法实际上不是B对象的一部分。 – SeniorJD

    +0

    main方法如何不是B对象的一部分? –

    0

    m1()的访问级别受到保护。受保护的方法只能由子类或其他类在同一包中访问。从您的静态“主要”方法中,不能调用受保护的实例不同包中的类的方法。如果B类和A类在同一个包中,那么你将没有错误,并且你的代码可以正常工作。

    相关问题