2018.10.7學習筆記
10.7學習筆記
今天學習了《Java程式設計思想》的第六、七章。下面對今日學習收穫與疑惑作總結。
1.JAVA_HOME、PATH、CLASSPATH:
①JAVA_HOME:jdk的安裝路徑。
②PATH:作用是指定java命令的搜尋路徑,jdk安裝目錄下的bin目錄下包含java的各種命令,如java、javac等命令。因此,將bin目錄新增到PATH路徑,使系統在PATH路徑下搜尋java命令執行。
③CLASSPATH:告訴java執行環境,在哪些目錄下可以找到Java程式執行所需的類和包,通俗的說它的作用與import和package關鍵字有關。總之,系統會在CLASSPATH路徑下尋找java執行所需的類和包。
2.怎麼防止類被繼承:
①將類的唯一定義的一個構造方法設定為private。
②將類用final關鍵字修飾。
3.類的訪問許可權:
只能使用public或者預設的包內訪問這兩種方式來定義類的訪問許可權控制。
4.Object類的方法:
clone(實現物件的淺複製)、getClass(final方法,獲得執行時型別)、toString、finalize、equals(使用“==”來判斷,一般會重寫該方法)、hashCode、wait、notify、notifyAll。
5.淺複製與深複製:
①引用拷貝:
建立一個指向物件的引用變數的拷貝
Teacher teacher = new Teacher("Taylor",26);
Teacher otherteacher = teacher;
System.out.println(teacher);
System.out.println(otherteacher);
/**
[email protected]
[email protected]
*/
他們屬於同一個物件,只是將引用賦給otherteacher並沒有建立新的物件。
②物件拷貝(深複製與淺複製)
淺複製:
對一個物件進行復制,該物件的類中的基本型別資料域直接將值複製給另外一個物件,而對於物件資料域,複製的則是該物件資料域的引用(即沒有建立新的該資料域物件)。
深複製:
深複製較淺複製的區別就是,對於物件資料域,其建立一個新的物件,並將原物件資料域的引用賦給該新的物件。因此,深複製實現了真正的建立一個物件的複製。
/** * description:深複製與淺複製,基礎篇P443 * 淺複製對物件資料域採用的是複製其引用 * 深複製對物件資料域採用的是建立新的物件,將引用賦給物件 * 但是無論是深複製還是淺複製,複製完之後==都返回flase * */ package net.fuqian.learn.model; import java.util.Date; public class House implements Cloneable,Comparable<House> { private int id; private double area; private Date whenBuilt; public House(){ whenBuilt = new Date(); } public House(int id,double area){ this.id = id; this.area = area; whenBuilt = new Date(); } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getArea() { return area; } public void setArea(double area) { this.area = area; } public Date getWhenBuilt(){ return whenBuilt; } /** * @description 深複製 * @throws CloneNotSupportedException */ @Override public Object clone() throws CloneNotSupportedException{ House houseClone = (House)super.clone(); houseClone.whenBuilt = (java.util.Date)(whenBuilt.clone()); return houseClone; } /** * * @description 淺複製 * @Override * public Object clone() throws CloneNotSupportedException{ * return super.clone(); * } */ @Override public int compareTo(House house){ if (area > house.area){ return 1; }else if (area < house.area){ return -1; }else return 0; } } package net.fuqian.learn.model; public class client { public static void main(String args[]) throws CloneNotSupportedException{ House house_1 = new House(1,100); House house_2 = (House) house_1.clone(); System.out.print("兩個house物件引用地址是否相等:"); System.out.println(house_1 == house_2); System.out.print("兩個house物件內容是否相等:"); System.out.println(house_1.equals(house_2)); //object中的equals()方法採用的是判斷 == ,因此這句程式碼沒有意義,除非重寫equals方法 System.out.print("兩個house物件的whenBuilt資料域物件引用地址是否相等:"); System.out.println(house_1.getWhenBuilt() == house_2.getWhenBuilt()); System.out.print("兩個house物件的whenBuilt資料域物件內容是否相等:"); System.out.println(house_1.getWhenBuilt().equals(house_2.getWhenBuilt())); } }
6.main方法的呼叫不受訪問控制權限:
即對於main方法來說類的訪問控制權限都無效(相當於public)。
7.當建立了一個匯出類的物件時,該物件包含了一個父類的子物件。
8.呼叫父類構造方法是你在建立子類構造方法的第一件事(帶引數的構造方法)。
9.組合和繼承的取捨以及結合:
問一問自己是否需要從子類向父類進行向上轉型。
10.初始化與載入:
在java中,每個類的編譯程式碼都存在於他自己的獨立的檔案中,該檔案只在需要使用程式程式碼時才會被載入,即類的程式碼在初次使用時被載入。通常載入發生在建立第一個類的物件時候或者訪問static域或static方法的時候。
繼承與初始化:
public class Insect {
private int i = 9;
protected int j;
Insect(){
System.out.println("i = " + i + ",j = " + j);
j = 39;
}
private static int x1 = printInit("static Insect.x1 initialized");
public static int printInit(String s){
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = printInit("Beetle.k initialized");
public Beetle(){
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2 = printInit("static Beetle.x2 initialized");
public static void main(String args[]){
System.out.println("Beetle constructor");
Beetle beetle = new Beetle();
}
}
/*
output:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9,j = 0
Beetle.k initialized
k = 47
j = 39
*/
①第一步,先試圖訪問Beetle.main方法,於是載入器開始查詢Beetle的編譯程式碼,編譯器發現他有一個父類,於是繼續向上進行載入,直到載入完所有的父類。(不管你是否打算產生一個該父類的物件,都會載入)。
②根基類的static初始化,然後向下一個子類初始化。全部初始完畢之後,必要的類都已載入完畢,物件就可以建立了。首先,物件中所有基本型別被設定為預設值,物件引用設為null。
③根基類的構造方法被呼叫,依次向下呼叫。