2012-09-14 97 views
1
class A2 { 
    int numt=111; 
    void hello() { 

    System.out.println("Hello from A2"); 
    } 
} 

class B2 extends A2 { 
    void hello() { 
    System.out.println("Hello from B2"); 
    } 
} 

class C2 extends B2 { 
    int numt=666; 
    void hello() { 
    System.out.println("Hello from C2"); 
    } 


} 

class MethodOverriding2 { 
    public static void main(String args[]) { 
    A2 obj = new C2(); 
    obj.hello(); 
    System.out.println("Num is : " + obj.numt); 
    } 
} 

不同所以基本上這裏的輸出是行爲變量和方法的繼承

Hello from C2 
Num is : 111 

爲什麼它從C2但NUMT從A2運行HELLO()?

據我所知,我繼承了A2進入B2,而C2進入了B2。然後在我的主要中,我創建了一個類C2的對象(它可以做,因爲A2是C2的超類)。 然後在編譯時代碼沒有滿足時沒有錯誤。 在運行時,程序查找'hello()',其中'obj'指的是引用而不是定義的位置。 但它對'numt'做了相反的處理。這是爲什麼?我的上述理解是否正確?如果不是,請糾正。

非常感謝!我知道這是一個新手問題,我對OOP很陌生。

回答

4

當您調用方法時,實例中的方法將被調用,而不是基於多態的引用類型。這裏你的對象是C2,儘管引用是A2類型的,所以C2中的方法將被調用。

訪問變量時,它的引用類型比對象類型多,因爲多態性不適用於字段。這就是爲什麼總是把你的變量設置爲私有的好設計,以便其他類不能直接訪問這些變量。

+0

+1我只是補充說,多態*只適用於不是final,static或private的方法*,它*不適用於字段*(這就是爲什麼OP得到111而不是666)。 – Pshemo

+0

@Pshemo:重要要點。感謝您添加評論。 – kosa

+0

好的,所以'A2 obj = new C2();'意思是obj是指A2?我認爲它是指C2。 – user1265125

0

其實在java中,成員變量不是多態的。所以如果你使用obj.numt,就不會有編譯器錯誤。但是如果你的obj是B2的引用,那麼你會得到編譯器錯誤。

在方法的情況下,它們是多態的。所以如果它是A2的對象,將會調用A2.hello()。如果它是B2的對象,則將調用B2.hello()。在C2的情況下也是如此。

class MethodOverriding2 { 
    public static void main(String args[]) { 
    // class member variables are not polymorphic(i.e. they are not inherited) 
    A2 obj = new C2(); // obj is of type A2, so obj.numt would print 111 
    B2 obj1 = new C2(); // obj1 is of type B2, so obj1.numt would give compiler error. 
    C2 obj2 = new C2(); // obj2 is of type C2, so obj2.numt would print 666 
    obj.hello(); // would call C2.hello() as obj points to object of C2 

    A2 obj3 = new B2(); // obj3 is of type A2 which points to object of B2 
    obj.hello(); // this would call B2.hello() 
    } 
} 
0

在第一種情況下,你重寫方法hello();在C2所以它打印:你好從C2

在第二種情況下,你沒有分配任何新的值給實例變量int numt,所以它打印:111。爲var分配新值。 numt這樣做:

obj.numt=666; 
0

你不能覆蓋方法的方式重寫字段。 它們不是多態的,所以你總能得到你所訪問字段類型的值。例如,您可以將它與「最終」方法進行比較,它們的行爲方式相似。