2016-09-19 147 views
0

我見過很多關於對象引用的問題,並且部分理解了它們的工作原理。儘管如此,我仍然有一些疑慮。將一個對象的引用賦值給Java中的其他對象?

首先,本聲明中的所有詞語意味着什麼?

Box b = new Box();

我知道new Box()導致創建一個對象,並返回參照到對象。如果我沒有錯,這個參考被存儲在b中。那麼最初的Box是什麼?根據我讀過的內容,這是定義Box的類。雖然我不確定。這使我想到我的下一個問題。

我試圖瞭解初始期限在聲明中表示,以我嘗試了這一點:

class LOL 
{ 
    public static void main(String args[]) 
    { 
     Box b=new Box(); 
     Cup c=new Cup(); 
     Box f=new Cup(); //***** 
     f.daa(); //Prints Box.daa 
     f.display(); //Prints Cup.display 
     f.disp(); //ERROR! 
    } 
} 
class Box 
{ 
    void display() 
    { 
     System.out.println("Box.display"); 
    } 
    void daa() 
    { 
     System.out.println("Box.daa"); 
    } 
} 
class Cup extends Box 
{ 
    void display() 
    { 
     System.out.println("Cup.display"); 
    } 
    void disp() 
    { 
     System.out.println("Cup.disp"); 
    } 
} 

那麼,什麼是怎麼回事?線*****實際上做了什麼?創建的對象的類型爲Cup(我認爲),爲什麼它不能調用f.disp()?我的頭不能包裹這個。

+0

在'Box f = ...'中,'Box'是變量'f'的類型。這意味着它可以存儲對「Box」類型的任何引用,並且包含任何子類型。 –

+0

「那麼最初的」Box「是什麼? Java是一種靜態和強類型的語言。這意味着:每個變​​量都有一個在編譯時已知的類型,您只能將該類型的值(或子類型,即子類)賦值給此變量。 'Box b'說:「我想要一個名爲'b'的變量,它的(靜態)類型是'Box''。然而,在運行時,'b'引用的對象可以是「Box」或「Box」的任何子類(例如,在您的示例中爲「Cup」)。 – Turing85

+0

@ Turing85你的評論應該是一個答案 –

回答

1

Box f = new Cup();創建一個新的杯子並將其存儲在Box類型的變量f中。下面的代碼看到fBox類型,並將其視爲這樣。由於Box沒有稱爲disp()的方法,因此無法執行f.disp()

在致電disp()之前,您必須將Box f...更改爲Cup f...或者將f改爲輸入Cup

+0

好吧,所以對象是杯型的,但它下面的代碼認爲它是Box的類型?所以只有Box內容可以訪問? –

+0

你是非常接近的:對象是類型爲Cup和Box類型的對象,因爲Cup也是一個Box(Cup是Box的子類)。下面的代碼只知道它是一個Box對象(因爲它是一個Box變量),因此只能訪問Box成員 – Breeze

+0

啊,是的,我現在明白了。清理完了!雖然沒有足夠的代表upvote:p –

0

您需要了解面向對象的概念。在這裏你需要應用基本繼承和重寫概念。

  • CupBox的子類。
  • Boxdisplay()daa()方法。
  • Cup已覆蓋的Boxdisplay()方法,繼承daa()Cup本身disp()方法。

Box f = new Cup(); 

在這裏,你創建的Cup一個對象,它是在Box型參考舉行,這是可以做到,因爲CupBox

f.disp(); 

這給出了一個編譯錯誤作爲disp()方法,因爲它沒有在Box類中定義不能在編譯時解決。

+0

我喜歡這個解釋,謝謝。 「因爲杯子是一個盒子」明確表示 –

相關問題