0

私はfield hidingJavaで呼ばれる概念を知っています。しかし、それでも、インスタンス変数がオーバーライドされていないことに関連して混乱が生じています。

私の現在の知識によると、スーパークラスのメソッドをオーバーライドするということは、スーパークラスのメソッドがサブクラスで使用可能であっても、JVMがサブクラスのオーバーライドされたメソッドを呼び出すことを意味します。

field hidingそして、私はリンクを介して同様のことを読みました:-フィールドを隠す

したがって、いずれの場合も、サブクラスで継承されたインスタンス変数の値を変更すると、インスタンスが過剰に削除されます。

私は混乱しています助けてください。


私は次のスーパークラスを使用しています:-

public class Animal{
File picture;
String food;
int hunger;
int width, height;
int xcoord, ycoord;

public void makeNoise(){
.........
}

public void eat(){
.............
}

public void sleep(){
..........
}

public void roam(){
.............
}

}

Tiger、cat、dog、hippoなどのサブクラスがあります。サブクラスは、makeNoise()、eat、roam()メソッドをオーバーライドします。

ただし、各サブクラスは、インスタンス変数に異なる値のセットも使用します。

混乱しているように、私はスーパークラスのAnimalのすべてのインスタンス変数と3つのメソッドをオーバーライドしています。superそして、キーワードを使用してサブクラスで使用できるスーパークラスのインスタンス変数がまだあります。

4

3 に答える 3

1

これは、スーパークラスでメソッドを呼び出すと、サブクラスでオーバーライドされたバージョンに解決されることを意味します(インスタンスがサブクラスの場合)。ただし、メンバー変数への参照は、呼び出しが行われたクラスでのその変数の宣言にバインドされます。

于 2012-10-22T09:39:13.947 に答える
1

まあ、オーバーロードは一般的に関数/メソッドのオーバーロードを指します

関数の入力と出力のタイプが互いに異なる同じ名前の複数のメソッドを作成できます。これは、1つの機能がさまざまなタスクを実行する能力として簡単に定義されます。

ご覧のとおり、この用語は、インスタンス変数(フィールド)ではなく、関数/メソッドに関連しています。後者は、オーバーロードしたり、オーバーライドしたりすることはできません。たとえば、この質問を参照してください。

あなたの例に関して:実際には、あなたは祖先のフィールドをオーバーライドするのではなく、それらを非表示にします。

例:

class Human {
    String name;
    int age;

    public Human(String n, int a) {
        this.name = n;
        this.age = a;
    }

    public void tell_age() {
        System.out.println("I am "+this.age);
    }
}

class Female extends Human {
    // We want to HIDE our real age ^^
    String age = 'not too old';

    public Female(String n, int a) {
        this.name = n;
        super.age = a;
    }

    // We override the parent's method to cloak our real age,
    // without this, we would have to tell our true age
    public void tell_age() {
        System.out.println("I am "+this.age);
    }

    // Ok, we give in, if you really need to know
    public void tell_true_age() {
        System.out.println("I am "+super.age);
    }
}
public static void main(String[] args) {
    Female Jenna = new Female('Jenna', 39);

    Jenna.tell_age(); // => I am not too old
    Jenna.tell_true_age(); // I am 39
}
于 2012-10-22T09:48:32.370 に答える
0

一般にoverride、メソッドを説明するために使用しますが、フィールドは説明しません。しかし、あなたは彼らが同様の振る舞いをしていると言うでしょう。

  • それらが同じフィールド名/メソッドシグネチャを持っている場合
  • を使用しない限り、サブクラス1は常にスーパークラス1をオーバーライドしますsuper
于 2012-10-22T10:20:19.660 に答える