多态就是一种事务在不同时间体现出不同的形态就叫多态。
4.1多态的前提条件
- 具有继承关系extends
- 需要存在方法的重写
- 必须是父类指向子类对象
4.2格式
向上继承:
格式: Fu fu = new Zi() ;
向下继承:父类想使用子类的方法则需要向下转型
格式: Zi zi = (Zi)fu;
多态中(向下转型使用不当,会出现ClassCastException异常)
4.3多态的特点
- 针对成员变量的访问:编译看左运行看左
- 针对成员方法的访问:编译看左运行看右
- 如果成员方法是静态static 方法:编译看左运行看左
- 构造方法:需要先初始化父类的构造方法然后再初始化子类。分层初始化
4.4 多态的好处
- 提高代码的复用(由继承保证)
- 提高了代码的扩展性(由多态保证)
4.5 多态中的关键字 final
- 修饰变量:变量被fianl修饰后,如果一经赋值则不能更改
- 修饰方法:该方法不能被重写
- 修饰类:该类不能被继承(该类对象的地址值不会改变)
class People{
private String name;
private int age;
private String gender;
final String nationality ="中国";
public People(){}
public People(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
//特有的方法
public static void eat(){}
public void sleep(){}
public final void study(){
System.out.println("学习");
}
}
class student extends People{
public student() {}
public student(String name, int age, String gender) {
super(name, age, gender);
}
@Override
public void sleep() {
System.out.println("这个是子类的睡觉");
}
public void goToSchool(){
System.out.println(this.getName()+getAge()+"岁"+getGender()+super.nationality+"去上学");
}
}
//测试类
public class finalDemo {
public static void main(String[] args) {
// 通过有参构造进行数据初始化,父类指向子类对象。
// 向上转型
People p = new student("学生" ,35 , "女");
p.sleep();
// 向下转型访问子类特有的方法
student s= (student)p;
s.goToSchool();
}
}