多态
意指,不同类的对象对同一消息的不同响应。
意味着父类的变量可以指向(引用)子类对象。
菜鸟教程解释:
实例:
动态绑定:
方法可以在沿着继承链的多个类中实现。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实际上就是两个”无关”的方
法,因为私有方法是不能被子类重写的,私有方法并不是父类接
口的一部分,只是隐藏在父类中的一段程序代码。