即同一种方法可以根据发送对象的不同而采用多种不同的的行为方式。
一个对象的实际类型是确定的,但可以指向对象的引用的类型可以有很多
多态存在的条件:
注意: 多态是方法的多态,属性没有多态
新建一个Person父类:
public class Person { public void run(){ System.out.println("run"); } }
新建一个Student子类
public class Student extends Person{ @Override public void run() { System.out.println("run123"); } public void eat(){ System.out.println("eat123"); } }
新建一个主类Test:
public class Test { public static void main(String[] args) { // 一个对象的实例类型是确定的 // 可以指向的引用类型不确定,父类的引用指向子类 // Student 能调用的方法都是自己或者继承父类的! Student student1 = new Student(); // Person 父亲类 可以指向子类,但是不能调用子类独有的方法。 Person student2 = new Student(); Object student3 = new Student(); student1.run(); student2.run(); //子类重写了父类的方法,执行了子类的方法 ((Student) student2).eat();//强制类型转换 //对象能执行那些方法,主要看对象左边的类型,和右边的关系不大。 } }
运行截图: