首页 > 解决方案 > 无法理解一组 Java 对象的输出

问题描述

有4个班:

class Lower extends Middle {
     private int i;
     private String name;
     public Lower(int i){
         super(i+1);
         name = "Lower";
         this.i = i;
     }
     public void set(Lower n){ i = n.show();}
     public int show(){return i;}
}

class Middle extends Upper {
    private int j;
    private String name;
    public Middle(int i){
        super(i+1);
        name = "Middle";
        this.j = i;
    }
    public void set(Upper n){ j = n.show();}
    public int show(){return j;}
} 

class Upper {
    private int i;
    private String name;
    public Upper(int i){
        name = "Upper";
        this.i = i;
    }
    public void set(Upper n){ i = n.show();}
    public int show(){return i;}
} 

class Tester {
    public static void main(String[] args){
        Lower a = new Lower(1);
        Middle b = a;
        Upper c = new Middle(5);
        System.out.println(a.show());
        System.out.println(b.show());
        System.out.println(c.show());
        a.set(c);
        b.set(a);
        c.set(b);
        System.out.println(a.show());
        System.out.println(b.show());
        System.out.println(c.show());
    }
}

我对测试器类中的 6 个打印语句给出的输出感到非常困惑。给出的输出是 1, 1, 5, 1, 1, 1 但我认为它应该是 1, 1, 5, 5, 5, 5。很明显,我的问题在于理解为什么变量'a'没有在下一行设置为5,而它之后的所有行似乎都这样做了。

a.set(c);

因为虽然“c”被声明为 Upper 类型,但它实际上是一个“Middle”类型的变量,因为它在测试器中被设置为“Middle”变量“b”的值。因此,将使用的“set”方法应该是“Middle”类中的方法。按照这个逻辑,我认为“a”的值将设置为“5”,但它似乎仍为“1”。但我似乎无法弄清楚为什么。

任何帮助将不胜感激!

标签: javainheritancesubtyping

解决方案


你的 Lower 类没有方法set(Upper n),它只有一个方法set(Lower n)。因此a.set(c);,当您拨打. 这依次设置了中间的 j,但跳过了较低的 i。set(Upper n)set(Upper n)


推荐阅读