难以理解一组Java对象的输出

时间:2019-04-20 01:34:43

标签: java inheritance subtyping

共有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());
    }
}

我对tester类中的6条print语句给出的输出感到非常困惑。给定的输出为1、1、5、1、1、1,但我一直认为应该改为1、1、5、5、5、5。显然,我的问题在于理解为什么变量'a'似乎在所有行之后都没有设置为5时才在下一行设置。

a.set(c);

由于尽管'c'被声明为Upper类型,但实际上它是'Middle'类型的变量,因为它在测试器中被设置为'Middle'变量'b'的值。因此,将使用的“设置”方法应该是“中间”类中的方法。按照这种逻辑,我认为“ a”的值将设置为“ 5”,但似乎仍为“ 1”。但我似乎不知道为什么。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您的Lower班级没有方法set(Upper n),只有方法set(Lower n)。因此,当您进行呼叫a.set(c);时,它被迫使用其父级的set(Upper n)方法(在本例中为Middle类),该方法确实具有set(Upper n)。依次将“ j”设置为“中”,但跳过“ i”。