java do 扩展类有两种类型

java do extended classes have two types

提问人:DCR 提问时间:7/22/2023 最后编辑:Turing85DCR 更新时间:7/22/2023 访问量:73

问:

在java中,我有以下内容:

ClassA obj = new ClassB();

哪里。 obj 是类型还是两者兼而有之?ClassB extends ClassAClassAClassB

如果我们有:

ClassB obj = new ClassB();

似乎很明显,这是类型的,但所有人都是,不是吗?那么类型是 和 吗?objClassBClassBClassAClassAClassB

如果我们添加以下内容:

ClassA [] objects = new ClassA[3];
ClassA obj = new ClassB();
objects[0] = obj;

似乎是类型的.因此,即使 obj 是一个objClassAnew ClassB();

这是我的困惑,假设我们在 from 中有一个被覆盖的方法,我可以调用该方法并从覆盖的方法中获得预期的输出。但是,如果我只有一个不包含在中的方法,我就不能调用它,而且我似乎无法将其转换为.哦,等等,是类型,所以我们不能把它转换为 a,因为所有的 '都不是 's。ClassBClassAClassBClassBClassAClassBobjClassAClassBClassAClassB

所以 obj 是类型,但我们将其设置为 .那么这到底是什么?是还是,我好糊涂。为什么我们可以访问覆盖的方法,但不能访问未覆盖的方法?这就是多态性的工作方式吗?ClassAnew ClassB()ClassAClassBClassB

Java 继承 扩展

评论

0赞 DCR 7/22/2023
我不介意投反对票,但稍微解释一下为什么会很有帮助
0赞 Turing85 7/22/2023
你知道对象的静态类型和动态类型之间的区别吗?
0赞 Mushroomator 7/22/2023
看看静态绑定与动态绑定
2赞 Jim Garrison 7/22/2023
反对票来自这样一个事实,即这是 Java 的一个基本方面,在互联网上都有非常详细的记录。SO 的原则之一是,我们宁愿不重新记录已经在其他地方找到的东西,并且您应该在询问之前完成研究。
2赞 DCR 7/22/2023
哇,我在网上到处看,所有的解释都像我说的一样,像泥巴一样清晰

答:

4赞 rzwitserloot 7/22/2023 #1

您的问题与这种情况相同:

你看麦克斯,他是一只贵宾犬。你问:那么,这是怎么回事?Max 是贵宾犬、狗还是动物?还是同时使用这三个?

答案或多或少是“这个问题掩盖了我们对生物分类方式的误解”。如果您必须从有限的选项中进行选择,那么“全部 3 个”比其他任何选项都更正确。但这意味着你可以创造一只贵宾犬,它也是动物而不是狗,这是错误的结论:任何贵宾犬都必然也是狗

这也取决于上下文。如果我问马克斯是哪种生物的“类型”,而情况只需要一个答案,你总是会得到“贵宾犬”。因为这是最有用的答案——知道 max 是贵宾犬就足以确定 max 因此必然也是一只狗和一种动物,因为根据定义,所有贵宾犬都是。你不能有一个非狗的生物,但它是贵宾犬

因此:

  • Animal a = new Poodle();是完全合法的。阿尔贵宾犬是动物,所以,如果你的工作需要任何动物,贵宾犬就可以了。吉娃娃也是如此。

  • Java 通过引用来执行所有操作。 就像宣布存在一张小便利贴,上面写着一些动物居住的地方。地址甚至可以留空 ()。你可以保证,如果这个便利贴上有一个实际的地址,它肯定会导致某种动物(它不会导致,比如说,一棵橡树,语言和运行时保证了这一点)。在这种情况下,它实际上会导致贵宾犬。这很好:毕竟,所有的贵宾犬都是动物。事实上,你的地址上写着“我可能会导致任何动物”,但这并不能神奇地将 max 变成一头驴,甚至变成一只“普通动物”——max 仍然是一只贵宾犬:Animal a;anull

Poodle max = new Poodle();
Animal a = max;
System.out.println(a.getClass()); // prints 'Poodle'.

请记住,点运算符是“按照便利贴上的地址,问你在那里找到的东西一个问题”。 不向 A “提问”,而是向 A 所指的事物提问。目前,a 指向 max。如果你问马克斯他是什么(我猜如果狗会说话),马克斯会说“我是一只贵宾犬”。马克斯不会说“我是动物”;max 对便利贴一无所知,而且真的不知道:可能有 85 个便利贴,地址都是 max。可能什么都没有留下(例如,一旦方法结束,局部变量就不再存在,就好像便利贴被遗忘了一样)。当向对象提问时,他们没有得到“上下文”(你用什么路线找到那个对象),因此你知道他们的答案不可能依赖于它。.getClass()a

  • Poodle b = a; 是不合法的。这意味着:“将便利贴 a 上的地址复制到便利贴 b 上,该便利贴受到限制,如果它指向任何东西,它就会指向贵宾犬。即使 a 当前指向贵宾犬,在编译时编译器也不知道这一点,因此它不会让您这样做。不是没有演员:很好,因为那是插话:“检查a是否真的指向贵宾犬。如果确实如此,那么一切都很好。但如果没有,请停止您正在执行的所有操作,并使用“ClassCastException”异常退出此过程。Poodle b = (Poodle) a;

  • 对象总是有很多很多类型。例如,是所有这些东西:、、、,也许还有我错过的一些东西。这不仅仅是类型层次结构(ArrayList 扩展 AbstractList 扩展 AbstractCollection 扩展 Object),它还包括您在此过程中选择的所有接口 - 以及它们的所有超级接口。这与现实生活相符。马克斯是一只贵宾犬、一只狗、一只动物、一只肉食者、一只有腿的东西、一只小便的来源、一只两耳的东西、雄性,还有很多其他的东西。同时进行。new ArrayList<String>SerializableRandomAccessIterable<String>ArrayList<String>AbstractList<String>List<String>AbstractCollection<String>Collection<String>Object