Java 为什么对象引用父类的值,而不是指定给它的类?

Java 为什么对象引用父类的值,而不是指定给它的类?,java,inheritance,Java,Inheritance,有人能解释为什么输出是10而不是20吗? 为什么对象引用父类的值,而不是指定给它的类 class A { int i = 10; } class B extends A { int i = 20; } public class MainClass { public static void main(String[] args) { A a = new B(); System.out.println(a.i); } } 您正在

有人能解释为什么输出是10而不是20吗? 为什么对象引用父类的值,而不是指定给它的类

class A {
    int i = 10;
}

class B extends A {
    int i = 20;
}

public class MainClass {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.i);
    }
}


您正在创建的实例类型为
A
,因此,由于两个变量具有相同的名称,因此如果您希望
B
,您将得到超类“one”

B b = new B()
System.out.println(b.i)

您不应该在超类和子类之间使用相同名称的变量,这会让人非常困惑,并有点违背继承的目的。

您正在创建的实例是
A
类型,因此,由于两个变量具有相同的名称,如果您想要
B
,您将得到超类的一个

B b = new B()
System.out.println(b.i)
您不应该在超类和子类之间使用相同名称的变量,这会让人非常困惑,有点违背继承的目的

有人能解释为什么输出是10而不是20吗

因为
i
的值是在
A类中定义的,而不是
B类的定义所覆盖/重新分配的,正如您刚才假设的那样。添加自定义构造函数可以进一步澄清您对可能要执行的操作的疑问:

class A {
    int i = 10;
}

class B extends A {
    public B() {
        this.i = 20;
    }
}

A a = new B();
System.out.println(a.i); // would now print 20
在类
B
中声明相同的变量
i
将有自己的作用域,并且不会从类
A
继承

有人能解释为什么输出是10而不是20吗

因为
i
的值是在
A类中定义的,而不是
B类的定义所覆盖/重新分配的,正如您刚才假设的那样。添加自定义构造函数可以进一步澄清您对可能要执行的操作的疑问:

class A {
    int i = 10;
}

class B extends A {
    public B() {
        this.i = 20;
    }
}

A a = new B();
System.out.println(a.i); // would now print 20

在类
B
中声明相同的变量
i
将有其自己的作用域,并且不会从类
A
继承变量在Java中不能被重写,因为它们是在编译时解析的;您可以使用
super
设置其值

class A {
    int i = 10;
}

class B extends A {
    int i = 20;

    public B() {
        super();
        super.i = i;
    }
}

A a = new B();
System.out.println(a.i); //20

变量不能在Java中重写,因为它们是在编译时解析的;您可以使用
super
设置其值

class A {
    int i = 10;
}

class B extends A {
    int i = 20;

    public B() {
        super();
        super.i = i;
    }
}

A a = new B();
System.out.println(a.i); //20

在Java中,方法被重写,而不是变量。所以变量属于它们的所有者类
a
是类型
a
的引用,指向类型
B
的对象,但仍然是类型
a
。 要调用
B
i
,必须将
a
转换为
B

A a = new B();
System.out.println(((B)a).i);

在Java中,方法被重写,而不是变量。所以变量属于它们的所有者类
a
是类型
a
的引用,指向类型
B
的对象,但仍然是类型
a
。 要调用
B
i
,必须将
a
转换为
B

A a = new B();
System.out.println(((B)a).i);

我没有这样做,但我需要一些解释它是如何工作的,谢谢!我没有这样做,但我需要一些解释它是如何工作的,谢谢!