在java中我有以下内容:
ClassA obj = new ClassB();
where ClassB extends ClassA
。
是类型的对象ClassA
or ClassB
或两者?
如果我们有:
ClassB obj = new ClassB();
看来很清楚obj
属于类型ClassB
但所有ClassB
are ClassA
他们也是,不是吗?类型也是如此ClassA
and ClassB
?
如果我们添加以下内容:
ClassA [] objects = new ClassA[3];
ClassA obj = new ClassB();
objects[0] = obj;
看起来obj
属于类型ClassA
。所以我们可以将它添加到对象中,即使 obj 是一个new ClassB();
这是我的困惑,假设我们有一个被覆盖的方法ClassB
from ClassA
,我可以调用该方法并从中获得预期的输出ClassB
覆盖方法。但是,如果我只有一个ClassB
方法也未包含在ClassA
我无法调用它,而且我似乎无法将其向上转换为ClassB
。等一下,obj
属于类型ClassA
所以我们不能将它投射到ClassB
因为所有ClassA
的不是ClassB
's.
所以 obj 是类型ClassA
但我们将其设置为new ClassB()
。那到底是什么?是吗ClassA
or ClassB
, 我很困惑。为什么我们可以访问到被覆盖的方法ClassB
但不是非覆盖方法?这就是多态性的工作方式吗?
您的问题与这种情况相同:
你看到麦克斯,他是一只贵宾犬。你问:那么,这是怎么回事?麦克斯是贵宾犬、狗还是动物?还是三个同时进行?
答案或多或少是“这个问题掩盖了我们对生物分类方式的误解”。如果您必须从有限的选项中进行选择,那么“都是 3”比任何其他选项都更正确。但这意味着你可以创造一只贵宾犬,它也是一种动物,但not狗,这是错误的结论:任何贵宾犬都是一定也是一只狗.
这还取决于上下文。如果我问麦克斯是哪种生物,而这种情况只需要一个答案,你总是会得到“贵宾犬”。因为这是最有用的答案 - 知道 max 是贵宾犬就足以确定 max 因此必然也是一只狗,也是一种动物,因为根据定义,all贵宾犬是。你不可能拥有一个非狗但仍然是贵宾犬的生物.
Hence:
-
Animal a = new Poodle();
是完全合法的。贵宾犬是动物,因此,如果您的工作需要任何动物,贵宾犬就可以。吉娃娃也是如此。
-
Java 通过引用完成所有事情。Animal a;
就像宣告存在一个名为a
这是包含adress一些动物居住的地方。地址甚至可以留空(null
)。您可以保证,如果这张便利贴上有实际地址,它会确实导致某种动物(它不会导致,比如说,一棵橡树,语言和运行时保证这)。在这种情况下,事实上,它会导致一只贵宾犬。这很好用:毕竟所有贵宾犬都是动物。事实上,你的地址贴上写着“我可能会导致任何动物”并不会神奇地将麦克斯变成驴,甚至变成“通用动物” - 麦克斯仍然是贵宾犬:
Poodle max = new Poodle();
Animal a = max;
System.out.println(a.getClass()); // prints 'Poodle'.
请记住,点运算符是“按照便利贴上的地址并询问您在那里发现的问题”。.getClass()
不“问问题”a
,它向 a 所指的事物提出问题。目前,a 指向 max。如果你问麦克斯他是什么(我猜狗会说话),麦克斯会说“我是一只贵宾犬”。麦克斯不会说“我是动物”; max 不知道便利贴的存在,而且确实不知道:可能有 85 个便利贴都带有 max 的地址。可能没有留下任何东西(例如,一旦方法结束,局部变量就不再存在,就像便利贴被遗忘一样)。当向对象提出问题时,他们无法获得“上下文”(您曾经使用过什么路线)find那个对象),因此你知道他们的答案不可能依赖于它。
-
Poodle b = a;
is not合法的。这意味着:“将便利贴 a 上的地址复制到便利贴 b 上,该地址受到限制,如果它指向任何东西,则它指向一只贵宾犬。Even ifa 当前指向一只贵宾犬,在编译时编译器不知道这一点,所以它不会让你这样做。并非没有演员阵容:Poodle b = (Poodle) a;
很好,因为这是插话:“检查 a 实际上是否指向一只贵宾犬。如果确实如此,那么一切都很好。但如果不是,请停止您正在做的所有事情,并以“ClassCastException”异常退出此过程。
-
对象总是有很多很多类型。例如,new ArrayList<String>
is all这些事情:Serializable
, RandomAccess
, Iterable<String>
, ArrayList<String>
, AbstractList<String>
, List<String>
, AbstractCollection<String>
, Collection<String>
, Object
,也许还有一些我错过了。它不仅仅是类型层次结构(ArrayList 扩展 AbstractList 扩展 AbstractCollection 扩展 Object),它还包括您沿途拾取的所有接口 - 以及所有their超级接口也是如此。这符合现实生活。 max 是一只狮子狗、一只狗、一种动物、一种肉食动物、一种有腿的东西、一种尿源、一种两耳的东西、雄性,等等。全部同时进行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)