2016-01-13 70 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類在同一個包中,那麼你將沒有錯誤,並且你的代碼可以正常工作。

    相關問題