0

在静态方法覆盖的情况下..我已经开发了下面的代码

class Ab {  
    static void getF() {
        System.out.println("I am saral");
    }
}

class Ham extends Ab {
    static void getF() {
        System.out.println("I am saral saxena");
    }
    public static void main(String[] args) {
        // Ham h = new Ham();
        // h.getF(); //Ham
        Ab a = new Ham();
        a.getF(); // Ab class
    }
}

现在我的问题是,如果我在使用多态行为时覆盖静态方法,Ab a = new Ham();在这个阶段我仍然得到getF();类的方法Ab,请指教。

4

4 回答 4

5

不能覆盖静态方法。

静态方法属于类。您可以致电Ab.getF()Ham.getF()- 您在编码时选择了哪个。

在类层次结构中将静态方法命名为相同没有任何影响(除了可能对程序员造成混淆)。静态方法是属于类而不是实例的浮动代码。只有实例方法对覆盖敏感。

出于这个原因,在实例上调用静态方法(正如您所拥有的)是一种糟糕的风格,因为它使该方法看起来是一个实例方法。它在语言中是允许的,但会导致程序员混淆,从而导致错误,特别是如果静态方法的名称类似于实例方法 - 例如,发现名为setName(String)静态方法的方法可能是正当杀人的理由。

于 2012-05-05T11:35:50.647 回答
4

在编译时,实例调用的静态方法与声明变量的类一起编译,而不是实际实例化的类,因此a.getF();结果是 isAb.getF();和 not Ham.getF();

通常使用实例而不是类名调用静态方法是一种非常糟糕的做法。(我认为最好的例子是对实例的调用Thread.sleep()thread假设它会导致实例线程休眠,但实际上当前线程会)

于 2012-05-05T11:35:17.450 回答
0

覆盖静态函数是不可能且无用的(我避免使用术语方法,因为方法与对象相关)。

当需要根据对象的类调用不同的静态函数时,这样做

class Ab {  
 private static void getF() {
    System.out.println("I am saral");
 }
 public void doit () {
   getF ();
 }
}
class Ham extends Ab {
 private static void getF() {
    System.out.println("I am saral saxena");
 }
 @Override
 public void doit ()
 {
    getF ();
 }
 public static void main(String[] args) {
    Ab a = new Ham();
    a.doit(); // Ham class
}

}

顺便说一句,将get用于函数 return void很奇怪

于 2012-05-05T11:45:21.290 回答
0

首先,您不能将派生类中具有名称和签名的静态方法与基类中的静态方法称为覆盖的情况相同。

这是因为在重写的情况下,编译器不会为函数调用生成字节码,因为在运行时会根据引用变量的多态行为来解析将调用哪个实际方法。

覆盖实际上是由编译器的这种动态行为定义的(而不是由具有相同签名方法的基类和子类定义,这些只是覆盖的先决条件)。

静态方法是类实体,因此绑定到引用变量而不是运行时对象,因此方法调用仅在编译时解析(基于引用变量的类型或类名,如果由它引用。

同样,如果您在超类和子类中都有具有相同名称和类型的公共实例变量或静态变量,则将选择具有变量类型的变量而不是运行时对象。

于 2012-09-07T13:31:56.697 回答