java靜態變數和靜態函式是否可以被繼承,重寫!

langgufu314發表於2010-06-19
可以的,做個實驗就可以證明了:
//Test.java
class A{
static int i=9;
static void print(){System.out.println(i);}
}

class B extends A{}

public class Test{
public static void main(String[] args){
B.print();//這裡B的print()就是A裡面的
System.out.println(B.i);//這裡B.i就是A.i
}
}

結果:
>java Test
9
9
>Exit code: 0


可以被繼承的,但是不可以被重構
一個Java方法不能被子類override,也不支援多型性,並不奇怪。構造方法就是如此。TIJ說構造方法是隱含的靜態方法,我同意這個說法。


舉一個例子:
class Base
{
public static void someMethod()
{
System.out.println("in static method of Base");
}

}

class Derived extends Base
{
public static void someMethod()
{
System.out.println("in static method of Derived");
}

}

class Client
{
public static void main(String[] args)
{
Derived.someMethod();

Derived d = new Derived();
d.someMethod();

Base o = new Derived();
o.someMethod();

}

}

執行時會列印出
in static method of Derived

in static method of Derived

in static method of Base

顯然,到底執行哪一個靜態方法,是由變數的明顯型別決定的,而不是由物件的真實型別決定。這不是多型性的。
誰呼叫靜態函式,執行的靜態函式就屬於誰!

相關文章