protected不能在不同的包子类中访问为什么?

时间:2016-01-13 15:10:33

标签: java

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

3 个答案:

答案 0 :(得分:1)

我觉得你仍然对protected m1()无法看见的原因感到有些困惑。

您了解mainB中的一种方法,BA的子类,因此您觉得它应该可以访问。

关键是obj被强制转换为类型A。然后,您尝试从m1中的静态上下文中调用实例方法 B(请参阅上面的this链接,了解其重要性) 。按类A定义,m1可通过以下方式访问:

  1. 类定义本身在给定的自身实例上。
  2. //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"
        }
    }
    
    1. 类本身和子类的实例方法(当然)。
    2. //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类在同一个包中,那么您将没有错误,并且您的代码可以正常工作。