一个类的多种形式
多态就是同一方法作用的对象不同而出现不同的行为方式。
人话:完成一件事,由不同的人去解决,会有不同的解决方法。(哈姆雷特?)
编译时多态:通过 overloading(重载) 实现
运行时多态:通过 overriding(重写) 和 继承实现
实例:
package com.wnaoii.oop.Demo06; //父类 public class Person { public int age = 0; public void run() { System.out.println("run"); } }
和父类有继承关系的Student类:
package com.wnaoii.oop.Demo06; // 子类 public class Student extends Person { public int age = 19; // 重写父类的 run() 方法 @Override public void run() { System.out.println("子类run()方法被调用!"); } // 子类特有的方法 public void eat() { System.out.println("子类特有eat()方法被调用!"); } }
调用:
package com.wnaoii.oop; import com.wnaoii.oop.Demo06.Person; import com.wnaoii.oop.Demo06.Student; public class Application { public static void main(String[] args) { Student s1 = new Student(); // 父类的引用指向子类的对象(向上转型) Person s2 = new Student(); // 多态成员方法调用 s1.run(); // 能调用自己的和继承的方法 s1.eat(); // 类型是 Student 正常调用 System.out.println(); s2.run(); // 子类重写了父类的方法,所以优先执行子类的方法 // s2.eat(); s2的类型为 Person ,而Person中没有eat()方法,无法调用 System.out.println(); // 多态成员变量调用 System.out.println(s1.age); System.out.println(s2.age); } }
结果:
子类run()方法被调用! 子类特有eat()方法被调用! 子类run()方法被调用! 19 0
由此可以看出多态成员访问的特点:
成员变量:编译看父类(左边),运行看父类(左边)
成员方法:编译看父类(左边),运行看子类(右边)