名称屏蔽(Name hiding)

如果 Java 的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称,

并不会屏蔽其在基类中的任何版本(这一点与 C++不同)。因此,无论是该层或者它的基类

中对方法进行定义,重载机制都可以正常工作:

 

//:c06:Hide.java

// Overloadinga base-class method name in a derived class

// does nothide the base-class versions.

import com.bruceeckel.simpletest.*;

 

class Homer {

char doh(char c) {

    System.out.println("doh(char)");

return 'd';

  }

float doh(float f) {

    System.out.println("doh(float)");

return 1.0f;

  }

}

 

class Milhouse {}

 

class Bart    extends Homer {

void doh(Milhouse m) {

    System.out.println("doh(Milhouse)");

  }

}

 

public  class Hide {

private   static Test monitor = new Test();

public   static    void main(String[] args) {

    Bart b =   new Bart();

    b.doh(1);

    b.doh('x');

    b.doh(1.0f);

    b.doh(new Milhouse());

    monitor.expect(new String[] {

"doh(float)",

"doh(char)",

"doh(float)",

"doh(Milhouse)"

    });

  }

}   ///:~

 

你可以看到,虽然Bart 引入了一个新的重载方法(在 C++中若要完成这项工作是需要屏蔽

基类方法的),但是在 Bart 中 Homer的所有被重载的方法都是可用的。正如你将在下一章所

看到的,使用与基类完全相同的签名(signature)及返回类型来重载具有相同名称的方法,

是一件极其平常的事。但它也令人迷惑不解(这也就是为什么 C++不允许这样做的原因所在

——防止你犯可能会犯的错误)。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值