Java繼承的使用
這裡的問題是分別求出A和B的例項的個數。如下面的程式碼。
class Counter
{
private static int count = 0;
public static synchronized void Add() { count++; }
public static synchronized int getNumber() { return count; }
}
class A extends Counter
{
public A() { }
public void addA() { Add(); }
}
class B extends Counter
{
public B() { }
public void addB() { Add(); }
}
public class Test
{
public static void main(String[] args)
{
A[] aa = { new A(), new A() };
B[] bb = { new B(), new B(), new B() };
for(int i=0; i<aa.length; i++) { aa[i].addA(); }
for(int i=0; i<bb.length; i++) { bb[i].addB(); }
System.out.println(A.getNumber() + " A and " + B.getNumber() +" B");
}
}
輸出結果為:5 A and 5 B
對這個結果還是比較好理解的,因為Counter類中的count是static型別的。
但是這裡要說的是,這裡的繼承關係使用的合適嗎?類A和類B都不是“計數器(Counter)”,所以這裡使用繼承關係不合適。
在設計一個類的時候,如果該類構建於另一個類的行為之上,那麼你有兩種選擇:一種是繼承,即一個類擴充套件另一個類;另一種是組合,即在一個類中包含另一個類的一個例項。選擇的依據是,一個類的每一個例項都是另一個類的一個例項,還是都有另一個類的一個例項。在第一種情況應該使用繼承,而第二種情況應該使用組合。當你拿不準時,優選組合而不是繼承。
下面是重新設計的類。類A和類B中各自有一個計數器域,而且這些計數器域是靜態的。
class A
{
private static int count = 0;
public A() { }
public void addA() { count++; }
public static int getNumber() { return count; }
}
class B
{
private static int count = 0;
public B() { }
public void addB() { count++; }
public static int getNumber() { return count; }
}
public class Test
{
public static void main(String[] args)
{
A[] aa = { new A(), new A() };
B[] bb = { new B(), new B(), new B() };
for(int i=0; i<aa.length; i++) { aa[i].addA(); }
for(int i=0; i<bb.length; i++) { bb[i].addB(); }
System.out.println(A.getNumber() + " A and " + B.getNumber() +" B");
}
}
輸出結果為:2 A and 3 B
相關文章
- Java的繼承Java繼承
- Java繼承Java繼承
- java中的繼承Java繼承
- java繼承extendsJava繼承
- Java單繼承Java繼承
- java中繼承Java中繼繼承
- JAVA 之 繼承Java繼承
- java繼承-super的用法Java繼承
- Java的類與繼承Java繼承
- java的繼承機制Java繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- java -繼承 -重寫Java繼承
- Java繼承練習Java繼承
- Java繼承和介面Java繼承
- Java集合繼承圖Java繼承
- Java:類與繼承Java繼承
- Java 繼承詳解Java繼承
- Java介面之間的繼承Java繼承
- java 繼承的基礎(轉)Java繼承
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- java繼承與多型Java繼承多型
- Java 繼承是什麼?Java繼承
- java物件導向繼承Java物件繼承
- 12.16 Java繼承Java繼承
- 【Java】繼承、抽象、組合Java繼承抽象
- java抽象繼承-模板方法Java抽象繼承
- 三種繼承的方法:public 繼承/private繼承/protected繼承詳解及區別繼承
- javascript原型鏈繼承的使用JavaScript原型繼承
- CSS的繼承和使用方式CSS繼承
- java容器類的繼承結構Java繼承
- Java中的繼承與組合Java繼承
- Java建構函式的繼承Java函式繼承
- 原型,繼承——原型繼承原型繼承
- 菱形繼承,虛繼承繼承
- Java程式碼塊與Java繼承Java繼承
- 為什麼說Java中要慎重使用繼承Java繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- 公有繼承、私有繼承和保護繼承之間的對比繼承