动态编译:类型:可扩展性
即同一方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但是可以指向对象的引用类型有很多
多态存在的条件
有继承关系
子类重写父类方法】
父类引用指向子类方法
instance of
package oop.Test05; public class Student extends Person { @Override public void run(){ System.out.println("son"); } public void eat(){ System.out.println("eat"); } }
package oop.Test05; public class Application { public static void main(String[] args) { //new Student(); //一个对象的实际类型是确定的 //new Person() //可以指向的实际类型是不确定的 //父类的引用指向子类 //student能调用的方法都是自己的或者继承父类的 Student s1= new Student(); //person父亲型,可以指向子类,但是不能调用子类独有的方法. Person s2=new Student(); Object s3=new Student(); //对象能执行那些方法主要看左边的类型,和右边的关系不大 s2.run();//子类重写了父类的方法,执行子类的方法 s1.run(); s1.eat(); s1.eat(); ((Student)s2).eat(); } }
package oop.Test05; public class Person { public void run(){ System.out.println("run"); } }
可能存在异常:
ClassCastException!