一. 多態數組:
- 多態數組:多態在Java應用程序中被廣泛使用。多態數組是多態的用途之一。
- 多態數組—在引用類型的數組中,使用多態形式存放對象。
- 例:要求創建五個年齡不等的Person、Student和Teacher對象,並將他們按年齡排序輸出,應當如何實現?(Person父類 , Student和Teacher是子類)
public class Test{
public static void main(String[] args){
Person[] person = { new Person(“張三”,32),
new Student(“李四”,21,120,90.0),
new Student(“王五”,25,110,91.5),
new Teacher(“劉老師”,35),
new Teacher(“王老師”,40)};
for(int i=0;i<person.length-1;i++){
for(int j=i+1;j<person.length-1;j++){
if(person[i].getAge()<person[j].getAge()){
Person p = person[i];
Person[i] = person[j];
Person[j] = p;
}
}
}
}
}
- 因爲computer和pc和notepad是子父類關係所以可以放到computer數組中。所有對象都可以放到object數組中。
public class Test{
public static void main(String[] args){//Computer爲父類,Notepad,PC爲子類
Computer c1 = new Computer();
NotePad n1 = new NotePad();
PC p1 = new PC();
Computer c2 = new PC();
Computer c3 = new NotePad();
Computer[] coms = new Computer[5];
Object[] obj = new Object[5];
coms[0] = c1;
coms[1] = n1;
coms[2] = p1;
coms[3] = c2;
coms[4] = c3;
}
}
- 當沒有子父類關係時,就不能子類代替父類傳參(下圖Student爲Person的子類)(當Student獨立時,method(s)顯示錯誤)
public class Test{//父類:p 屬性name //子類:S 屬性 score
public static void main(String[] args){
Person p = new Person();
p.setName(“張三”);
Student s = new Student();
s.setName(“小紅”);
s.setScore(30.2);
method(s);
}
public static void method(Person p){
system.out.println(p.getName);
}
}
二. 抽象類:
- 抽象類:隨着繼承層次中一個個新子類的定義,;類變得越來越具體,而父類則更一般,更通用。類的設計應該保證父類和子類能夠共享特徵。有時將一個父類設計的非常抽象,以至於它沒有具體的實例,這樣的類叫做抽象類。
- abstract class
- 用abstract關鍵字來修飾一個類時,這個類叫做抽象類;
- 用abstract來修飾一個方法時,該方法叫做抽象方法。
- 抽象方法:只有方法聲明,沒有方法的實現。以分號結束: abstract int abstactMethod(int a);
- 含有抽象方法的類必須被聲明爲抽象類。
- 抽象類不能被實例化。抽象類是用來被繼承的,抽象類的子類必須重寫父類的抽象方法,並提供方法體。若沒有重寫全部的抽象方法,仍爲抽象類。
- 一個普通的類繼承一個抽象類時必需要重寫父類抽象方法
如果子類是抽象類就不用重寫(也可以寫)
//抽象類
public abstract class Animal{
public String name;
public int age;
//抽象方法(abstract修飾,所以沒有方法體)
public abstract void sleep();
}
public class Student extents Animal{//需要重寫
private int id;
private double score;
public abstract void sleep(){
System.out.println(“hello!”);
}
}
public abstract class Student extents Animal{//不需要重寫
private int id;
private double score;
}
- 不能用abstract 修飾屬性、私有方法、構造器、靜態方法、final的方法。