標籤:
用構造器確保初始化
構造器與類名稱相同;是一種特殊類型的方法,因為它沒有返回值。
在建立對象時,會為對象分配儲存空間,並調用相應的構造器。
不包含任何參數的構造器叫做預設構造器
方法重載
class Person { public Person() {} public Person(String name){} public Person(String name,int age){}}
每個方法都有獨一無二的參數類型列表
1.如果傳入的資料類型小於方法中聲明的形式參數類型,實際資料類型就會被提升; char略有不同,如果無法找到恰好接受char參數的方法,就會把char直接提升至int型
2.如果傳入的實際參數大於重載方法聲明的形式參數,就需要進行強制轉換,否則編譯器就會報錯。eg:void test(byte b) {}int i = 5;test(i);//編譯器會報錯
預設構造器
預設構造器又名“無參”構造器,是沒有形式參數的。
如果類中沒有構造器,編譯器會自動幫你建立一個預設構造器。
用於建立一個“預設對象”
this關鍵字
this關鍵字只能在方法內部使用,表示對“對調用方法的那個對象”的引用
如果在方法內部調用同一個類的另一個方法,就不必使用this,直接調用即可
class Test { private Test(){} public Test newInstance() { return this; }}
class Test { String s; public Test(){this("test");} public Test(String s){this.s = s;}}
構造器中只能用this調用一個構造器,並且必須置於初始處
除構造器外,編譯器禁止其他方法調用構造器
可以通過類本身來調用static方法,也可以通過對象來調用
static方法就是沒有this的方法
在static方法內部不能調用非靜態方法,反過來是可以的。
清理:終結處理和記憶體回收
java記憶體回收行程負責回收無用對象佔據的記憶體資源
記憶體回收行程只知道釋放那些經由new分配的記憶體
一旦記憶體回收行程準備好釋放對象佔用的儲存空間,將首先調用其finalize(),並且在下一次記憶體回收動作發送時,才會真正回收對象佔用的記憶體
無論是“記憶體回收”還是“終結”,都不保證一定會發生。如果java虛擬機器(JVM)並未面臨記憶體耗盡的情形,它是不會浪費時間去執行記憶體回收以恢複記憶體的。
System.gc()用於強制進行終結動作
Java虛擬機器採用一種自適應的記憶體回收技術。
標記-清掃:從堆棧和靜態儲存區出發,遍曆所有的引用,進而找出所有存活的對象。每當它找到一個存活的對象,就會給對象設一個標記,這個過程中不會回收任何對象。只有全部標記工作完成的時候,清理動作才會開始。在清理過程中,沒有標記的對象將被釋放,不會發生任何複製動作。停止-複製:先暫停程式的運行,然後將所有的存活的對象從當前堆複製到另一個堆,沒有被複製的全部都是垃圾。“標記-清掃”與“停止-複製”都是在程式暫停情況下才能進行。Java虛擬機器會進行監視,如果所有對象都很穩定,記憶體回收行程的效率降低的話,就切換到“標記-清掃”方式;同樣,Java虛擬機器會跟蹤“標記-清掃”效果,要是堆空間出現很多片段,就會切換回“停止-複製”方式
1.對象可能不被記憶體回收2.記憶體回收並不等於“析構”3.記憶體回收只與內容有關
成員初始化
方法的局部變數沒有初始化就會編譯出錯
類的資料成員沒有初始化就會被賦予預設初始值boolean:falsechar:0(空白)byte,short,int,long:0float,double:0.0對象:null
在定義類成員變數的地方為其賦值
class Test { int i = 10; //方式1 int j = getNum(i); //方式2 private int getNum(int i) { return i * 10; }}
構造器初始化
在運行時刻,可以調用方法或執行某些動作來確定初值
無法阻止自動初始化的進行,它將在構造器被調用之前發生
static關鍵字不能應用於局部變數,無論建立多少個對象,待用資料都只佔一份儲存地區靜態初始化只有在必要時刻才會進行,靜態初始化只在Class對象首次載入的時候進行一次
假設有個類為Dog
1.首次建立Dog對象(或Dog的靜態方法/靜態域首次被訪問)時,編譯器首先會找到Dog.class檔案2.載入Dog.class,執行所有有關靜態初始化的動作3.使用new Dog()建立對象時,首先在堆上為Dog對象分配足夠的儲存空間4.這Block Storage空間會被清零,將Dog對象中所有基本類型資料設定成預設值(預設初始化),設定引用為null5.執行所有出現與欄位定義處的初始化動作(指定初始化)6.執行構造器
變數定義的先後順序決定了初始化的順序,即使變數定義散佈於方法定義之間,它們仍舊會在任何方法(包括構造器)被調用之前得到初始化。
//當new Hello()時,對象建立順序依次為t1,t2,t3,t4,t5,t6//靜態對象 - 靜態代碼塊初始化 - 顯示初始化 - 構造代碼塊初始化 - 建構函式初始化class Test { public Test(int marker) { System.out.println("Test(" + marker + ")"); }}class Hello { static Test t1 = new Test(1); Test t3 = new Test(3); Test t4; Test t5; static { //靜態代碼塊,只執行1次 Test t2 = new Test(2); } { //構造代碼塊,先於構造器初始化,無論調用哪個建構函式,都會執行該初始化 t4 = new Test(4); } public Hello() { t5 = new Test(5); Test t6 = new Test(6); }}
數組初始化
類型後加[],如int[] i;或int i[];
int[] i = {1,2,3};Integer[] a = new Integer[]{new Integer(1),2,new Integer(3)};
int[] j = new int[10];
Random rand = new Random();int[] a = new int[rand.nextInt(20)];
Object[] obj = new Object[]{new Integer(1),new Float(2.0),new Double(3.0)};Object[] objects = new Integer[]{1,2,3};
class Test { public static void main(String[] args) { Test test = new Test(); test.printArray(1, new String("Hello"), new Float(2.0)); test.printArray(2, (Object[])new String[] {"Hello","World"}); test.printArray(0); } public void printArray(int num, Object... objects) { System.out.print(num + " "); for (Object object : objects) { System.out.print(object + " "); } System.out.println(); }}
枚舉類型
由於枚舉類型的執行個體是常量,按照命名慣例都用大寫字母表示
枚舉類型可以在switch語句內使用
class Test { public enum Animal { PIG, DOG, SHEEP, DUCK, WOLF } public static void main(String[] args) { for (Animal animal : Animal.values()) { System.out.println(animal.ordinal() + " : " + animal); } Animal animal = Animal.PIG; System.out.print(animal); }}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
JAVA基礎之初始化與清理