请考虑以下Java代码:
class a
{
int i = 10;
int j = 20;
}
class b extends a
{
int i = 100;
int j = 200;
}
public class Test
{
public static void main(String args[])
{
a a1 = new a();
b b1 = new b();
a1 = b1;
System.out.println("a1.i is " + a1.i);
System.out.println("a1.j is " + a1.j);
System.out.println("b1.i is " + b1.i);
System.out.println("b1.j is " + b1.j);
}
}
我得到的输出是
a1.i is 10
a1.j is 20
b1.i is 100
b1.j is 200
我的查询是:为什么语句a1 = b1不能将a1.i更改为100,将a1.j更改为200?语句a1 = b1不变吗?
最佳答案
您正在将类B
的实例上载到类A
的实例。
表演后
a1 = b1
那么从技术上讲,您将无法通过变量
b1
访问a1
字段。这是因为a1
,无论它是否“来自” b1
的赋值,在转换之后,实际上都是A
类的实例。考虑一下:您在类
i
和类j
中都定义了字段A
和B
的一个实例这一事实并不意味着它们完全相关。我认为您打算执行以下操作(从概念上):
class A {
int i;
int j;
public A() {
i = 10;
j = 20;
}
}
class B extends A {
public B() {
i = 100;
j = 200;
}
}
然后试试这个
A a1 = new A();
B b1 = new B();
a1 = b1;
System.out.println("a1.i is " + a1.i); // 100
System.out.println("a1.j is " + a1.j); // 200
System.out.println("b1.i is " + b1.i); // 100
System.out.println("b1.j is " + b1.j); // 200
如果执行此操作,则类
B
设置从类A
继承的字段。届时,您将获得预期的行为。这是因为,即使将B
的实例下调为A
的实例,也始终会突变从A
继承的字段,而不是当前示例中的B
。关于java - 使用Java中的两个类对继承进行基本查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28650601/