Java 将对象传递给方法
Java Passing objects to a method
假设X和Y是类使得Y扩展X。另外,设method(X xObj)是X的一个方法。为什么下面的代码可以编译?
X xObj = new X();
Y yObj = new Y();
xObj.method(yObj);
此外,还有其他类似的情况,其中似乎不正确的代码可以编译吗?
如果 Y
扩展 X
,那么,Y
是 一个 X
。您可以在任何应用程序中(始终)用 X
代替 Y
。
你可以做所有这些花哨的事情:
X object = new Y();
object.method(object)
Y objY = new Y();
object.method(objY);
objY.method(object);
要注意的主要事情是 子 class 是其父 的类型。
如果 method()
的参数是 X
类型,任何属于 X
子类型的对象(在示例中为 Y
)也是有效的参数。
请注意,您还可以这样做:
X yObj = new Y(); // declare variable yObj with type X and reference Y instance
xObj.method(yObj);
以 Integer
class 为例。 Integer
扩展了 Number
,而 Number
隐式扩展了 Object
。 Integer
类型的任何对象也是 Number
和 Object
。所以你可以这样做:
static void print(Object obj) {
System.out.println(obj);
}
并调用:
Integer n = 5;
print(n);
输出:
5
方法参数的类型始终与其子类型匹配。这意味着匹配 X 的方法将匹配其子类 Y。这是因为,对于编译器而言,Y 保证像 X 一样工作,因为这是 OOP 的基本契约之一。
假设X和Y是类使得Y扩展X。另外,设method(X xObj)是X的一个方法。为什么下面的代码可以编译?
X xObj = new X();
Y yObj = new Y();
xObj.method(yObj);
此外,还有其他类似的情况,其中似乎不正确的代码可以编译吗?
如果 Y
扩展 X
,那么,Y
是 一个 X
。您可以在任何应用程序中(始终)用 X
代替 Y
。
你可以做所有这些花哨的事情:
X object = new Y();
object.method(object)
Y objY = new Y();
object.method(objY);
objY.method(object);
要注意的主要事情是 子 class 是其父 的类型。
如果 method()
的参数是 X
类型,任何属于 X
子类型的对象(在示例中为 Y
)也是有效的参数。
请注意,您还可以这样做:
X yObj = new Y(); // declare variable yObj with type X and reference Y instance
xObj.method(yObj);
以 Integer
class 为例。 Integer
扩展了 Number
,而 Number
隐式扩展了 Object
。 Integer
类型的任何对象也是 Number
和 Object
。所以你可以这样做:
static void print(Object obj) {
System.out.println(obj);
}
并调用:
Integer n = 5;
print(n);
输出:
5
方法参数的类型始终与其子类型匹配。这意味着匹配 X 的方法将匹配其子类 Y。这是因为,对于编译器而言,Y 保证像 X 一样工作,因为这是 OOP 的基本契约之一。