gpt4 book ai didi

java - 继承和动态绑定(bind)原理不清楚

转载 作者:行者123 更新时间:2023-12-01 19:04:46 25 4
gpt4 key购买 nike

我在理解继承和动态绑定(bind)方面遇到了问题。我目前正在阅读一本针对初学者的java书籍,其中有一个例子。

class Parent {
public String getFoo() {
return "parentFoo";
}
}

class Child extends Parent {
public String getFoo() {
return "childFoo";
}

public String getBar() {
return "childBar";
}
}

class GrandChild extends Child {
public String getFoo() {
return "grandChildFoo";
}
}

Parent p0 = new Child();
p0.getFoo();
p0.getBar();
Child c0 = new GrandChild();
c0.getFoo();
c0.getBar();
GrandChild gc0 = new GrandChild();
gc0.getFoo();
gc0.getBar();

我不明白 Parent p0 = new Child(); 的含义。我在互联网和书中进行了搜索,但没有找到为什么在这里创建新对象的解决方案。此外,我不明白为什么 p0.getBar(); 给出错误而 p0.getFoo(); 没有。我非常感谢每一个帮助!

friend 们干杯

最佳答案

我不明白 Parent p0 = new Child(); 的含义。” - 这意味着您创建了 Parent 类型的引用code> 并使用 Child 对其进行初始化。这是有效的,因为 Child 自动继承 Parent 的所有属性和方法,因此 Child 可以像 Parent。这有时称为“is-a”关系(Childis-aParent),但我个人不使用这个术语1Liskov's Substitution Principle 给出了更合适的定义。 :

Liskov's notion of a behavioural subtype defines a notion of substitutability for objects; that is, if S is a subtype of T, then objects of type T in a program may be replaced with objects of type S without altering any of the desirable properties of that program (e.g. correctness).

(注意:这不是由语言强制执行的,因为我们正在讨论语义,并且编译器没有语义的概念,但它表明,从语法上讲,子类型 - 或子类 - 也始终是其父类(super class)型 - 或父类(super class)。)

<小时/>

此外,我不明白为什么 p0.getBar(); 会给出错误,而 p0.getFoo(); 不会。 "--- p0 是一个 Parent 引用。因此,我们只能访问Parent中定义的属性和方法。尽管p0的运行时类型实际上是一个Child,但我们无法访问仅在Child中定义的方法。为此,让我们创建一个小例子。想象一下一个类 Animal 具有一个方法 sound()。现在让我们想象两个类 DogBird 扩展了 AnimalDog 类有一个方法 isBestOfBois(),而 Bird 类有一个方法 fly() 。我们现在可以写这样的东西:

Animal animal;
if (user selects dog as his animal) {
animal = new Dog();
} else {
animal = new Bird();
}
// animal.isBestOfBois(); should not be accessible, since animal could be a Bird
// animal.fly(); should not be accessible since animal could be a Dog
animal.sound(); // Both Dog and Bird are guaranteed to have a method sound, so this is fine.
<小时/>

1我避免使用“is-a”来描述继承关系的原因是它会导致困惑。正方形是长方形吗或者长方形是正方形吗?数学家会明确地说,正方形是矩形的特殊形式,因此所有正方形都应该是矩形,因此在继承方面,Square应该继承于Rectangle。但是,与矩形不同,正方形仅由一个值(其边长)定义,而矩形由两个值(宽度和高度)定义。如果一个正方形是一个矩形,并且我们改变了矩形的宽度,那么高度也改变是否明智?因为这会发生在方形情况下,我认为这是 Not Acceptable 行为。因此,就继承关系而言,SquareRectangle 不应处于继承关系中,即使存在“is-a”他们之间的关系。

关于java - 继承和动态绑定(bind)原理不清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59579860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com