因此,例如
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
语句将其设置为Child
或if
。)在某些情况下,确保变量将引用特定的类,但是Java语言不会对这些情况进行特殊处理。如果变量的声明类型为Person
,则只能在其上调用Person
方法。
如果编写Adult z = new Adult()
,则可以调用z.drive()
,因为保证该变量仅引用成人,而不引用孩子。