关于通过子类重写类的方法的案例

时间:2013-02-21 10:07:28

标签: java

我开发了以下类,如下所示

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(),请指教。

5 个答案:

答案 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变量,因为aAb类型的变量。

答案 4 :(得分:0)

我认为你的问题是因为你的方法是静态的,它隐藏了子类的方法。因此,每次调用该方法时,都会执行父类中的方法。顺便说一句,因为你已经在两个地方将变量'i'初始化为10,你如何知道价值的来源?