參考鏈接: Java中的繼承和構造函數
/**
?* 拷貝構造函數---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);//拷貝構造函數---未拷貝a
?
? ? ? ? Copyf 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));
?
?
? ? }? ?
}