提问人:DCR 提问时间:7/22/2023 最后编辑:Turing85DCR 更新时间:7/22/2023 访问量:73
java do 扩展类有两种类型
java do extended classes have two types
问:
在java中,我有以下内容:
ClassA obj = new ClassB();
哪里。
obj 是类型还是两者兼而有之?ClassB extends ClassA
ClassA
ClassB
如果我们有:
ClassB obj = new ClassB();
似乎很明显,这是类型的,但所有人都是,不是吗?那么类型是 和 吗?obj
ClassB
ClassB
ClassA
ClassA
ClassB
如果我们添加以下内容:
ClassA [] objects = new ClassA[3];
ClassA obj = new ClassB();
objects[0] = obj;
似乎是类型的.因此,即使 obj 是一个obj
ClassA
new ClassB();
这是我的困惑,假设我们在 from 中有一个被覆盖的方法,我可以调用该方法并从覆盖的方法中获得预期的输出。但是,如果我只有一个不包含在中的方法,我就不能调用它,而且我似乎无法将其转换为.哦,等等,是类型,所以我们不能把它转换为 a,因为所有的 '都不是 's。ClassB
ClassA
ClassB
ClassB
ClassA
ClassB
obj
ClassA
ClassB
ClassA
ClassB
所以 obj 是类型,但我们将其设置为 .那么这到底是什么?是还是,我好糊涂。为什么我们可以访问覆盖的方法,但不能访问未覆盖的方法?这就是多态性的工作方式吗?ClassA
new ClassB()
ClassA
ClassB
ClassB
答:
您的问题与这种情况相同:
你看麦克斯,他是一只贵宾犬。你问:那么,这是怎么回事?Max 是贵宾犬、狗还是动物?还是同时使用这三个?
答案或多或少是“这个问题掩盖了我们对生物分类方式的误解”。如果您必须从有限的选项中进行选择,那么“全部 3 个”比其他任何选项都更正确。但这意味着你可以创造一只贵宾犬,它也是动物而不是狗,这是错误的结论:任何贵宾犬都必然也是狗。
这也取决于上下文。如果我问马克斯是哪种生物的“类型”,而情况只需要一个答案,你总是会得到“贵宾犬”。因为这是最有用的答案——知道 max 是贵宾犬就足以确定 max 因此必然也是一只狗和一种动物,因为根据定义,所有贵宾犬都是。你不能有一个非狗的生物,但它是贵宾犬。
因此:
Animal a = new Poodle();
是完全合法的。阿尔贵宾犬是动物,所以,如果你的工作需要任何动物,贵宾犬就可以了。吉娃娃也是如此。Java 通过引用来执行所有操作。 就像宣布存在一张小便利贴,上面写着一些动物居住的地方。地址甚至可以留空 ()。你可以保证,如果这个便利贴上有一个实际的地址,它肯定会导致某种动物(它不会导致,比如说,一棵橡树,语言和运行时保证了这一点)。在这种情况下,它实际上会导致贵宾犬。这很好:毕竟,所有的贵宾犬都是动物。事实上,你的地址上写着“我可能会导致任何动物”,但这并不能神奇地将 max 变成一头驴,甚至变成一只“普通动物”——max 仍然是一只贵宾犬:
Animal a;
a
null
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>
Serializable
RandomAccess
Iterable<String>
ArrayList<String>
AbstractList<String>
List<String>
AbstractCollection<String>
Collection<String>
Object
上一个:无效的覆盖 copyWith
评论