我的问题很简单,x的值在这里返回5,但为什么这个[重复]背后的原因是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的问题很简单,x的值在这里返回5,但为什么这个[重复]背后的原因是什么?相关的知识,希望对你有一定的参考价值。
这里的输出是= 5而不是15为什么根据x的代码值用15修改
class A {
int x = 5;
public int getX() {
return this.x;
}
public void setX(int x) {
this.x = x;
}
}
class B extends A {
int x = 10;
public B() {
this.x = 15;
}
}
public class Test {
public static void main(String[] args) {
B a = new B();
System.out.println("hello" + a.getX());
}
}
是因为变量的范围
你在x
再次重新宣布了B
:
class B extends A {
int x = 10; // <--- here
这会创建两个名为x
的字段。从现在开始,我将它们称为A.x
和B.x
。请注意,B.x
隐藏A.x
。这意味着如果变量的编译时类型是A
,则只能访问A.x
,而如果编译时类型是B
,则只能访问B.x
。
当你做new B()
时,A.x
被初始化为5
。 B.x
在构造函数中设置为15
。到目前为止简单。
但后来你打电话给getX()
。请注意,这是来自A
的方法。它不知道B.x
的存在,因为在它内部,this
的编译时类型是A
。所以在getX
内部,this.x
意味着A.x
。这就是5
被退回的原因。
要输出15
,您可以直接访问B.x
:
System.out.println(a.x);
或者,B
可以覆盖A.getX
和A.setX
返回并设置B.x
:
class B extends A {
int x = 10;
public B() {
this.x = 15;
}
@Override
public int getX() {
return x;
}
@Override
public void setX(int x) {
this.x = x;
}
}
a.getX()调用超类的get方法,从而在类A中返回x的值。
在B类中添加getter时,x的值为15。
class A {
int x = 5;
public int getX() {
return this.x;
}
public void setX(int x) {
this.x = x;
}
}
class B extends A {
int x = 10;
public B() {
this.x = 15;
}
public int getX() {
return this.x;
}
}
public class Test {
public static void main(String[] args) {
B a = new B();
System.out.println("hello" + a.getX());
}
}
您不能重新初始化存在于超类中的子类中的变量。这样,当获取x时,它将返回超类的x值而不是子类的值。所以在B级而不是int x = 10
使用x = 10
getX()未在类B中定义,因此它将引用超类作为方法的引用,因为引用在超类中找到它将执行超类的方法getX()。
如果在B类中添加getX(),则会执行相同的操作。
class A {
int x = 5;
public int getX() {
return this.x;
}
public void setX(int x) {
this.x = x;
}
}
class B extends A {
int x = 10;
public B() {
this.x = 15;
}
public int getX() {
return this.x;
}
}
public class Test {
public static void main(String[] args) {
B a = new B();
System.out.println("hello" + a.getX());
}
}
结果15。
以上是关于我的问题很简单,x的值在这里返回5,但为什么这个[重复]背后的原因是什么?的主要内容,如果未能解决你的问题,请参考以下文章
在设置表单上设置默认值在 Octobercms 中返回 null