我不明白我的程序的输出,请解释
I don't understand output of My program, Explain please
我有 4 个 class 和 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); }
}
在主class
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 - 3 行。
此时,MySuperClass.v
=2,MySubClass.v
=1,MyOtherClass.v
=-1
我将它们称为超级、次级和其他。
现在,mif[0].getV()
returns 2. 因此,mif[2].myMethod(2) 调用 MySubClass.myMethod(2),后者又调用 myMethod() 和 Super.myMethod(2)
现在,myMethod() 将 Super.v 的值更改为 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
您可能已经注意到我解释的输出与当前的不同 post,那是因为我 100% 确定 OP 将输出错误地复制到他的问题中。
我有 4 个 class 和 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); }
}
在主class
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 - 3 行。
此时,MySuperClass.v
=2,MySubClass.v
=1,MyOtherClass.v
=-1
我将它们称为超级、次级和其他。
现在,mif[0].getV()
returns 2. 因此,mif[2].myMethod(2) 调用 MySubClass.myMethod(2),后者又调用 myMethod() 和 Super.myMethod(2)
现在,myMethod() 将 Super.v 的值更改为 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
您可能已经注意到我解释的输出与当前的不同 post,那是因为我 100% 确定 OP 将输出错误地复制到他的问题中。