Java多态分析

多态的唯一目的就是实现所谓的“动态绑定”。

什么叫动态绑定?

除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问. 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定。若在程序执行前进行绑定(例如编译期)的话,叫做前期绑定,或静态绑定,但是它不能利用任何运行期的信息(c语言c++语言都是前期绑定)。相应的,在运行时候根据对象的类型进行绑定叫后期绑定,也叫动态绑定。也就是说,如果一个语言想实现后期绑定,就必须具有某种机制,以便能够在运行时能判断对象的类型,从而调用恰当的方法。动态绑定的好处是允许继承类来改变父类的行为,同时可以保持父类的接口和功能。

在java中,除了static方法和final方法(private方法属于final方法)之外,其他的都默认进行后期绑定(就是可以多态)。如果将一个方法声明为final或者static或者private,就告诉编译器不需要对该方法动态绑定。这样,编译器就可以可以为final方法调用生成更有效的代码()。

  类的一个成员若想表现多态必须可以被覆盖:

  对于成员变量而言,不会发生覆盖现象(会隐藏),在子类出现相同变量的定义时只会隐藏父类变量,因此不会表现多态。同时变量调用在编译时就会解析,不符合动态绑定的特征;

  在成员方法中,静态方法和final方法(private方法)也不会发生覆盖现象(会隐藏),因此也不会表现多态性。只有除静态方法和final方法以外的方法才会表现多态性。

例子:

class Base{
       
       public int a=2;
       public void method(){
           System.out.println("base:method");
       }
       int getA(){
           return a;
       }
   }
   
   class Sub extends Base{
       public int a=3;
       public void fmethod(){ 
           System.out.println("sub:method");
       }
       //子类方法可视范围可以扩大
       public int getA(){
           return a;
       }
   }
   public class Test {
   
       public static void main (String args []) {
           Base  b=new Sub();
           //方法多态,输出sub:fmethod
           b.fmethod();
           //属性不能多态,输出为2.
           System.out.println(b.a);
           //但是可以通过方法来实现属性的多态,输出3
           System.out.println(b.getA());
       }
     
   }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值