为什么在Java中会发生这种情况?
我了解java已经有一段时间了,但有时我认为,我缺少一些基本概念。下面是我正在尝试运行的代码:为什么在Java中会发生这种情况?,java,Java,我了解java已经有一段时间了,但有时我认为,我缺少一些基本概念。下面是我正在尝试运行的代码: class A{ int x =10; void al(){ System.out.println("From a"); } } class B extends A{ int x = 20; void al(){ System.out.println("From b"); } public static v
class A{
int x =10;
void al(){
System.out.println("From a");
}
}
class B extends A{
int x = 20;
void al(){
System.out.println("From b");
}
public static void main(String args[]){
A obj = new B();
B obj1 = new B();
A obj2 = new A();
System.out.println(obj.x);
obj.al();
System.out.println(obj1.x);
System.out.println(obj2.x);
}
}
以下是输出:
10
From b
20
10
当我尝试调用函数al时,它调用B类中的函数。这里正在发生简单的重写。Obj尝试先在基类中查找,然后在超类中查找。
现在,当我试图通过objectobj访问“X”时,它显示“10”。
为什么不显示“20” 不能像覆盖方法一样覆盖属性。“obj”被声明为类型A的对象,尽管实例是类型B。A.x和B.x是两个不同的属性,并且没有任何关联,尽管A.al()被B.al()覆盖。您不能像覆盖方法一样覆盖属性。“obj”被声明为类型A的对象,尽管实例是类型B。A.x和B.x是两个不同的属性,并且没有任何关联,尽管A.al()被B.al()覆盖。您的问题,特别是,似乎是“为什么
System.out.println(obj.x);
打印10而不是20?”
obj
被声明为A
,因此obj.x
将始终解析为A
中存在的x
字段。没有字段的名称
最终,您的问题是Java中没有字段重写。超级类中的字段刚刚得到。当你申报时
class A {
int x = 10;
}
class B extends A{
int x = 20;
}
并实例化a
B
,返回的对象实际上包含两个整数。它们有相同的名称这一事实基本上是偶然的,只会使单独引用它们稍微困难一些,这通常就是为什么你应该选择不同的名称。你的问题,特别是,似乎是“为什么System.out.println(obj.x);
打印10而不是20?”
obj
被声明为A
,因此obj.x
将始终解析为A
中存在的x
字段。没有字段的名称
最终,您的问题是Java中没有字段重写。超级类中的字段刚刚得到。当你申报时
class A {
int x = 10;
}
class B extends A{
int x = 20;
}
并实例化a
B
,返回的对象实际上包含两个整数。它们具有相同的名称这一事实基本上是偶然的,只会使单独引用它们稍微困难一些,这通常是您应该选择不同名称的原因。实例变量
不能被覆盖。它们是在编译时解析的,而不是实例方法。实例变量不能被重写。它们是在编译时解析的,而不是在实例方法中。因为A.x和B.x是不同的野兽,因为B重新声明了XYU,所以您需要在继承中引用向上转换和向下转换等概念,这就是这里发生的情况Java中不存在属性重写签出:因为A.x和B.x是不同的野兽,因为B重新声明了XYU需要参考继承中的向上投射和向下投射等概念这就是此处发生的情况JavaCheck out中不存在属性重写: