Java中多态(向上转型)机制

1.为什么向上转型?

所谓多态,也即向上转型,就是某个对象的引用视为对其基类的引用,编译对象是基类,运行对象是父类。向上转型的对象由于Java后期绑定的特点,若父类重写了基类中的方法,则它调用的是父类中的方法,其余调用的是基类中的方法。通过多态,我们可以减少代码的冗余,当多个类继承某个基类时,我们希望引用对象调用他们自身的方法,这时只需要写出一条基类的对象引用即可。

2.代码实现

class A{
    void a(){
        System.out.println("A:a()");
        b();
    };
    void b(){
        System.out.println("A:b()");
    }
}
public class Oos extends A{
    void b(){
        System.out.println("B:b()");
    }
    public static void main(String args[]){
        A test=new Oos();
        test.a();
    }
}

这个例子中,test即为向上转型的对象,它调用a()方法时,因为子类中没有a()方法,所以调用的是父类的a()方法,在父类a()方法中,又调用了本身的b()方法,而它在子类Oos中有重写过,因此调用的是子类中的b()方法。输出如下所示:

 

3.缺陷

(1)只有非private方法才能覆盖,因为private默认为final类型,当父类中的方法为private时,子类中的非private同名方法视为全新的方法,后期不会绑定它父类中的方法。代码如下;

class A{
    void a(){
        System.out.println("A:a()");
        b();
    }
    private void b(){
        System.out.println("A:b()");
    }
}

public class Oos extends A{
    public void b(){
        System.out.println("B:b()");
    }
    public static void main(String args[]){
        A test=new Oos();
        test.a();
    }
}

结果为:

(2)对于基类和父类的数据成员,向上转型对象不会覆盖数据成员,代码如下:

class A{
    int i=0;
    void a(){
        System.out.println("A:a() i="+i);
        b();
    };
    void b(){
        System.out.println("A:b()");
    }
}

public class Oos extends A{
    int i=1;
    void b(){
        System.out.println("B:b() i="+i);
    }
    public static void main(String args[]){
        A test=new Oos();
        test.a();
    }
}

结果为:

可以看到B中覆盖的方法中i的值还是自己类中的值,不会覆盖数据成员。

(3)静态方法方法不具有多态性,因为静态方法在编译前就已被初始化,不具有后期绑定的特点。代码省略。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值