多态
(1)多态是方法的多态
(2)父类和子类要有联系,类型转换异常:Class Cast Exception!
(3)多态存在的条件:继承条件,方法需要重写,父类引用指向子类的对象!!
一个对象new Student
的实际类型是确定的Student
,但可以指向的引用类型是不确定的。
引用类型 对象名 = 对象的值(new 类名)
Student s1 = new Student();
Person s2 = new Student();//父类的引用指向子类对象,s2为Person类
Object s3 = new Student();//父类的引用指向子类
- 当子类的引用指向自己的类时,该对象存在的方法:子类Student的方法,以及继承的父类方法;
- 当父类的引用指向子类,该对象存在的方法:父类Person的方法,以及被子类重写的子类的方法,但不能调用子类独有的方法。可以执行哪些方法,看左边定义的引用类型:
- 当父类的方法中没有被重写就调用父类的方法;
- 当父类的方法被子类重写就调用子类的方法。
例:
父类:Person
public class Person {
public void run(){
System.out.println("run");
}
public void earn(){
System.out.println("earn money!");
}
}
子类:Student
public class Student extends Person{
//子类重写父类的run()方法
@Override
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
main
方法:
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Student();
//new Person();
//可以指向的引用类型就不确定了
//引用类型 对象名 = 对象的值
//子类Student的方法,以及继承的方法
Student s1 = new Student();
//父类Person的方法,以及被子类重写的子类的方法,但不能调用子类独有的方法
Person s2 = new Student();//父类的引用指向子类对象,s2为Person类
Object s3 = new Student();//父类的引用指向子类
//对象可以执行哪些方法,看左边定义的引用类型
//s2,父类的方法没有被重写就调用父类的方法
//s2,父类的方法被子类重写就调用子类的方法
s1.run();//打印输出son
s2.run();//打印输出son,Student子类重写Person父类的方法,执行子类的方法
s1.eat();//打印输出eat
//s2.eat();//报错,s2的左边引用类型为Person无eat()方法
((Student) s2).eat();//把s2强制装换成Student类型,然后调用其独有的方法
s2.earn();//Person类特有的方法
}
运行结果:
son
son
eat
eat
earn money!