2013-10-02 45 views
0

我有2名對象中定義Java繼承類與主方法

在對象-1,當我引用子對象時,它將調用子方法M1(),而在對象2時我參考子方法M1( ),它引用父對象..

在這兩個我認爲父對象將保持在運行一個子類對象的情況下...

對象1

package pkgB; 

    class Parent{ 
     static int i = 10; 
     void m1(){ 
      System.out.println("In Parent = " + i); 
     } 

     static void m1(String s){ 
      System.out.println(s +i); 
     } 
    } 

    public class Child extends Parent{ 
     static int i = 20; 
     void m1(){ 
      System.out.println("In child" + Child.i); 
     } 
     public static void main(String[] args){ 
      Parent p = new Child(); 
      p.m1(); 

     } 
    } 

對象2

package pkgB; 



class Drink{ 
    public static void m1(){ 
     System.out.println("Im Drink method"); 
    } 

} 

class Coffee extends Drink{ 
    public static void m1(){ 
     System.out.println("Im Coffee method"); 
    } 

} 

public class test { 

    public static void main(String[] args) { 
     Drink d = new Coffee(); 
     d.m1(); 

    } 
} 

輸出Dobject-1:

In child20 

輸出Dobject-2:

Im Drink method 
+0

你不能覆蓋靜態方法。除此之外,您不應該在實例上調用靜態方法。 (您的IDE應顯示警告!) – dognose

回答

1

靜態方法由它們的類型被稱爲同時基於所述對象上調用實例方法類型。 靜態方法沒有被覆蓋

當你說,

Parent p = new Child(); 
    p.m1(); 

您正在創建ParentChild對象類型的引用類型。 m1()是實例方法,因此是無效,該Child方法被調用,因爲對象的類型Child

,但是當你說,

Drink d = new Coffee(); 
    d.m1(); 

這裏,m1()static方法,這必將對類類型。所以d.m1()將調用static方法dDrink

1

類型的在第二個例子中,m1()方法是靜態的方法。在執行d.m1()時,編譯器應該給出警告,這是關於以非靜態方式引用靜態方法的一些信息。

無論如何,當你在第二個例子調用d.m1(),你真的叫Drink.m1()因爲d被宣佈爲Drink

0

調用靜態方法,使用參考變量意味着你在Sin的狀態:)

靜態方法/變量是單獨類的一部分並且不能被重寫。