多态
多态是方法的多态,属性没有多态
同一方法可以根据发送对象的不同而采取多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
一
子类Student
package demon04; public class Student extends Person { }
父类Person
package demon04; public class Person { public void run(){ System.out.println("你好"); } }
main方法
import demo03.A; import demo03.B; import demo03.Person; import demo03.Student; public class Application { public static void main(String[] args) { //一个对象的实际类型是确定的例如new Student()、new Person() //但是可以指向的引用类型就不确定了例如:父类的引用可以指向子类 Student s1=new Student(); Person s2=new Student();//父类的引用指向子类类型 s2.run(); } }
结果输出:你好 (虽然new student但是仍然走的是父类的方法。因为子类继承了父类的方法)
二
student
package demon04; public class Student extends Person { @Override public void run() { System.out.println("son"); } public void eat(){ System.out.println("eat"); } }
person
package demon04; public class Person { public void run(){ System.out.println("run"); } }
main
import demo03.Person; import demo03.Student; public class Application { public static void main(String[] args) { //一个对象的实际类型是确定的例如new Student()、new Person() //但是可以指向的引用类型就不确定了例如:父类的引用可以指向子类 Student s1=new Student(); Person s2=new Student();//父类的引用指向子类 s2.run();//如果子类没有重写父类则调用父类;如果重写了父类则调用子类 s1.run(); //对象能执行那些方法,主要看对象左侧的类型。 s2.eat();//会报错,因为s2是Person类型,Person里面没有eat方法;;正确的写法IDEA会自动生成((Student)s2).eat() //上面的Studen是子类可以调用自己的和父类的方法;;Person只可以调用自己的方法 } }
多态注意事项
1、多态是方法的多态
2、父类和子类有联系 类型转换存在异常!ClassCastException
3、存在条件:继承关系,方法需要重写,父类引用指向子类对象! Father f1=new Son();