请考虑以下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中都定义了字段AB的一个实例这一事实并不意味着它们完全相关。

我认为您打算执行以下操作(从概念上):

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/

10-12 12:39
查看更多