以下代码段中last语句的含义是什么?

时间:2016-03-30 17:54:41

标签: java inheritance function-call

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

我不理解最后一句话的执行方式。可能有一些')'和''的偏好概念。运营商,但仍然没有得到它。

5 个答案:

答案 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)

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

我们知道x2Y,根据定义X,因为Y扩展了X

但我们用于处理x2的引用是X引用,因此它不像前面所述那样访问{{1}内的新方法和字段1}}。

要解决此问题,我们需要将<{1}}的引用转换为Y