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

好吧,重载通常是指函数/方法重载

允许创建多个具有相同名称的方法,这些方法在函数的输入和输出类型方面彼此不同。它被简单地定义为一个功能执行不同任务的能力。

您会看到,该术语与函数/方法有关 - 而不是实例变量(字段)。后者不能被重载或覆盖。参见例如这个问题

关于您的示例:实际上,您并没有覆盖祖先的字段,而是隐藏了它们。

一个例子:

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描述方法而不是字段。但是你会说他们有类似的行为。

  • 当它们具有相同的字段名称/方法签名时
  • 除非您使用super.
于 2012-10-22T10:20:19.660 回答