gpt4 book ai didi

java:从两个构造函数创建一个对象

转载 作者:行者123 更新时间:2023-11-29 03:31:27 25 4
gpt4 key购买 nike

这是来自“SCJP”by Kathy Sierra的示例:第 2 章 - 面向对象

class X { void do1() {} }

class Y extends X { void do2() {} }

class Chrome {

public static void main (String args[]) {
X x1 = new X();
X x2 = new Y(); //***** question is regarding this line
Y y1 = new Y();
((Y)x2).do2();
}
}

使用两个构造函数创建一个对象是否合法? x2 是什么类型的对象:X 还是 Y

最佳答案

那不是两个构造函数

 X x2 = new Y(); 
  • X 是变量类型
  • x2 是引用变量,它可以引用 X,因此可以引用 X 的任何子类,在这种情况下,它可以引用 Y
  • new Y()实际上是在内存中创建类Y的对象,变量x引用该对象。

这是可能的,因为 Y 扩展了 X,因此它通过了 IS-A 测试。这是多态性的例子。父类(super class)型指的是子类型的对象。

  • 在编译时,x2 引用变量的类型为 X
  • 在运行时,x2 将引用子类对象,即类型为 Y 的对象。

因此,如果类 X 中的方法被类 Y 中的方法覆盖,则将调用类 Y 的方法,因为该对象的类型为 Y

考虑这些类。

public class X {

public void someMethod(){
System.out.println("we are in class X method");
}
}

和另一个类

public class Y extends X {

public void someMethod(){
System.out.println("we are in class Y method ");
}


public static void main(String [] args){
X x = new X();
X x2 = new Y();
Y y = new Y();

x.someMethod();
x2.someMethod();
y.someMethod();
}

}

这输出

we are in class X method
we are in class Y method
we are in class Y method

解释是:

  • 语句 X x = new X(); 使用 X 的引用创建 X 的对象,因此调用类 someMethodX
  • 语句 X x2 = new Y(); 创建了一个引用变量 X 但类 Y 的对象因此调用了类 Y 的覆盖方法,因为覆盖方法具有动态绑定(bind)。调用哪个重写方法取决于对象类型。
  • 对于语句 Y y = new Y() ,与第 1 点的解释相同。

关于java:从两个构造函数创建一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18017790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com