java基础之多态的详细解释_Java基本概念:多态

一、简介

描述:

多态性是面向对象编程中的一个重要特性,主要是用来实现动态联编的。换句话说,就是程序的最终状态只有在执行过程中才被决定,而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性。

多态允许相同类域的不同对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。

多态可以让我们不用关心某个对象到底是什么具体类型,就可以使用该对象的某些方法,从而实现更加灵活的编程,提高系统的可扩展性。

如果对象的编译时类型和运行时类型不一致,就会造成多态。

存在条件:

类之间有继承关系。

子类重写父类方法。

父类引用指向子类对象。

注意:

多态是方法的多态,属性没有多态性。

一个对象的实际类型是确定的,但是可以指向这个对象的引用的类型,却是可以是这对象实际类型的任意父类型。

子类继承父类,调用方法,如果该方法在子类中没有重写,那么就是调用的是子类继承父类的方法,如果重写了,那么调用的就是重写之后的方法。

'protected'修饰的父类方法可以被子类见到,也可以被子类重写,但是它是无法被外部所引用的,所以没有多态性。

通过一个变量调用其引用的对象的一个方法,编译器是否能让其编译通过,主要是看该变量类型的类中有没有定义该方法,如果有则编译通过,如果没有则编译报错。而不是看这个变量所引用的对象中有没有该方法。

Java中的方法调用,是运行时动态和对象绑定的,不到运行的时候,是不知道到底哪个方法被调用的。

编写程序时,如果想调用运行时类型的方法,只能进行类型转换,不然通不过编译器的检查。但是如果两个没有关联的类进行强制转换,会报类型转换异常:ClassCastException。

示例:

public class Test { public static void main(String[] args) { /* 编译看左,运行看右 */ Student student = new Student(); /* 变量person是可以指向Person类型或其子类型的对象,所以可以指向Student类型对象 */ Person person = new Student(); /* 变量student能调用的方法是Student类中有的方法(包括继承过来的) */ student.say();//Student /* 变量person能调用的方法是Person类中有的方法 */ person.say();//Student }}class Person { public void say() { System.out.println("Person"); }}class Student extends Person { public void say() { System.out.println("Student"); }}

二、重写、重载、多态的关系

重载是编译时多态

调用重载的方法,在编译期间就要确定调用的方法是谁,如果不能确定则编译报错 。

重写是运行时多态

调用重写的方法,在运行期间才能确定这个方法到底是哪个对象中的。

重写方法所属取决于调用方法的引用,在运行期间所指向的对象是谁,那么调用的就是该对象中的方法。

三、方法绑定

程序执行调用方法时,系统根据相关信息,能够执行内存地址中代表该方法的代码。

根据绑定方法的代码的时机不同,分为静态绑定和动态绑定。

静态绑定:

在编译期完成,可以提高代码执行速度。

动态绑定:

通过对象调用的方法,采用动态绑定机制。

这虽然让我们编程灵活,但是降低了代码的执行速度。

Java所有方法都是JVM在运行期才进行动态绑定的.........

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值