1. 程式人生 > >2018.10.7學習筆記

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。
③根基類的構造方法被呼叫,依次向下呼叫。