java 多态概念_【 转】Java多态的概念

http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html

多态==晚绑定。

不要把函数重载理解为多态。

因为多态是一种运行期的行为,不是编译期的行为。

多态:父类型的引用可以指向子类型的对象。

比如 Parent p = new Child();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;

如果有,再去调用子类的该同名方法。

(注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)

如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将p转换为子类Child类型的引用。

因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。

结合实例说明

下面举个例子(有问题的代码已注释):

主要讲讲两种类型转换和两种编译时候的错误。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png多态示例代码

48304ba5e6f9fe08f3fa1abda7d326ab.png

public class PolyTest

{

public static void main(String[] args)

{

//向上类型转换

Cat cat = new Cat();

Animal animal = cat;

animal.sing();

//向下类型转换

Animal a = new Cat();

Cat c = (Cat)a;

c.sing();

c.eat();

//编译错误

//用父类引用调用父类不存在的方法

//Animal a1 = new Cat();

//a1.eat();

//编译错误

//向下类型转换时只能转向指向的对象类型

//Animal a2 = new Cat();

//Cat c2 = (Dog)a2;

}

}

class Animal

{

public void sing()

{

System.out.println("Animal is singing!");

}

}

class Dog extends Animal

{

public void sing()

{

System.out.println("Dog is singing!");

}

}

class Cat extends Animal

{

public void sing()

{

System.out.println("Cat is singing!");

}

public void eat()

{

System.out.println("Cat is eating!");

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

例子的执行结果:

91bae14b8ff0c3b4a2bd9f11991b1ec8.png

这段代码:

4f0b6cb0053fcd37e2cad10c88a2779c.png

Cat类中定义了eat()方法,但是Animal类中没有这个方法,a1引用是Animal类的,所以找不到,编译时出错:

dab2cfdccf368de2950b04d1c469962e.png

两种类型的类型转换

(1)向上类型转换(Upcast):将子类型转换为父类型。

对于向上的类型转换,不需要显示指定,即不需要加上前面的小括号和父类类型名。

447f2a924361ee322aefc001b47b240b.png

(2)向下类型转换(Downcast):将父类型转换为子类型。

对于向下的类型转换,必须要显式指定,即必须要使用强制类型转换。

5956b636c10a280c64e35d0870d415eb.png

并且父类型的引用必须指向子类的对象,即指向谁才能转换成谁。

不然也会编译出错:

79c25610e5088fc61cbdbb43a3c09351.png

f2bfb922f3b509b9671d71d0b51ea29d.png

因为父类引用指向的是Cat类的对象,而要强制转换成Dog类,这是不可能的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值