2014-04-13 134 views
1

考慮下面的代碼:繼承:instanceof運算符混淆

class B 
{ 
    int j =100; 
} 

class A extends B 
{ 
    int i=10; 
} 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     A obj =new A(); 
     System.out.println(obj); 
     B obj1 =obj; 

     System.out.println(obj1); // here i am confused 

     if(obj1 instanceof A) 
     { 
       System.out.println("yes"); //here i am confused 
     } 
    } 
} 

這裏的輸出爲:

[email protected] 
[email protected] 
yes 

現在obj1是B類的一個實例,它是父類,那麼,爲什麼toString()顯示它是A的對象?另外,instanceof運算符如何顯示它是類A的實例?

+0

OBJ1仍然是由類生成對象Obj,A – Outsider

+0

你應該問自己的是:什麼是'instanceof'的目的,如果在這種情況下評估,以虛假的? – Radiodef

回答

5

您必須區分參考和實際的對象

B obj1 = obj; 

在這裏,你創建一個名爲obj1B類型的新參考。雖然引用的對象仍然是A對象,但永遠不能更改。

0

現在OBJ1是B類的一個實例,這是超

這是不正確的,obj1仍然是A的一個實例你只是碰巧父類的指針賦值給一個已經A級的現有指針


如果你想B類的一個實例,只是這樣做:

B b = new B(); 

如果你想一個類的實例,你可以這樣做:

A a1 = new A(); 

B a2 = new A(); 

後來,a2,是正確的,因爲A是B型。但是,a2仍A的一個實例,因爲我們使用new A()

1

obj1指向obj,它是A的一個實例(請參閱新的A())。在左邊你只是引用超類。您的OBJ1將只能看到B.方法OBJ將能夠看到在B和A(視正確的訪問)

從Java跟蹤中的所有方法

Declaration: The code left of the = associates a variable name with an object type. 
Instantiation: The new keyword is a Java operator that creates the object. 
Initialization: The new operator is followed by a call to a constructor, which initializes the new object. 
1
  • 有ISN」在你的代碼中任何toString方法,你打印內存佔位符(Java不允許你在內存中看到對象的確切位置)。

當你做「延伸」,你說「A是B的兒子」,然後在行:

A obj =new A(); 
System.out.println(obj); 

您創建一個對象,並打印是內存佔位符(請記住,是B的兒子,所以如果你想描述它,想象一個名爲A的盒子和一個名爲B的盒子連接到她(在她的頂部,因爲它是她的父親))。

現在,在接下來的幾行:

B obj1 =obj; 
System.out.println(obj1); // here i am confused 

您創建一個名爲OBJ1另一個對象,並分配他的所以內存佔位符,它是您創建的第一個對象,叫OBJ。你如何將一個對象分配給B?多態性! 1並再次打印它的內存佔位符。

下一步怎麼做,如果:

if(obj1 instanceof A){ 
    System.out.println("yes"); //here i am confused 
} 

所以,OBJ1是A的一個instanceof(這是一個和在她之上的盒B的盒(它的父親,多態性)),和你打印「是」。

  • 在多態性打印最低的方法,讓你打印一個方法,如果有任何,而如果沒有你「攀登」的父親和檢查那裏等..

Polymorphism (computer science)