多态是方法的多态,属性没有多态。
1、多态是继封装、继承之后,面向对象编程的第三大特性
2、现实中的事物通常会体现出多种形态,例如学生小明既是学生也是人,即出现了两种形态。Java作为面向对象的语言,同样可以描述一个事物的多种形态,如Student类继承了Person类,即一个Student的对象既是Student,又是Person
3、多态表现为父类引用变量可以指向子类对象,前提条件为必须存在继承关系并且要有方法的重写,在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
4、多态的调用格式:父类类型 变量名 = new 子类类型();
父类Person:
public class Person {
public void run(){
System.out.println("run");
}
}
子类Student:
public class Student extends Person{
public void run(){
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
测试类:
import com.oop.demo06.Person;
import com.oop.demo06.Student;
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
Person s2 = new Student();//父类的引用指向子类
Object s3 = new Student();//父类的父类,祖宗类
((Student) s2).eat();//子类重写了父类的方法,执行子类的方法
s1.eat();
s1.run();
s2.run();//子类重写父类方法后 父类子类都有run方法,执行子类的
//通过s1,s2分别调用,但是方法都走子类的方法
}
}
一个对象的实际类型是确定的:new Student ();/ new Person();
但是可以指向的引用类型就不确定了:父类的引用指向子类:Person s2 = new Student
对象能执行哪些方法主要看对象的左边的类型,和右边关系不大:代码中eat方法是子类的方法,直接用s2(父类型的)调用程序会报出错误,此时做一个强制转换((Student)s2).eat();
将Person转换为Student类型
Student(子类)能调用的方法都是自己的或者通过继承父类的。
Person(父类)可以指向子类,但是不能调用子类独有的方法。
执行结果:
子类重写了父类的方法后,执行子类的方法,所以s2输出son,不输出run