假设X和Y是类,Y延伸X.另外,让方法(X xObj)成为X的方法。为什么以下代码编译?
X xObj = new X();
Y yObj = new Y();
xObj.method(yObj);
此外,还有其他类似的情况,其中似乎不正确的代码编译?
答案 0 :(得分:1)
如果Y
延伸X
,则Y
为X
。您可以在任何应用程序中将X
替换为Y
(相继)。
你可以做所有这些花哨的事情:
X object = new Y();
object.method(object)
Y objY = new Y();
object.method(objY);
objY.method(object);
需要注意的主要事项是子类是它的父类的类型。
答案 1 :(得分:0)
如果method()
的参数属于X
类型,则任何对象X
(示例中为Y
)的对象也可作为参数有效。
请注意,您也可以这样做:
X yObj = new Y(); // declare variable yObj with type X and reference Y instance
xObj.method(yObj);
以Integer
类为例。 Integer
扩展Number
,Number
隐式扩展Object
。 Integer
类型的任何对象也是Number
和Object
。所以你可以这样做:
static void print(Object obj) {
System.out.println(obj);
}
并致电:
Integer n = 5;
print(n);
输出:
5
答案 2 :(得分:0)
方法参数的类型始终与其子类型匹配。这意味着匹配X的方法将匹配其子类Y.这是因为,对于编译器,Y保证像X一样运行,因为这是OOP的基本契约之一。