java语言不允许方法覆盖_[原]java语言中方法覆盖的一点思考

在java的继承中,我们可以在子类中定义一方法去覆盖父类中定义的同名同参方法,这叫方法覆盖。其中有一点让我几经思考:父类的私有方法不能被子类覆盖。

我们先来看一个例程(引用孙MM的,呵呵):

//Sub.java  ,例程1

class Base

{

private String showMe()

{

return "Base";

}

public void print()

{

System.out.print(showMe());//调用谁的showMe()方法呢?

}

}

class Sub extends Base

{

public String showMe()

{

return "Sub";

}

public static void main(String[] args)

{

Sub sub=new Sub();

sub.print();

}

}

从例程中我们可以看到,在父类Base中定义了一private访问权限的showMe()方法,在子类Sub中又定义了public访问权限的showMe()方法。

运行这个例程,得到的打印结果是“Base”。

同样,我们将例程做些修改:将Base类的showMe()方法的访问权限改为public,即:

//Sub.java  ,例程2

class Base

{

public String showMe()

{

return "Base";

}

public void print()

{

System.out.print(showMe());

}

}

class Sub extends Base

{

public String showMe()

{

return "Sub";

}

public static void main(String[] args)

{

Sub sub=new Sub();

sub.print();

}

}

再次运行例程,得到的打印结果是“Sub”。

两次结果不一致,很显然是private在作怪,对!一开始我就提到了这点:父类的私有方法不能被子类覆盖。

在例程2中,sub.print()所调用的是自己的showMe()方法,此时,Sub类的showMe()方法已覆盖了父类的方法,所以在Sub类中继承Base类的print()方法所调用的就是自己的showMe()方法。

而在例程1中,Sub类的showMe()方法并不能覆盖父类Base的showMe()方法,这两个showMe()方法之间并不存在覆盖关系。此时先要明白一点:print()方法是在Base类中定义的,所以当执行sub.print()这句代码时,JVM首先在sub实例对象时无法找到匹配的showMe()方法,所以就直接调用其父类的showMe()方法。然而在例程2中,Sub类的showMe()方法已覆盖其父类的相应方法,所以JVM在sub实例对象里找到了相匹配的自己的showMe()方法,所以调用其来执行,不再调用父类的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值