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

Java 下面代码段中最后一条语句的含义是什么?,java,inheritance,function-call,Java,Inheritance,Function Call,输出为:do2 我不理解上一条语句的执行方式。可能有一些“.”和“.”运算符的偏好概念,但我仍然不明白。Y类扩展了X,类,但是x2只能称为X,而不是X=newy(),因此无法调用Y方法 (Y)x2将x2强制转换为Y,因此可以调用Y方法 (Y x2).do2()只调用x2对象的Y类的do2方法 你也可以这样做 class X { //Base class void do1() { System.out.

输出为:
do2


我不理解上一条语句的执行方式。可能有一些“.”和“.”运算符的偏好概念,但我仍然不明白。

Y类扩展了
X
,类,但是
x2
只能称为
X
,而不是
X=newy()
,因此无法调用
Y
方法

(Y)x2
x2
强制转换为
Y
,因此可以调用
Y
方法

(Y x2).do2()
只调用
x2
对象的
Y
类的
do2
方法

你也可以这样做

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?
    }
}

您可以阅读有关子类化和强制转换的更多信息。

Y
类扩展了
X
类,但是
x2
只能被称为
X
,而不是
x2=newy()
中的
Y
,因此无法调用
Y
方法

(Y)x2
x2
强制转换为
Y
,因此可以调用
Y
方法

(Y x2).do2()
只调用
x2
对象的
Y
类的
do2
方法

你也可以这样做

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?
    }
}

您可以阅读有关子类化和强制转换的更多信息。

它将对象“x2”强制转换为类型“Y”,这样它就可以执行“do2()”函数,只有类型为Y的对象才能执行该函数。(Y)周围的圆括号表示它是一个强制转换,然后将所有这些都用圆括号括起来,如((Y)x2)将其视为一个对象,然后可以在其上执行该方法。我想对此进行评论,但我没有足够的代表性。

它正在将对象“x2”强制转换为类型“Y”,以便它可以执行“do2()”函数,只有类型为Y的对象才能执行该函数。(Y)周围的圆括号表示它是一个强制转换,然后将所有这些都用圆括号括起来,如((Y)x2)将其视为一个对象,然后可以在其上执行该方法。我想对此进行评论,但我没有足够的代表性。

将类名放在括号中(正如
(Y)
)所做的那样)称为强制转换。它告诉编译器忽略变量的类型,并假定变量是您指定的类型。

将类名放在括号中(如
(Y)
)所做的)称为强制转换。它告诉编译器忽略变量的类型,并假设变量是您指定的类型。

变量x2被强制转换为类型Y,然后调用类型Y的
do2()

不带cast的是类型X,类型X没有方法
do2()


真实但隐藏的值是Y型,所以这是合法的。如果此假设不正确,则抛出
ClassCastexception

变量x2被强制转换为类型Y,然后调用类型Y的
do2()

不带cast的是类型X,类型X没有方法
do2()


真实但隐藏的值是Y型,所以这是合法的。如果此假设不正确,则会抛出
ClassCastexception

,因为超类无权访问子类的方法,因此需要显式强制转换来调用它

我们知道,
x2
是一个
Y
,根据定义,a
X
,因为
Y
扩展了
X

但是我们用来处理
x2
的引用是
X
引用,所以它没有像前面所说的那样,访问
Y
中的新方法和字段


为了解决这个问题,我们需要将
X
的引用转换为
Y
,因为超类不能访问子类的方法,所以需要显式转换来调用它

我们知道,
x2
是一个
Y
,根据定义,a
X
,因为
Y
扩展了
X

但是我们用来处理
x2
的引用是
X
引用,所以它没有像前面所说的那样,访问
Y
中的新方法和字段


为了解决这一问题,我们需要将引用从
X
转换为
Y

请参阅章节Casting Object Read,特别是“Casting”部分。请参阅章节Casting Object Read,特别是“Casting”部分。如果无法进行cast,则不会真正“忽略”类型(例如,将字符串强制转换为整数)编译器将拒绝编译。它不会真正“忽略”类型:如果强制转换不可能(例如,将字符串强制转换为整数),编译器将拒绝编译。明白了。这只是一个简单的铸造案例。非常感谢。明白了。这只是一个简单的铸造案例。非常感谢。