Я не понимаю вывод моей программы, объясните пожалуйста - PullRequest
0 голосов
/ 04 мая 2019

У меня есть 4 класса и 1 интерфейс
В интерфейс есть 2 абстрактных метода (myMethod (int k) и getV ())

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

В MySuperClass, который реализует MyInterface

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); }
} 

В MySubClass , расширяющий MySuperClass

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
31

Я не понимаю, строка 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 Ответ

1 голос
/ 04 мая 2019

Полагаю, вы поняли строки 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 скопировал результаты в свой вопрос неправильно.

...