2009年5月20日 星期三

static member的繼承

熊熊想到一個問題,當member是static的時候,繼承下來會如何
private的member當然也可以繼承,只是subclass無法直接取用,但是可以透過superclass放出來的public function來控制

實驗了一下程式碼

class Parent{
static int data;
static void f(){
System.out.println("Parent");
}
}
class Children extends Parent{

}
...
public static void main(String[] args) {
Parent.data++;
Children.data++;
System.out.println(Parent.data);
Children.f();
}
//output:
2
Parent


static的成員子類別一樣可以共用
但是將程式碼改程如下呢?

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
Parent.data++;
Children c=new Children();
System.out.println(Parent.data);
System.out.println(c.data);
}

}
class Parent{
static int data;
static void f(){
System.out.println("Parent");
}
}
class Children extends Parent{
int data;
}
//output:
1
0

或是這樣

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
Parent.data++;
Children c=new Children();
System.out.println(Parent.data);
System.out.println(c.data);
}

}
class Parent{
static int data;
static void f(){
System.out.println("Parent");
}
}
class Children extends Parent{
static int data;
}
//output:
1
0

很神奇,可以跑,父類別的data被子類別的data給遮蔽了
那加上函式如何呢?

class Children extends Parent{
int data;

void f(){
System.out.println("Children");
}

}

很可惜,出現錯誤訊息

This instance method cannot override the static method from Parent

看樣子static函式沒辦法直接被實體函式遮蔽,只能被複寫
同樣的,如果父類別的函式為instance子類別同名函式也不能有static

class Children extends Parent{
int data;

static
void f(){
System.out.println("Children");
}
}

這樣就可以了,閒來無事的小試驗

沒有留言: