简单泛型
一般的類和方法,只能使用具體的類型:要么是基本類型,要么是自定義的類。如果要編寫可以應用于多種類型的代碼,這種刻板的限制對代碼的束縛就會很大。----《java Generics FAQ》
多態算是一種泛化機制。例如,將方法的參數類型設為基類,那么該方法就可以接受從這個基類中導出的任何類作為參數。
泛型——java SE5,實現了參數化類型的概念,使代碼可以應用于多種類型。
容器類——促成泛型出現的原因。
java SE5之前:
public class Holder2{
private Object a;
public Hodler2(Object a){
this.a=a;
}
public void set(Object a){
this.a=a;
}
public Object get(){
return a;
}
}
Hodler2可以存儲任何類型的數據,但是一個Hodler2對象卻可以存儲多種不同類型的數據。而通常我們只會使用容器來存儲一種類型的數據。
泛型的目的之一就是用來指定容器要持有什么類型的數據,而且由編譯器來保證類型的正確性。
java SE5之后:
public class Hodler3<T>{
public T a;
public Hodler3(T a){
this.a=a;
}
public void set(T a){
this.a=a;
}
public T get(){
return a;
}
}
將需要使用的類型參數,用尖括號括起,放在類名后面。
1、元組類庫
僅一次方法調用就能返回多個對象的決解方法——創建一個對象,用它來持有想要返回的多個對象。
元組——將一組對象直接打包存儲于其中的一個單一對象。這個容器對象允許讀取其中元素,但是不允許向其中存放新的對象。
2維元組:
public class TwoTuple<A,B>{
public final A first;
public final B second;
public TwoTuple(A a,B b){
first=a;
second=b;
}
public String toString(){
return "("+first+","+second+")";
}
}
如果使用具有不同元素的元組,就強制要求他們另外創建一個新的TwoTuple對象。
使用繼承機制實現長度更長的元組
public class ThreeTuple<A,B,C> extends TwoTuple<A,B>{
public final C third;
public ThreeTuple(A a,B b,C c){
super(a,b);
third=c;
}
...
}
使用元組:
static TwoTuple<String,Integer> f(){
return new TwoTuple<String,Integer>("hi",47);
}
2、一個堆棧類
public class LinkedStack<T>{
private static class Node<U>{
U item;
Node<U> next;
Node(){
item=null;
next=null;
}
Node(U item,Node<U> next){
this.item=item;
this.next=next;
}
boolean end(){ ? ? ?//末端哨兵
return item==null&&next==null;
}
}
private Node<T> top=new Node<T>();
public void push(T item){
top=new Node<T>(item,top);
}
public T pop(){
T result=top.item;
if(!top.end())
top=top.next;
return result;
}
}
3、RandomList——每次調用select方法時,他可以隨機地選取一個元素
public class RandomList<T>{
private ArrayList<T>storage=new ArrayList<T>();
private Random rand=new Random(47);
public void add(T item){
storage.add(item);
}?
public T select(){
return storage.get(rand.nextInt(storage.size()));
}
}
------------------------------------------------------------from:http://lavasoft.blog.51cto.com/62575/18771/-----------------------------------------------------------------------------------
附:java中final的作用——
1、final修飾類——
final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。
2、final方法——
如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。
final方法的使用原因:
把方法鎖定,防止任何繼承類修改它的意義和實現。
高效。編譯器遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。
3、final變量——
用final修飾的成員變量表示常量,值一旦給定就無法改變。
4、final參數——
當函數的參數為final時,可以讀取不可修改。
注意:final類不能用于修飾構造方法。
父類private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認都是final類的。
java中static的作用——
1、static變量
被static修飾的變量稱為靜態變量或類變量。沒被static修飾的變量稱為實例變量。兩者區別:
靜態變量在內存中只有一個拷貝(節省內存),JVM只為靜態變量分配一次內存,在加載類的過程中完成靜態變量的內存分配。可用類名直接訪問,也可通過對象訪問(不推薦)。
對于實例變量,每創建一個實例就會為示例分配一次內存,實例變量在內存中有多個拷貝,互不影響。
2、靜態方法
靜態方法可以通過類名調用,任何實例也可以調用,因此靜態方法中不能用this和super關鍵字。不能直接訪問所屬類的實例變量和實例方法,只能訪問所屬類的成員變量和成員方法。
因為static方法獨立于任何實例,因此static方法必須被實現,不能時abstract。
3、靜態代碼塊
static代碼塊也叫靜態代碼塊,不在任何的方法體內,JVM加載類時會執行這些代碼塊,如果靜態代碼塊有多個,JVM將會按照它們在類中出現的順序依次執行,每個代碼塊只會被執行一次。
注意:static變量之前加private修飾,表示這個變量不能在其他類中通過類名直接引用。
4、final+static——“全局變量”
對于變量,表示一旦給值就不能修改,并且通過類名來訪問。
對于方法,表示不可覆蓋,并且可以通過類名來訪問。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
轉載于:https://www.cnblogs.com/Wan-notes/p/6795308.html
總結
- 上一篇: sql游标以及异常处理
- 下一篇: OneNote2016 解决 One