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
我不理解最后一句话的执行方式。可能有一些')'和''的偏好概念。运营商,但仍然没有得到它。
答案 0 :(得分:3)
Y
类扩展了X
,类,但x2
只能称为X
,而不是Y
来自X x2 = new Y()
1}},因此无法调用Y
方法。
(Y) x2
会将x2
投射到Y
,因此可以调用Y
方法。
(Y x2).do2()
只需为do2
对象调用Y
类的x2
方法。
您也可以这样做
Y x3 = (Y) x2;
x3.do2();
您可以阅读有关子类化和转换from this documentation的更多信息。
答案 1 :(得分:3)
它正在投射对象" x2"输入" Y"所以它可以做" do2()"只有Y类型的对象才能执行的函数。 (Y)周围的括号是告诉它是一个强制转换,然后将所有这些括在括号中,如((Y)x2)将其视为一个对象,然后可以执行该方法。我会评论这个,但我没有足够的代表。
答案 2 :(得分:0)
在括号中放置一个类名(由(Y)
完成)称为强制转换。它告诉编译器忽略变量的类型,并假设变量属于您指定的类型。
答案 3 :(得分:0)
将变量x2转换为Y类型,然后调用Y类型的do2()
如果没有强制转换是X类型,而类型X没有方法do2();
真实但隐藏的价值是Y型,所以这是合法的。如果此假设可能不正确,则抛出ClassCastexception
答案 4 :(得分:0)
由于超类无法访问子类的方法,因此需要使用显式转换来调用它。
我们知道x2
是Y
,根据定义X
,因为Y
扩展了X
。
但我们用于处理x2
的引用是X
引用,因此它不像前面所述那样访问{{1}内的新方法和字段1}}。
要解决此问题,我们需要将<{1}}的引用转换为Y
。