Java面向对象中的多态性

        多态是面向对象程序设计语言的又一个重要特性,与继承密切相关。对于Java语言来说,Java源程序即(.java文件)经过Java编译器编译成字节码文件(即.class文件),再由Java虚拟机(即jvm)解释执行,由此得知:它存在两个时期:编译时期与执行时期。类的功能是通过类的方法来实现的,而在类的继承(上一篇博客)中,出现了方法的重写,那么,在上述两个时期,就有可能表现出不同的状态,这就是多态。
        多态的出现在满足以下条件的几种情况:
        1、具有继承(extends)或实现(implements)关系:继承是指子父类之间,可以是普通类与普通类之间,也可以是普通类与抽象类之间,抽象类与抽象类之间;实现是指实现类与接口之间,接口中只有抽象方法,无法实例化,需要重写来实现,同样抽象类也无法实例化,所以实现类只能是普通类。
        2、子类对父类的的方法进行了重写或者实现:子类定义了与父类相同的成员方法,这里的相同指方法声明如修饰符、返回值类型、方法名与参数列表,这种情况称为方法的重写,也称为方法覆盖;抽象方法也是如此。
        3、需要使用父类的引用指向子类的对象,接口的实现指向实现类的对象:例如,Object obj=new String();CharSequence cha=new String();。
        面向对象产生了引用数据类型,类比于基本数据类型,多态的实例化类似于基本数据类型的隐式转换,小范围的数据类型自动向大范围的数据类型转换,参照数据类型转换的概念,具有多态关系的类之间首先需要具有的是继承关系,这个关系限定了两个类是一个数据类型(自定义的数据类型);同理,引用数据类型同样有强制转换的用法,例如,String str=(String)obj;在父类对象的引用变量调用子类的方法时,同样需要强制转换,例如,int length=(String)obj.length();。

        多态的存在提高了程序的扩展性和后期的维护性。

        有的书籍中提到方法的重写需要遵循两个原则:

        1、改写后的方法不能比被重写的方法有更严格的访问权限:方法声明相同则不会产生这种问题;
        2、改写后的方法不能比被重写的方法有更多的意外:出现更多的意外则无法满足功能扩展的需求,没有重写的必要;
        所以我认为这两个问题可忽略。
        最后,多态到底有什么样的状态呢?
        对于非静态的方法,编译时期看父类,执行时期看子类:编译时的代码校验看父类,执行时的方法看子类,运行结果为子类的方法运行结果。
        对于静态的方法(static修饰),由于其在内存结构中的特殊地位(随类的加载而加载,且只加载一次),表现为编译与执行都看父类。
        在这里再补充上篇博客提到的变量隐藏,同样有静态与非静态的区别,表现与方法的重写相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值