java - 需要明确有关继承的一般概念及其在 OOP 中的实现。请参见

标签 java oop inheritance

我很好奇“继承”的概念是如何在面向对象编程的世界中发生的。让我解释一下我的困境(我在学习 Java 时遇到了这个困境,但我希望我的问题本质上是通用的):

假设有一个 A 类和一个 B 类。A 类“继承”B 类。这实际上意味着什么?编译器是否创建一个“new”类,然后将其实例化为一个对象,该对象在幕后包含类 A 和 B 的元素?如果是这样的话,那么如何根据访问说明符实现访问限制呢?

有一瞬间,我想知道它是否以以下方式发生:

创建 A 类的对象,然后创建 B 类的对象。然后,Java 以某种方式将 A 的成员“链接”到 B 的成员,并使它们看起来好像属于同一个类,并且它根据访问说明符执行此操作。

但是后来我发现这个理论有问题。假设两个不同的类 B 和 C 继承了类 A。那么,如果我们要创建类 B 和类 C 的对象,那么它们将拥有自己的类 A 元素的副本。所以这个理论也失败了。

我只是想解释一下我心中对继承的困惑。这让我很头疼。请帮忙。

编辑:这是我在该网站上找到的与我的问题相关的讨论的链接。

Do subclasses inherit private fields?

最佳答案

我可能会失败,但我会尝试为你解释一下。

老实说,我认为您在如何构思对象编程方面可能犯了一个非常经典的错误 - 这就是区分对象。几乎任何面向对象语言中的对象创建都是基于类定义的构造之一。从您的问题来看,听起来好像您正在对一般的 OO 语言和对象继承(特别是聚合离散对象)进行心理建模,而实际上对象是根据聚合类来定义的 定义。

public class A
{
    public A();
}

public class B:A
{
    public B();
}

public class C:B
{
    public C();
}

在您的 A->B->C 模型中,C 的定义是根据其自身的独特属性加上其直接祖先 B 的所有成员,其中反过来,是根据其自身的独特属性加上其直接祖先 A 的所有成员来定义的。创建对象的过程仍然是一个独特且离散的事件,并且该对象尽管它的多层遗产,在实例化时仍然只是一个对象

关于某些成员的可见性:当类作者设计和构建类时,他会从两个不同的角度对其提供的内容做出某些决定:向类的消费者公开的内容,以及公开或公开的内容。可供子类使用。声明为私有(private)的成员和字段都是后代类的一部分,即使“契约(Contract)上”禁止子类访问它们。您可以做一个粗略的类比,电视具有开/关按钮、音量控制和颜色控制的“公共(public)”接口(interface),但具有不适合消费者的“内部”控制,例如内部电子元件或电源供应。尽管它们对消费者或子类来说不“可见”或“可用”,但它们仍然存在。

现在,大多数面向对象语言中的构造都反射(reflect)了您所描述的属性(多个对象),并且涉及称为组合(有时,聚合)的设计模式。这是一个类不是从祖先类派生的地方 - 通常是因为该类被声明为“sealed”(C#) 或“final”(Java)(或其他指定)禁止继承)。这迫使有兴趣使用该类的开发人员将其成为另一个类的成员,这样当该类的对象被实例化时,您就可以这样做具有两个类的离散对象。

您可能有以下情况:

public final class InterestingThing
{
    //definitions
    public InterestingThing()
}

public final class MyThing
{
    InterestingThing _interestingThing = new InterestingThing();

    public MyThing()
}

这与您在原始问题中描述的场景非常相似,其中 MyThing 的创建意味着 InterestingThing 的独特创建。请记住,这种结构通常是由原始感兴趣类的设计和定义所强制的。

最终,对象是由它们的类定义的,多重继承的类仍然只是一个类,但是是一个基于良好的增量对象设计的精炼的、希望越来越健壮的层次结构。

我希望这个解释能以某种方式帮助回答您的问题。

关于java - 需要明确有关继承的一般概念及其在 OOP 中的实现。请参见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546271/

相关文章:

oop - Dlang : why are constructors not inherieted?

oop - 工厂设计模式和关键字 'new'

json - 多个模型子类的 Backbone.js 集合

java - 有没有 Thread.sleep() 的替代方案?

java - 一对多 : hibernate tries to nullify external reference instead of deleting whole child

javascript - 无论如何,JavaScript 中的 `new` 是做什么的?

Python面向对象编程: Composition

c++ - 继承比较运算符而不能相互比较派生类

java - 使用 maven 将 war 部署到远程 Tomcat 8 时出现 401(未经授权)错误

java - 如果 jvm 支持 -d64 选项,如何从 java 代码进行测试?