java多态
多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。多态也称作动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
通俗地讲,只通过父类就能够引用不同的子类,这就是多态,我们只有在运行的时候才会知道引用变量所指向的具体实例对象。
要理解多态必须要明白什么是"向上转型",比如,一段代码如下,Dog 类是 Animal 类的子类:
Animal a = new Animal(); //a是父类的引用指向的是本类的对象
Animal b = new Dog(); //b是父类的引用指向的是子类的对象
copy
在这里,可以认为由于 Dog 继承于 Animal,所以 Dog 可以自动向上转型为 Animal,所以 b 是可以指向 Dog 实例对象的。
注:不能使用一个子类的引用去指向父类的对象。
如果定义了一个指向子类对象的父类引用类型,那么它除了能够引用父类中定义的所有属性和方法外,还可以使用子类强大的功能。但是对于只存在于子类的方法和属性就不能获取。
新建一个Test.java,例如:
class Animal {
//父类方法
public void bark() {
System.out.println("动物叫!");
}
}
class Dog extends Animal {
//子类重写父类的bark方法 public void bark() { System.out.println("汪、汪、汪!"); } //子类自己的方法 public void dogType() { System.out.println("这是什么品种的狗?"); }
}
public class Test {
public static void main(String[] args) { Animal a = new Animal(); Animal b = new Dog(); Dog d = new Dog(); a.bark(); b.bark(); //b.dogType(); //b.dogType()编译不通过 d.bark(); d.dogType(); }
}
copy
编译运行:
java Test
动物叫!
汪、汪、汪!
汪、汪、汪!
这是什么品种的狗?
copy
在这里,由于 b 是父类的引用,指向子类的对象,因此不能获取子类的方法(dogType()方法),同时当调用 bark()方法时,由于子类重写了父类的 bark()方法,所以调用子类中的 bark()方法。
因此,向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法,也会覆盖与父类中相同的方法——重写。(方法名,参数都相同)