当前位置:  技术问答>java相关

高手请进入讨论:关于覆盖重载隐藏:隐藏是动态绑定的吗?是多态性吗?

    来源: 互联网  发布时间:2015-03-09

    本文导语:  下面是我和另外一个人的讨论: 不过我认为隐藏也是动态绑定的,所以和覆盖(override)都是多态性。 ----------------------------------------------------------------- 重写了非虚函数,称为“隐藏”(hide) 隐藏和重载这些概念都...

下面是我和另外一个人的讨论:
不过我认为隐藏也是动态绑定的,所以和覆盖(override)都是多态性。

-----------------------------------------------------------------
重写了非虚函数,称为“隐藏”(hide)

隐藏和重载这些概念都和多态无关。

重写(覆盖)概念只有在多态情况下才存在。

重写父类虚函数后,也只有在以父类指针控制子类对象的时候才有用。

在 2001-09-27 11:10:00 您写道:
>你好,
>   想和你探讨一个问题-多态性,看下面一个程序(附件也有)。
>这里父类Animal有三个方法(函数),一个是虚函数,另外两个不是,
>在它的子类中都覆盖(override)了那个虚函数,有一个特殊的子类Duck
>重写了另外两个函数(不是虚函数),你说这是覆盖(override)还是重载(OVERLOAD)?
>我想这是覆盖(OVERRIDE)。你说这种设计方法好还是把三个函数都写成
>虚函数好?这种设计方法有一个优点是:在父类中实现了子类的方法(相当于提供了一个
>缺省的方法),这个缺省的方法与大部分的子类的实现方法一致,有特殊的子类特殊
>对待,即覆盖父类提供的缺省方法。这也是OOP的多态性吧?
>
>abstract class Animal
>{
>   public boolean isAMammal()
>   {
>       return(true);
>   }
>
>   public boolean isCarnivorous()
>   {
>       return(true);
>   }
>
>   abstract public String getHello();
>}
>
>class Dog extends Animal
>{
>   public String getHello()
>   {
>       return("Bark");
>   }
>}
>
>class Cat extends Animal
>{
>   public String getHello()
>   {
>       return("Meow");
>   }
>}
>
>class Duck extends Animal 
>{
>   public boolean isAMammal()
>   {
>       return(false);
>   }
>
>   public boolean isCarnivorous()
>   {
>       return(false);
>   }
>
>   public String getHello()
>   {
>       return("Quack");
>   }
>}
>
>public class HelloWorld
>{
>   public static void main(String[] args)
>   {
>       Animal animal1 = new Dog();
>       Animal animal2 = new Cat();
>       Animal animal3 = new Duck();
>       System.out.println("A dog says " +animal1.getHello()
>       +", is carnivorous: " +animal1.isCarnivorous()
>       +", is a mammal: " +animal1.isAMammal());
>
>       System.out.println("A cat says " +animal2.getHello()
>       +", is carnivorous: " +animal2.isCarnivorous()
>       +", is a mammal: " +animal2.isAMammal());
>
>       System.out.println("A duck says " +animal3.getHello()
>       +", is carnivorous: " +animal3.isCarnivorous()
>       +", is a mammal: " +animal3.isAMammal());
>   }
>}
>

|
?覆盖和隐藏有区别吗?我认为他们是一个概念……父类的方法被子类覆盖后,父类的方法自然就隐藏了……

|
JLS里面覆盖和隐藏确实有区别,但不是象你这样解释的……

我的理解是这样:当子类重写了父类的一个方法时,如果的重写的方法不是静态的,则称为覆盖;否则称为隐藏。
被覆盖的方法只能通过super关键字来访问,而被隐藏的方法还可以通过把子类cast为父类来访问……

原文见:http://java.sun.com/docs/books/jls/first_edition/html/8.doc.html#228745
我也不知道理解得是否正确,大家多讨论吧……


|
SORRY,刚才不小心没注意是第一版的,第二版的地址是这个:file:///E:/BAK/DOWNLOAD/java/jls2_html/classes.doc.html#228745
比第一版说得更清楚了……

|
我以为隐藏和重载这些概念都和多态无关。
重载是指将函数重写,但函数形式与被重载的函数(包括参数)一样。
----print(int i)
在子类被重新实现--也是print(int i)称隐藏(覆盖)。--参数一样
----函数名被重用--print(char c)称重载。参数不一样。

多态是指同一个函数名(如print),但是它可以有各种不同的参数(不论几个参数)
---print(int a)--
---print(char c)--
它们是在同一个类中称多态。
--大家以为如何。

|
override是对insance method而言的
static method只能被hide
无论static/instance, field只能被hide

override时,如果不用super, 子type中的方法实现将被调用(多态)
hide时,究竟是用父type中的field/method, 还是用子type中的,
这取决于是怎么declare的


咳咳咳咳咳。。。嘻嘻。。。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由
  • 高手救命,很急——ORACLE817安装在UNIXWARE711上,手工启动数据库后在netasst中连接错误,高手帮我看看?
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 各个高手看看这个问题!本人第一次学习java所以要各位高手的帮助。。
  • php开源软件 iis7站长之家
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 我是新手,高手,高手,快来救我
  • EJB问题,请教高手(非高手莫进)
  • 请各位JAVA高手,网业高手看过来,我把能给的分都送出!!!只能给37分,哎!!
  • eWEEK沙龙征集高手座谈


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3