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");