以下代码段中最后一条语句的含义是什么?
What is the meaning of last statement in the following code segment?
class X { //Base class
void do1() {
System.out.println("do1");
}
}
class Y extends X { //Derived class
void do2() {
System.out.println("do2");
}
}
public class ass9 {
public static void main(String[] args) { //main class
X x1 = new X();
X x2 = new Y();
Y y1 = new Y();
((Y) x2).do2(); //What does this mean?
}
}
输出为:do2
我不理解上一条语句的表达方式 executed.May 因为有一些偏好 ')' 和 '.' 的概念。运营商,但我还是不明白。
Y
class 扩展了 X
、class,但 x2
只能称为 X
,并且不是来自 X x2 = new Y()
的 Y
,因此无法调用 Y
方法。
(Y) x2
会将 x2
转换为 Y
,因此可以调用 Y
方法。
(Y x2).do2()
只是为 x2
对象调用 Y
class 的 do2
方法。
你也可以这样做
Y x3 = (Y) x2;
x3.do2();
您可以阅读更多关于 subclassing 和 casting 的内容 from this documentation。
它正在将对象 "x2" 转换为类型 "Y" 以便它可以执行只有类型 Y 的对象才能执行的 "do2()" 功能。 (Y) 周围的括号是为了告诉它是一个强制转换,然后将所有这些都包装到括号中,例如 ((Y) x2) 将其视为一个对象,然后您可以在该对象上执行该方法。我会对此发表评论,但我没有足够的代表。
将 class 名称放在括号中(如 (Y)
所做的那样)称为转换。它告诉编译器忽略变量的类型并假定该变量是您指定的类型。
变量 x2 被转换为类型 Y,然后调用类型 Ydo2()
Without cast 是类型 X,类型 X 没有方法 do2();
real but hidden value是Y类型,所以这是合法的。如果这个假设可能不正确,那么 ClassCastexception
被抛出
由于超类无法访问子类的方法,因此需要显式转换才能调用它。
我们知道 x2
是 Y
并且根据定义是 X
因为 Y
扩展了 X
.
但是我们用来处理 x2
的引用是 X
引用,所以它没有,如前所述,访问 [=11= 中的新方法和字段].
要解决这个问题,我们需要将 的引用 X
转换为 Y
。
class X { //Base class
void do1() {
System.out.println("do1");
}
}
class Y extends X { //Derived class
void do2() {
System.out.println("do2");
}
}
public class ass9 {
public static void main(String[] args) { //main class
X x1 = new X();
X x2 = new Y();
Y y1 = new Y();
((Y) x2).do2(); //What does this mean?
}
}
输出为:do2
我不理解上一条语句的表达方式 executed.May 因为有一些偏好 ')' 和 '.' 的概念。运营商,但我还是不明白。
Y
class 扩展了 X
、class,但 x2
只能称为 X
,并且不是来自 X x2 = new Y()
的 Y
,因此无法调用 Y
方法。
(Y) x2
会将 x2
转换为 Y
,因此可以调用 Y
方法。
(Y x2).do2()
只是为 x2
对象调用 Y
class 的 do2
方法。
你也可以这样做
Y x3 = (Y) x2;
x3.do2();
您可以阅读更多关于 subclassing 和 casting 的内容 from this documentation。
它正在将对象 "x2" 转换为类型 "Y" 以便它可以执行只有类型 Y 的对象才能执行的 "do2()" 功能。 (Y) 周围的括号是为了告诉它是一个强制转换,然后将所有这些都包装到括号中,例如 ((Y) x2) 将其视为一个对象,然后您可以在该对象上执行该方法。我会对此发表评论,但我没有足够的代表。
将 class 名称放在括号中(如 (Y)
所做的那样)称为转换。它告诉编译器忽略变量的类型并假定该变量是您指定的类型。
变量 x2 被转换为类型 Y,然后调用类型 Ydo2()
Without cast 是类型 X,类型 X 没有方法 do2();
real but hidden value是Y类型,所以这是合法的。如果这个假设可能不正确,那么 ClassCastexception
被抛出
由于超类无法访问子类的方法,因此需要显式转换才能调用它。
我们知道 x2
是 Y
并且根据定义是 X
因为 Y
扩展了 X
.
但是我们用来处理 x2
的引用是 X
引用,所以它没有,如前所述,访问 [=11= 中的新方法和字段].
要解决这个问题,我们需要将 的引用 X
转换为 Y
。