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
,根据定义,aX
,因为Y
扩展了X
但是我们用来处理x2
的引用是X
引用,所以它没有像前面所说的那样,访问Y
中的新方法和字段
为了解决这个问题,我们需要将X
的引用转换为Y
,因为超类不能访问子类的方法,所以需要显式转换来调用它
我们知道,x2
是一个Y
,根据定义,aX
,因为Y
扩展了X
但是我们用来处理x2
的引用是X
引用,所以它没有像前面所说的那样,访问Y
中的新方法和字段
为了解决这一问题,我们需要将引用从X
转换为Y
请参阅章节Casting Object Read,特别是“Casting”部分。请参阅章节Casting Object Read,特别是“Casting”部分。如果无法进行cast,则不会真正“忽略”类型(例如,将字符串强制转换为整数)编译器将拒绝编译。它不会真正“忽略”类型:如果强制转换不可能(例如,将字符串强制转换为整数),编译器将拒绝编译。明白了。这只是一个简单的铸造案例。非常感谢。明白了。这只是一个简单的铸造案例。非常感谢。