以下代码段中最后一条语句的含义是什么?

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 被抛出

由于超类无法访问子类的方法,因此需要显式转换才能调用它。

我们知道 x2Y 并且根据定义是 X 因为 Y 扩展了 X.

但是我们用来处理 x2 的引用是 X 引用,所以它没有,如前所述,访问 [=11= 中的新方法和字段].

要解决这个问题,我们需要 的引用 X 转换为 Y