簡體   English   中英

具有main方法的Java繼承類

[英]Java Inheritance classes with main method

我定義了2個對象

在對象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

靜態方法按其類型調用,而實例方法則根據對象類型進行調用。 靜態方法不會被覆蓋

當你說,

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

您正在創建Parent對象的引用類型,但創建Child對象的對象類型。 m1()是實例方法,因此它被覆蓋,並且調用Child方法,因為對象的類型為Child

但是當你說

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

在這里, m1()是綁定到類類型的static方法。 所以d.m1()將調用static方法,因為dDrink類型

在第二個示例中, m1()方法是靜態方法。 執行d.m1() ,編譯器應向您發出警告,這與以非靜態方式引用靜態方法有關。

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

使用引用變量調用靜態方法意味着您處於Sin狀態:)

靜態方法/變量僅是類的一部分,不能被覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM