我知道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
关键字为子类提供了超类实例变量。
答案 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
。