-1

我开发了下面的类,如下所示

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(),请告知。

4

5 回答 5

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的链接。

于 2013-02-21T10:12:03.993 回答
0

创建 的实例时Hamm,该实例将使用子类上定义的变量和方法,Hamm因为它们将覆盖父类的方法/字段。

于 2013-02-21T10:10:53.180 回答
0

静态方法和类变量(属性)不能像实例方法(非静态方法)一样被覆盖。

于 2013-02-21T10:11:43.743 回答
0

java中的方法是多态的。如果您了解 C++,则认为所有非静态方法都是“虚拟的”。这意味着将调用实际的实现,例如,在您的情况下,实现是在 class 中完成的Hmmm

但是,字段不是多态的,因此a.i返回i属于Abclass 的变量,因为a它是 type 的变量Ab

于 2013-02-21T10:12:38.157 回答
0

我认为您的问题是因为您已将方法设为静态,从而隐藏了子类的方法。因此,每次调用该方法时,都会执行父类中的方法。顺便说一句,既然您在两个地方都将变量“i”初始化为 10,那么您怎么知道值来自哪里?

于 2013-02-21T10:14:24.250 回答