Java 将继承类的对象分配给超类的引用

Java 将继承类的对象分配给超类的引用,java,Java,给定以下代码: public class A { int at=2; public int m(int i){return at+i;} } class B extends A { int at=3; public int m(int i){return at+5*i;} } public class Main { public static void main(String args[]){ A x = new B(

给定以下代码:

public class A {
     int at=2;

    public int m(int i){return at+i;}
}

class B extends A {
     int at=3;

        public int m(int i){return at+5*i;}
}

public class Main {

    public static void main(String args[]){
        A x = new B();

        System.out.println("Output "+x.m(x.at));
    }
}
输出为13

它是如何工作的?
我知道它采用B的方法,但参数呢?

看看表达式:
x.m(x.at)
。由于
x
被称为
A
x.at
将引用
A
中的
at
字段

然而,当涉及到方法时,它变得更加复杂。虽然
x
被声明为
A
x
实际上是
B
类型,所以方法
m
将从
x
的实际类
B
调用


可能会有帮助。

变量不会覆盖类似的方法。所以变量的值取决于引用变量,而不是该引用变量引用的实例

例:在你的情况下。In main()方法

A x=新的B()

引用变量x的类型为A,它包含B类型实例的引用


因此,X是类型A。每当你写X时,它是A类变量。

实际上,你在
A
中有两个
字段,一个在
A
中声明,另一个在
B
中声明。
A
中的方法
m
是指
A
中的
at
字段;
B
中的方法
m
是指
B
中的
at
字段。方法被重写,字段未被重写
x
被声明为
A
的实例,因此
x.at
为2。当您调用method
m
时,将调用被重写的方法(
B.m(2)
),因此得到3+5*2=13

在这种情况下,你应该告诉你什么是对的,为什么。这个问题的答案可以在

如果类声明具有特定名称的字段,则 该字段的声明据说隐藏了所有可访问的内容 超类中同名字段的声明,以及 班上的高级介面

在以下情况下,可以使用限定名称(§6.5.6.2)访问隐藏字段: 它是静态的,或者通过使用包含 关键字super(§15.11.2)或转换为超类类型


强制转换为超类类型是您的情况。

您没有将其指定给对象,而是将其指定给引用。谢谢,我编辑了标题