創建對象方法調用順序
- 1.靜態代碼塊
- 2.構造代碼塊
- 3.構造器
- 4.先父類,再子類
對象創建
- new關鍵字
- 需要有相應構造器
- 根據class類在堆中爲對象分配空間
- 調用相應的構造器來初始化對象
- 將在堆中分配的空間地址的傳遞給在棧中的引用
- 需要有相應構造器
- 反射
- 利用Class類的newInstance方法,創建對象。
- 底層調用無參構造器,所以需要確保有無參構造器
- 反序列化
- 將已經序列化的對象,反序列化到內存中創建對象
- 需要實現Serializable接口
- 克隆
- 克隆一個已存在的對象
- 原對象實現cloneable接口,並且重寫clone方法
- 注意淺拷貝問題
構造器
概念
- 類中用來初始化對象的方法,構造器與類名相同,且沒有返回值
特點:
- 名稱與類名相同
- 方法沒有返回值和返回值類型
- 只能和new一起使用
- 修飾符不能爲abstract static final
- 可以存在return語句,但是後面不能跟返回值
- 調用其他構造器用this()關鍵字
- 構造器見不要互相調用
作用
- 初始化對象屬性,不是創建對象
空構造器
- 沒有參數的構造器
- 如果沒有,編譯時自動加入空構造
引用與內存分析
- 引用特點
- 引用存在棧中,對象存在堆中
- 同一時刻,一個引用只能指向一個對象
- 一個對象可以有多個引用,任意一個對其修改,其他引用也可見該變化
- java一切爲值傳遞,不過引用傳遞拷貝的是地址值
this
- 作用
- 代表當前對象
- 注意點
- this(。。。)指代構造器,只能放構造器的第一行
- this。屬性,調用成員屬性
- this不能出現在被static修飾的內容中
單例模式
- 核心
- 對外只提供一個實例化對象
- 步驟
- 構造器私有
- 對象內部持有當前對象的引用
- 對外提供一個獲取當前對象的方法
- 懶漢式單例
- 調用獲取對象的方法時創建單例的實例化對象
public class Student {
private static Student student;
private Student () {
}
public static Student getInstance () {
if (student == null) {
student = new Student();
}
return student;
}
}
- 餓漢式單例
- 類加載時,就創建一個單例的實例化對象
public class Student {
private static Student student = new Student();
static {
student = new Student();
}
private Student () {
}
public Student getInstance () {
return student;
}
}
代碼塊
- 靜態代碼塊
- 格式:static{}
- 位置:類內,方法外
- 執行時間:加載class文件時
- 其內不能使用成員變量
- 只在類加載時執行一次,其餘不加載
- 構造代碼塊
- 格式{}
- 位置:類內,方法外
- 執行時間:構造器之前
- 可以使用成員變量,靜態的和非靜態的
- 在每次創建對象時加載
普通代碼塊
- 格式:{}
- 位置:方法內
- 每次方法被調用時加載
同步代碼塊
- synchronized(){}
垃圾回收
System.gc:通知jvm進行垃圾回收,但是jvm有自己內部的垃圾回收機制,所以何時回收不知道。
回收時,調用finalize方法