【问题标题】:I don't understand output of My program, Explain please我不明白我的程序的输出,请解释一下
【发布时间】:2019-09-22 18:29:03
【问题描述】:

我有 4 个类和 1 个接口
interface中有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

【问题讨论】:

  • 无意冒犯,但它看起来像是故意弄得一团糟
  • 是的,我不明白输出是 3 1 为什么不是 4 0
  • 你能解释一下为什么你认为输出应该是'4 0'吗?描述代码执行的步骤。
  • 我在帖子中添加了描述
  • 我认为您没有正确复制输出。你可能得到 2, 1, 2 -1, 3, -1, 3 -1。请再次检查。

标签: java methods subclass superclass inherited


【解决方案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)

现在,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

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

【讨论】:

  • 非常感谢,但我真的不明白为什么 myMethod() 的值是 super.v 而不是 sub.v (对不起我的问题不明显和我的语法)
  • @micky MySubClass 继承了 MySuperClass 的方法和变量。这意味着 MySubClass.myMethod(2) 依次调用 Super.myMethod() 和 Super.myMethod(2),所以 Super.v 的值从 2 变为 -1,然后从 -1 变为 3跨度>
  • @micky 如果您的问题得到了满意的回答,请将此答案标记为已接受,并点赞,以便其他人也可以参考此问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多