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()方法。

因此,向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法,也会覆盖与父类中相同的方法——重写。(方法名,参数都相同)

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务