/** * 拷貝建構函式---Copyf t2 = new Copyf(t1);就不會在調用預設建構函式了。 * 複製clone和引用 * 重載是在同一個類(範圍)中,覆蓋是子類對父類而言。 重載不關心傳回值類型。 靜態方法不能被覆蓋。 * override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了聲明,而我們在實現時,就需要實現介面聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全符合,才能達到覆蓋的效果;2、覆蓋的方法的傳回值必須和被覆蓋的方法的返回一致;3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。overload對我們來說可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載要注意以下的幾點:1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));2、不能通過存取權限、傳回型別、拋出的異常進行重載;3、方法的異常類型和數目不會對重載造成影響;4、對於繼承來說,如果某一方法在父類中是存取權限是priavte,那麼就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。 建構函式不能被繼承。子類建構函式中必定顯示或隱式調用了父類的建構函式。注意:當父類顯示定義了有參數的建構函式,編譯器就不會為它指定一個參數為空白的預設建構函式給子類調用了。 * */package t;import java.util.Vector;class Copyf{private String a = "z";//屬於建構函式的一部分,且首先執行--等同於寫在建構函式中private String b;public String getA() {return a;}public void setA(String a) {this.a = a;}public String getB() {return b;}public void setB(String b) {this.b = b;}//用建構函式複製(就不會在執行預設建構函式了),根據需要複製相應的屬性。比如你不想複製屬性a,則下面第一句話a = source.a;就不用。public Copyf(Copyf source){//a = source.a;b = source.b;}//建構函式public Copyf(){System.out.println("預設建構函式");}//用方法複製。public Copyf clone(){Copyf t = new Copyf();t.a= a;t.b = b;return t;}}public class MyThreadPrinter2{ public static void main(String[] args) throws Exception { Copyf t1 = new Copyf();t1.setA("a");Copyf t2 = new Copyf(t1);//拷貝建構函式---未拷貝aCopyf t3 = t1.clone();//一般成員方法System.out.println(t2.getA() );System.out.println(t3.getA());Vector<String> va = new Vector<String>();va.add("123");Vector<String> va2 = va;//引用Vector<String> va3 = (Vector<String>)va.clone();//copy-clone//va.get(0);va.set(0, "234");System.out.println(va2.get(0));System.out.println(va3.get(0));} }