java中的多态的概念_java中多态的概念

多态的概念

多态==晚绑定。

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

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

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

比如 Parent p = new

Child();

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

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

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

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

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

结合实例说明

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

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

多态示例代码

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!");

}

}

例子的执行结果:

a4c26d1e5885305701be709a3d33442f.png

这段代码:

a4c26d1e5885305701be709a3d33442f.png

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

a4c26d1e5885305701be709a3d33442f.png

两种类型的类型转换

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

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

a4c26d1e5885305701be709a3d33442f.png

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

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

a4c26d1e5885305701be709a3d33442f.png

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

不然也会编译出错:

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值