因此,例如

Person p = New Person()

Person z = New Adult()


假设成人类有它自己的名为drive()的方法,为什么我不能这样做:

z.drive()

我知道这行不通,但是行不通的逻辑背后是什么?当您说:Person z = New Adult()时,您是否指定它是一个Adult实例?

最佳答案

当您说:Person z = New Adult()时,您是否指定它是一个Adult实例?


您正在创建一个Adult对象,但是声明Person z表示变量z允许引用任何类型的人,而不仅仅是成年人。您可以在下一行写z = new Child()

当您在z上调用方法时,Java会检查该方法对变量可以引用的所有对象是否有效。它不会分析前面的代码来试图弄清楚它实际上指的是哪种特定类型,因为在大多数情况下这是不可能的。 (例如,可以将变量作为方法参数传递,也可以根据Adult语句将其设置为Childif。)在某些情况下,确保变量将引用特定的类,但是Java语言不会对这些情况进行特殊处理。如果变量的声明类型为Person,则只能在其上调用Person方法。

如果编写Adult z = new Adult(),则可以调用z.drive(),因为保证该变量仅引用成人,而不引用孩子。

09-15 22:44