一. 多态数组:
- 多态数组:多态在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的方法。