【发布时间】:2012-03-16 14:07:15
【问题描述】:
我写信给你是为了确定我真的理解多态性的定义。 所以,如果我写:
SuperClass sc=new SubClass();
这就像说“我想要一个 SuperClass 类的对象,但我希望它表现得像被覆盖方法的子类对象”? 感谢您的回复。
【问题讨论】:
标签: java oop polymorphism overriding
我写信给你是为了确定我真的理解多态性的定义。 所以,如果我写:
SuperClass sc=new SubClass();
这就像说“我想要一个 SuperClass 类的对象,但我希望它表现得像被覆盖方法的子类对象”? 感谢您的回复。
【问题讨论】:
标签: java oop polymorphism overriding
我不会完全那样解释它。我会说:“我想要一个 SubClass 对象,但它应该被视为一个 SuperClass,这样它到底是哪个子类都没有关系。”
也就是说,假设您有 SubClass1 和 SubClass2 都实现了方法 calculate,您希望能够在不知道它们到底是哪个类的情况下为所有它们调用方法,您只需将它们都视为 SuperClass。
希望这会有所帮助。
【讨论】:
我认为,通过具体化更容易理解。考虑:
Pet myPet = new Dog();
对比:
Pet myPet = new Cat();
有什么区别?如果你只知道你的宠物是Pet,那么你不知道如果你打电话到底会发生什么:
myPet.beHappy();
在第一种情况下,beHappy() 可能实现为this.wagTail();,而在第二种情况下,它可能是this.purr();。
现在回到您最初的描述并替换特定的类:“我想要一只宠物,但我希望它表现得像狗 [或猫] 一样快乐”。我认为,这是对正在发生的事情的准确描述,这取决于您的观点。当然,事实上,您确实有一个 Pet 对象,其行为类似于 Dog(或 Cat)对象。另一方面,还不如说:“我想要一只狗,但我想和它互动,就像我和任何其他宠物一样。” 这也是一个有效的描述发生了什么事。
哪个是正确的描述?他们都是。哪个更可取?这仅取决于您从赋值语句的哪一侧开始。
【讨论】:
我觉得你的理解是对的。
多态性的字典定义是指一个原则 生物体或物种可以有许多不同形式的生物学 或阶段。这个原则也可以应用于面向对象 编程和语言,如 Java 语言。 a 的子类 类可以定义自己独特的行为,并共享一些 父类的功能相同。
来自http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
【讨论】:
我喜欢使用形状的概念。 “所有的三角形都是形状,但不是所有的形状都是三角形。”所有三角形的行为都像形状,但并非所有形状的行为都像三角形。
例如,所有形状都有一个面积,但计算方式不同。圆形(子类或超类 Shape),使用公式 phi*r*r,但这不适用于所有形状(即并非所有形状都是圆形)。
【讨论】:
不,这是不正确的。这样,您将创建SubClass 的对象,尽管您不能引用特定于SubClass 的方法,而只能引用SuperClass 类的方法,因为sc 属于SuperClass 类型。如果你重写SubClass 中的某些方法,实际的SubClass 代码将被执行,而不管你的对象被声明为SuperClass。
主要区别在于编译时类型和运行时类型。在这种情况下,sc 在编译时是 SuperClass 类型,但在运行时它是 SubClass (这当然意味着如果您不覆盖 SubClass 中的方法,则 @ 的相应方法987654333@如果被调用会被执行)。
【讨论】:
您的陈述:“我想要一个 SuperClass 类的对象,但我希望它表现得像重写方法的子类对象”是正确的,它是 Sub-type polymorphism
您还可以拥有实现接口的多态性。一个常见的例子是 toString() 方法,其中每个类都有相似的行为(打印为字符串)
另一个例子请参见维基百科的Polymorphism in OOP。
【讨论】:
您正在尝试获取对超类变量的子类引用并修改行为,以便对超类的任何调用都将调用子类方法。多态性可以通过重载或覆盖来实现。希望下面的这些示例链接能更清楚地说明。
【讨论】: