public class Person { public void run(){ } } public class Student extends Person{ @Override public void run() { System.out.println("son"); } public void eat(){ System.out.println("eat"); } } import com.oop.demo07.Person; import com.oop.demo07.Student; public class Applicate{ public static void main(String[] args) { //一个对象的实际类型是确定的 //new Student(); //new Person(); //可以指向的引用类型就不确定了 父类的引用指向子类 //Student能条用的方法都是自己或者继承父类的 Student s1 = new Student(); //Person父类型,可以指向子类,但是不能调用子类独有的方法 Person s2 = new Student(); //s2.eat 实际上s2的实际类型是Student,但是为什么不能调用eat方法是因为编译器判断s2是Person,导致编译错误!而不是s2的方法区中没有eat方法! s1.eat(); s1.run(); s2.run();//因为实际创建的是Student类,所以run方法被子类重写,调用的是子类的run方法! //对象能执行哪些方法,主要看对象的类型,和右边关系不大 } } /* 多态是方法的多态,属性没有多态 父类和子类,有联系 类型转换异常!ClassCastException 存在条件:继承关系:方法需要重写,父类引用指向子类 */