繼承
1. 繼承環境下的子類對象構造問題
Animal.java
Tiger.java
【即】得先打掃(構造)父類再打掃(構造)子類
2. 繼承環境下的引用變量指向問題
① 父類引用變量可以指向子類對象(萎縮效應)
Tiger a=new Tiger();//年輕人用iPhone6
Animal a=new Tiger();//中年人用iPhone6
Object a=new Tiger();//老年人用iPhone6
② 子類引用變量不能指向父類對象
Tiger a=new Animal();//×動物不可以當成老虎
重載
參數不同則構成重載,具體規則如下:
- 參數數量不同
- 對應參數位置的參數數據類型不同
案例:
int add( int a , int b);
int add( int a, int b, int c);
int add(int a, double c);
int add( int a, int d); [參數名不列入重載考慮範圍,構成重名]
void add( int a, int b); [返回值不列入重載考慮範圍,構成重名]
編譯器本質上是不允許方法重名的,這在面向對象編程語言中也是這樣的, 在程序員的呼籲中,編譯器的開發者提供了能夠名字重複使用的機制,但編譯器最終將把方法名做修正,比如:
int add( int a , int b); add_int_int
int add( int a, int b, int c); add_int_int_int
重寫
重寫的模式從內容實現上分爲2種:
- 改良性,補充型重寫:對父親提供的方法內容進行補充。(保留父類方法)
- 顛覆性重寫:完全否定父親所提供的方法內容,徹底改寫。
重寫不是覆蓋掉父親的方法,父親該方法在子類內部還是存在的。在內存中,體現爲子類和父類兩個同簽名方法共存的現象。在子類方法中,可以通過super.來顯示調用父類被重寫的方法,如果不用super. ,則表示調用子類的該重寫方法。
繼承環境下子類方法設置的可能情況:
Class A{
void sayHello(int a, int b)
}Class B extends A{
Void sayHello(int a, int b){ //在子類中,出現和父類方法同簽名,則爲重寫
……..
}Void tellYouSomething(int a){ //方法名和所有父類方法均不同,稱爲子類自定義新方法
}Void sayHello(int a, int b, int c){ //子類對父類方法的簽名做部分改造,叫做跨類重載
}
}
補充:
多態
Tiger.java
chineseTiger.java
Tester.java
多態用法舉例
【即】爲今後變成框架代碼提供了可能,適合用來編寫通用底層代碼
不定參數
double add(int a, int b, double... m){ //m是一個double型數組
double sum=a+b;
for(int i=0;i < m.length;i++)
sum=sum+m[i];
return sum;
}
不定參數是爲了方便參數數量不確定的情況,以提高方法簽名的高度兼容性。
m最終將會被理解爲 double[], 一個方法簽名的不定參數只能有一個,而且是最後一個。
舉例:
public class VariArgs {
public static void main(String[] args) {
test();
test("aaa");
test("aaa", "bbb");
test("aaa", "bbb", "ccc");
}
public static void test(String... args) {
System.out.println(args.getClass());
for (String arg : args) {
System.out.println(arg);
}
}
}