在Java中,對象的創(chuàng)建是通過new關(guān)鍵字進(jìn)行的。當(dāng)我們創(chuàng)建一個子類對象時,它會先調(diào)用父類的構(gòu)造函數(shù)來完成父類的初始化,然后再調(diào)用子類的構(gòu)造函數(shù)來完成子類的初始化。這樣,子類對象就包含了父類對象的所有成員變量和方法。
public class Animal { private String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println(name + " is eating"); } } public class Dog extends Animal { public Dog(String name) { super(name); } public void bark() { System.out.println("Woof!"); } }
在上面的例子中,Dog類繼承了Animal類,并且重寫了Animal的構(gòu)造函數(shù)。當(dāng)我們創(chuàng)建一個Dog對象時,它會先調(diào)用Animal的構(gòu)造函數(shù),然后再調(diào)用Dog的構(gòu)造函數(shù)。
Dog myDog = new Dog("Buddy"); myDog.eat(); // output: Buddy is eating myDog.bark(); // output: Woof!
在內(nèi)存中,此時會創(chuàng)建一個Dog對象,其中包含父類對象的所有成員變量和方法。也就是說,myDog對象中包含Animal對象。我們可以通過向上轉(zhuǎn)型或者強(qiáng)制類型轉(zhuǎn)換的方式來訪問Animal對象中的成員變量或者方法。
Animal myAnimal = myDog; // 向上轉(zhuǎn)型 myAnimal.eat(); // output: Buddy is eating ((Dog) myAnimal).bark(); // 強(qiáng)制類型轉(zhuǎn)換
在以上例子中,我們使用向上轉(zhuǎn)型把myDog對象轉(zhuǎn)換為Animal對象,并調(diào)用了eat()方法。同時,我們使用強(qiáng)制類型轉(zhuǎn)換把myAnimal對象轉(zhuǎn)換為Dog對象,并調(diào)用了bark()方法。因?yàn)閙yDog本來就是一個Dog對象,所以轉(zhuǎn)換是可行的。
總之,在Java中,子類對象會包含父類對象的所有成員變量和方法。我們可以通過向上轉(zhuǎn)型或者強(qiáng)制類型轉(zhuǎn)換的方式來訪問父類對象中的成員變量或者方法。