多态
意指,不同类的对象对同一消息的不同响应。
意味着父类的变量可以指向(引用)子类对象。
菜鸟教程解释:
实例:
动态绑定:
方法可以在沿着继承链的多个类中实现。JVM决定运行时调用哪个方法。(在运行根据具体对象的实际类型进行绑定)
实例:
package chapter11; public class DynamicBindingDemo { public static void main(String[] args) { Object o = new GraduateStudent(); // implicit casting Object o1 = new Object(); if (o1 instanceof GraduateStudent) { System.out.println("Never got here"); GraduateStudent gs = (GraduateStudent)o1; // explicit casting } m(o); m(new Student()); m(new Person()); m(new Object()); } public static void m(Object x) { System.out.println(x.toString()); } } class GraduateStudent extends Student { } class Student extends Person { public String toString() { return "Student"; } } class Person extends Object { public String toString() { return "Person"; } }
ps:方法可以在父类中定义而在子类中重写~
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
结果:
Student Student Person java.lang.Object@7852e922
可看出,被调用的toString方法是在运行时动态绑定的!
从”太上皇类”cn,也就是object类开始往下找,一旦找到一个实现,停止查找,然后调用先找到的实现。而o调用那个方法由o的实际类型决定!
实例:
// Show the output of the following code: // (a) public class Test { public static void main(String[] args) { new Person().printPerson(); new Student().printPerson(); } } class Student extends Person { @Override public String getInfo() { return "Student"; } } class Person { public String getInfo() { return "Person"; } public void printPerson() { System.out.println(getInfo()); } } // (b) public class Test { public static void main(String[] args) { new Person().printPerson(); new Student().printPerson(); } } class Student extends Person { private String getInfo() { return "Student"; } } class Person { private String getInfo() { return "Person"; } public void printPerson() { System.out.println(getInfo()); } }
答案:
(a) Person Student (b) Person Person
ps:明确,子类是不能够覆盖(重写)父类的私有方法的。
因为:子类要能够重写父类的方法的前提条件是继承,子类对父类的私有方法并不继承,也没有访问权限,自然也是不能重写的。
父类的getInfo和子类的getInfo实际上就是两个”无关”的方
法,因为私有方法是不能被子类重写的,私有方法并不是父类接
口的一部分,只是隐藏在父类中的一段程序代码。