在java中说“实例变量没有被过度使用”是什么意思?

时间:2012-10-22 09:24:33

标签: java member-hiding

我知道java中的field hiding概念。但是我仍然对实例变量没有被过度使用感到困惑。

根据我目前的知识,覆盖超类的方法意味着JVM将调用子类的重写方法,尽管超类的方法可用于子类。

我通过链接阅读field hiding的类似内容: - Hiding Fields

因此,在任何情况下,如果我们更改子类中继承的实例变量的值,我们就会过度消除实例。

我很困惑请帮忙。


我正在使用以下超类: -

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(){
.............
}

}

它有虎,猫,狗,河马等子类。子类覆盖了makeNoise(),eat和roam()方法。

但是每个子类也为实例变量使用不同的值集。

因此,根据我的困惑,我有点超越所有实例变量和超类Animal的3个方法;并且我仍然使用super关键字为子类提供了超类实例变量。

3 个答案:

答案 0 :(得分:1)

这意味着如果在超类中调用方法,它将解析为子类中的覆盖版本(如果您的实例是子类)。但是,对成员变量的引用将绑定到进行调用的类中该变量的声明。

答案 1 :(得分:1)

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

  

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

你看,这个术语与函数/方法有关 - 而不是实例变量(字段)。后者不能超载也不能被覆盖。参见例如this question

关于你的例子:实际上,你不是覆盖祖先的字段,而是隐藏它们。

一个例子:

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
}

答案 2 :(得分:0)

通常,我们使用override来描述方法,但不使用字段。但你会说他们有类似的行为。

  • 当他们具有相同的字段名称/方法签名时
  • 除非您使用super
  • ,否则子类1将始终覆盖超类1