我不了解我的程序的输出,请解释

时间:2019-05-04 13:08:04

标签: java methods subclass superclass inherited

我有4个班级和1个界面
界面中有2个抽象方法(myMethod(int k)和getV())

public interface MyInterface
{ public abstract void myMethod(int k);
 public abstract int getV();
} 

在实现MyInterface的 MySuperClass

public class MySuperClass implements MyInterface
{ private int v;
 public MySuperClass() { this(2); }
 public MySuperClass(int vValue) { v = vValue; }
 public void myMethod(int k) { v += k; }
 public void myMethod() { v--; }
 public int getV() { return v; }
 public String toString() { return Integer.toString(v); }
} 

在扩展MySuperClass的 MySubClass

public class MySubClass extends MySuperClass
{ private int v;
 public MySubClass() { this(1); }
 public MySubClass(int vValue) { v = vValue; }
 public void myMethod(int k) { myMethod(); super.myMethod(k); }
 public int getV() { return v; }
 public String toString() { return super.toString() + " " + Integer.toString(v); }
} 

MyOtherClass 实现MyInterface

public class MyOtherClass implements MyInterface
{ private int v;
 public MyOtherClass() { this(0); }
 public MyOtherClass(int vValue) { v = vValue; }
 public void myMethod(int k) { v-= k; }
 public void myMethod() { v++; }
 public int getV() { return v; }
 public String toString() { return Integer.toString(v); }
} 

public class MyMain {
    public static void main(String[] args) {
    MyInterface[] mif
                = {new MySuperClass(), new MyOtherClass(), new MySubClass()};

        mif[mif[2].getV()].myMethod(1);
        for (int i = 0; i < mif.length; i++) {
            System.out.println(mif[i]);
        }
        mif[mif[0].getV()].myMethod(2);
        for (int i = 0; i < mif.length; i++) {
            System.out.println(mif[i]);
        }}}

输出
2
-1
2 1
2
-1
3 1

我不知道第6行是 3 1 ,为什么不是 4 0

我认为输出是4 0,因为
mif [mif [0] .getV()]。myMethod(2); => mif [2] .myMethod(2); => MySubClass.myMethod(2);
public void myMethod(int k) {myMethod(); super.myMethod(k); }
我认为'myMethod()'将'v'更改为1因此v = 0 和super.myMethod(k)将'v'更改为2,因此v = 4

1 个答案:

答案 0 :(得分:1)

我假设您已经了解了1-3行。

此时,MySuperClass.v = 2,MySubClass.v = 1,MyOtherClass.v = -1

我将它们称为Super,Sub和Other。

现在,mif[0].getV()返回2。因此,mif [2] .myMethod(2)调用MySubClass.myMethod(2),后者又调用myMethod()和Super.myMethod(2)

现在,将 Super.v 的myMethod()的值更改为1,然后将Super.myMethod(2)的Super.v的值从1更改为3

此时,Super.v = 3,Sub.v = 1,Other.v = -1

因此,第4行给出Super.v = 3
第5行给出Other.v = -1
第6行给出Super.v Sub.v = 3 1

您可能已经注意到,我解释的输出与当前文章有所不同,这是因为我100%确信OP将输出复制到他的问题中是错误的。