我开发了以下类,如下所示
class Ab {
int i = 10;
static void getF() {
System.out.println("I am good");
}
}
class Hamm extends Ab {
int i = 10;
static void getF() {
System.out.println("I am good and bad boy");
}
public static void main(String[] args) {
//Hamm h = new Hamm();
// h.getF(); //Ham
Ab a = new Hamm(); //reference of parent class
//a.getF(); // Ab class
}
}
现在我的查询是存在任何场景,我得到的是类Ab的变量i,但是类Hamm的方法是getF(),请指教。
答案 0 :(得分:2)
将方法声明为非静态方法。无论如何,您将它用作实例方法。静态方法无法覆盖。
以下是一份工作样本:
class Ab {
int i = 10;
void getF() {
System.out.println("I am good");
}
}
class Main extends Ab {
int i = 10;
@Override
void getF() {
System.out.println("I am good and bad boy");
}
public static void main(String[] args) {
//Hamm h = new Hamm();
// h.getF(); //Ham
Ab a = new Main(); //reference of parent class
a.getF(); // Ab class
}
}
ideone上的链接。
答案 1 :(得分:0)
创建Hamm
的实例时,实例将使用子类Hamm
上定义的变量和方法,因为它们将覆盖父方法/字段。
答案 2 :(得分:0)
静态方法和类变量(属性)不能像实例方法一样被重写(非静态方法)。
答案 3 :(得分:0)
java中的方法是多态的。如果你知道C ++认为所有非静态方法都是“虚拟的”。这意味着将调用实际的实现,例如在您的情况下,在类Hmmm
中完成实现。
字段不是多态的,因此a.i
会返回属于i
类的Ab
变量,因为a
是Ab
类型的变量。
答案 4 :(得分:0)
我认为你的问题是因为你的方法是静态的,它隐藏了子类的方法。因此,每次调用该方法时,都会执行父类中的方法。顺便说一句,因为你已经在两个地方将变量'i'初始化为10,你如何知道价值的来源?