Java 在这种情况下,铸造是如何工作的?
假设我有两门课Java 在这种情况下,铸造是如何工作的?,java,Java,假设我有两门课 public class example1 { private int a; private String b; public example1(int a, String b) { this.a = a; this.b = b; } public int getA() { return a; } public String getB() { return
public class example1 {
private int a;
private String b;
public example1(int a, String b) {
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public String getB() {
return b;
}
}
public class example2 extends example1 {
public example2(int a, String b) {
super(a, b);
}
@Override
public int getA() {
return 10;
}
}
现在,如果我继续将example2转换为example1
example1 a = (example1) new example2(5, "Hi");
a.getA()将返回什么
作为进一步的问题,如果示例2看起来像这样
public class example2 extends example1 {
public example2(int a, String b) {
super(a, b);
}
@Override
public int getA() {
return getAModified();
}
public int getAModified() {
return 10;
}
}
a.getA()将返回什么?这里发生了什么,更重要的是为什么会发生
a.getA()将返回什么
将执行示例2的getA()方法,即10
即使在第二种情况下,它也会返回10
这里的原因是方法重写
在运行时决定调用哪个getA()方法。由于您正在创建Example2的对象,因此在这两种情况下都会调用Example2的getA(),它将覆盖Example1的getA()方法 您可以将Example2的对象强制转换为Example1,因为它是父类,但它不会改变对象实际上是Example2的事实 a.getA()将返回什么 将执行示例2的getA()方法,即10 即使在第二种情况下,它也会返回10 这里的原因是方法重写 在运行时决定调用哪个getA()方法。
由于您正在创建Example2的对象,因此在这两种情况下都会调用Example2的getA(),它将覆盖Example1的getA()方法 您可以将Example2的对象强制转换为Example1,因为它是父类,但它不会改变对象实际上是Example2的事实 a.getA()将返回什么 将为您提供来自
example2
的结果,因为您使用类example2
这里发生了什么
。
您正在创建类型为example1
的实例,其实现方式为example2
。并将其转换为示例1
强制转换显示使用一种类型的对象
替代另一种类型。就这样。它不会神奇地将实例化的对象转换为casted
a.getA()将返回什么
将为您提供来自example2
的结果,因为您使用类example2
这里发生了什么
。
您正在创建类型为example1
的实例,其实现方式为example2
。并将其转换为示例1
强制转换显示使用一种类型的
对象
替代另一种类型。就这样。它不会神奇地将实例化的对象转换为casted。即使在第二个示例中,我使用了一个方法?我有一个理论(尽管可能不正确),因为我将example2强制转换为一个不包含getAModified()的类型,所以它不知道如何处理it@Storm-,您将无法在强制转换后直接调用a.getAModified()
,因为强制转换的类型没有该方法。但是类example2
可以调用它(因为它知道对象的类型是example2
,example2类的方法是getAModified()
)。即使在第二个示例中,我也使用了方法?我有一个理论(尽管可能不正确),因为我将example2强制转换为一个不包含getAModified()的类型,所以它不知道如何处理it@Storm-,您将无法在强制转换后直接调用a.getAModified()
,因为强制转换的类型没有该方法。但是类example2
可以调用它(因为它知道对象的类型是example2
,example2类的方法是getAModified()
)。我必须问你为什么不运行代码,找出并问你为什么得到这样的结果?因为我试图弄清楚到底发生了什么,最终的结果意义不大,我明白这一点。你问的是输出是什么,“甚至在……”。我只是想知道为什么你不测试你的“理论”并展示你的发现,而不是问结果会是什么。调试非常有用,因为您可以看到对象类型等;仅此而已。我必须问你为什么不运行代码,找出原因,然后问你为什么得到结果?因为我正试图弄清楚到底发生了什么,最终结果意味着什么。我理解这一点。你问的是输出是什么,“甚至在……”。我只是想知道为什么你不测试你的“理论”并展示你的发现,而不是问结果会是什么。调试非常有用,因为您可以看到对象类型等;这就是全部。
example1 a = (example1) new example2(5, "Hi");