当前位置: 技术问答>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());
> }
>}
>
不过我认为隐藏也是动态绑定的,所以和覆盖(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
我也不知道理解得是否正确,大家多讨论吧……
我的理解是这样:当子类重写了父类的一个方法时,如果的重写的方法不是静态的,则称为覆盖;否则称为隐藏。
被覆盖的方法只能通过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)--
它们是在同一个类中称多态。
--大家以为如何。
重载是指将函数重写,但函数形式与被重载的函数(包括参数)一样。
----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的
咳咳咳咳咳。。。嘻嘻。。。
static method只能被hide
无论static/instance, field只能被hide
override时,如果不用super, 子type中的方法实现将被调用(多态)
hide时,究竟是用父type中的field/method, 还是用子type中的,
这取决于是怎么declare的
咳咳咳咳咳。。。嘻嘻。。。