类方法继承

3
我被告知Java中的静态方法没有继承,但当我尝试以下测试时:
package test1;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        TB.ttt();
        TB.ttt2();
    }

}

package test1;

public class TA {
static public Boolean ttt()
{
    System.out.println("TestInheritenceA");
    return true;
}
static public String test ="ClassA";
}

package test1;

public class TB extends TA{
static public void ttt2(){
    System.out.println(test);
    }
}

它打印出:

TestInheritenceA ClassA

那么Java的静态方法(和字段)是否具有继承性(如果尝试调用类方法,它是否沿着继承链寻找类方法)。这种情况曾经不是这样吗?还有哪些面向对象语言的类方法像这样混乱?


显然,静态方法可以被继承,但不能被覆盖,所以C#是否也有这个问题?其他语言呢?

3个回答

5
在Java中,字段和静态方法是可以继承的,但不能被覆盖 - 我相信那个告诉你“它们没有被继承”的人是这个意思。
非私有、非静态方法是可以被继承并且可以被覆盖的。

2
同时在答案中添加“非最终” :) - Shimi Bandiel
我完全忘记了这个问题,并在几天前讨论Java时犯了同样的错误,在IRC上。 - Roman A. Taycher

3

这种情况一直存在,但你无法覆盖类方法:

class A {
  public static void a() { system.out.println("A"); }
}

class B {
  public static void a() { system.out.println("B"); }
}

A a = new A();
a.a(); // "A"

B b = new B();
b.a() // "B"

a = b;
a.a(); // "A"

如果B不扩展A,赋值将无法工作,整个问题也就毫无意义了... :D - ZeissS

0
那就是static的意思。它表示每个类。静态字段和方法在实例之间共享。如果您更改静态值,则会在所有实例中反映出来。

无论方法是否被标记为静态,它们始终在实例之间共享。请修改该语句。 - Singleton
我提到了静态值。方法是行为。 - Sid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接