Java 为什么对象引用父类的值,而不是指定给它的类?
有人能解释为什么输出是10而不是20吗? 为什么对象引用父类的值,而不是指定给它的类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); } } 您正在
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);
我没有这样做,但我需要一些解释它是如何工作的,谢谢!我没有这样做,但我需要一些解释它是如何工作的,谢谢!