2015-09-17 125 views
2

我的一位朋友向我問了這個問題。爲什麼下面的代碼在調用aa.x()時不會給出錯誤?
我明白,aa是對類B的對象的引用,但是在類A的方法內調用類A的私有方法,因此它是可見的,因此可以訪問。

我的理解是否正確?或者這背後還有其他原因嗎?瞭解私人方法的範圍

public class A { 
    public void xyz() { 
     System.out.println("A"); 
    } 
    private void x() { 
     System.out.println("A:x"); 
    } 
    public static void main(String[] args) { 
     B b = new B(); 
     A aa = b; 
     aa.x(); 
     aa.xyz(); 
     B bb = (B) aa; 
     bb.xyz(); 
     bb.xyz12(); 
    } 
} 
class B extends A { 
    public void xyz() { 
     System.out.println("B"); 
    } 
    public void xyz12() { 
     System.out.println("B-12"); 
    } 
} 
+4

這麼多重複,很少時間... *編輯:*呃,好吧,也許沒有子類皺紋。 –

+0

如果您想了解它,請閱讀https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html上的訪問修飾符。私人訪問修飾符是爲類和主要是在這個類,所以沒有問題,調用該方法 – Gaskoin

+0

這裏不妨寫'A aa = new A()'而不是'A aa = b'。由於'A a = b'是合法的,'aa.x()'在'A#main()'內是合法的,所以一切正常。 –

回答

0

,因爲它被調用包含在A類的主要方法將它移動到B類和它不會工作

3

使用一個子類,我不能馬上找到重複的只有可見,但基本上它與this question的答案是一樣的答案。

有管理對x訪問兩兩件事:

  1. 當代碼是在做訪問。由於xA是私有的,訪問它的代碼必須是A中方法的一部分。它不能位於子類(B)或不相關的類中。

  2. 你正在使用什麼樣的參考。如果你有一個A參考,你可以訪問它x。如果您有B參考,則不能,即使您的代碼是A方法的一部分。您可以將其轉換爲A,然後訪問x,但不能直接使用B類型的參考。

+0

Downvoter:我在這裏弄錯了什麼? –

+3

關於代碼的位置以及關於'aa'編譯時間類型的更多信息。你不能在'A'裏面做'b.x()'。運行時類型無關緊要。範圍和可訪問性都是關於編譯時間的。 –

+0

@SotiriosDelimanolis:這是真的*太*,但如果你有'A'引用'a',你不能在非'A'代碼中執行'ax()', –

0

由於私有方法沒有被繼承,超類引用調用它自己的私有方法。

您的main方法是A的方法,因此它可以調用x()私有方法。

私有修飾符 - 該字段只能在其自己的類中訪問。