繼承與多態 動手動腦
【1】
為什麽子類的構造方法在運行之前,必須調用父類的構造方法?能不能反過來?為什麽不能反過來?
提示:
構造函數的主要作用是什麽?
從這個方面去想!
【答】
構造函數(constructor)是一種特殊的方法。主要用來在創建對象時初始化對象,即為對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中。特別的一個類可以有多個構造函數,可根據其參數個數的不同或參數類型的不同來區分它們即構造函數的重載。構造函數的功能主要用於在類的對象創建時定義初始化的狀態。
構造一個對象,先調用其構造方法,來初始化其成員函數和成員變量。
子類擁有父的成員變量和成員方法,如果不調用,則從父類繼承而來的成員變量和成員方法得不到正確的初始化。
不能反過來調用也是這個原因,因為父類根本不知道子類有什麽變量而且這樣一來子類也得不到初始化的父類變量,導致程序運行出錯!
【2】
請自行編寫代碼測試以下特性(動手動腦):
在子類中,若要調用父類中被覆蓋的方法,可以使用super關鍵字。
【答】
源代碼:
public class M1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Children c=new Children();
}
}
class Parent
{
public Parent()
{
System.out.println("父類方法!!!");
}
public Parent(String s)
{
System.out.println(s);
}
}
class Children extends Parent
{
public Children()
{
super("調用父類方法!!!");
//System.out.println("");
System.out.println("孩子方法!!!");
}
}
截圖:
【3】
public class ParentChildTest {
public static void main(String[] args) {
Parent parent=new Parent();
parent.printValue();
Child child=new Child();
child.printValue();
parent=child;
parent.printValue();
parent.myValue++;
parent.printValue();
((Child)parent).myValue++;
parent.printValue();
}
}
class Parent{
public int myValue=100;
public void printValue() {
System.out.println("Parent.printValue(),myValue="+myValue);
}
}
class Child extends Parent{
public int myValue=200;
public void printValue() {
System.out.println("Child.printValue(),myValue="+myValue);
}
}
(1)當子類與父類擁有一樣的方法,並且讓一個父類變量引用一個子類對象時,到底調用哪個方法,由對象自己的“真實”類型所決定,這就是說:對象是子類型的,它就調用子類型的方法,是父類型的,它就調用父類型的方法。
這個特性實際上就是面向對象“多態”特性的具體表現。
(2)如果子類與父類有相同的字段,則子類中的字段會代替或隱藏父類的字段,子類方法中訪問的是子類中的字段(而不是父類中的字段)。如果子類方法確實想訪問父類中被隱藏的同名字段,可以用super關鍵字來訪問它。如果子類被當作父類使用,則通過子類訪問的字段是父類的!
繼承與多態 動手動腦