1. 程式人生 > >Day7 建構函式 this指標 static修飾符

Day7 建構函式 this指標 static修飾符

建構函式特點 1 函式名與類名一致 2不用寫返回型別 3 沒有具體返回值作用 給物件初始化 注意 多個建構函式是以過載的形式存在呼叫順序1 mian入棧 2建立p2物件開闢地址 3person(n,a)建構函式入棧並賦值4 傳給給堆裡的資料 初始化完畢 5 把堆裡資料的地址給p2 6建構函式彈棧class Person{private String name;private int age;Person(){System.out.println("建構函式構造中");}Person(String n,int a){name =n;age=a;}public void speak(){System.out.println(name+"...."+age);}}class demo{public static void main(String [] args){Person p2 = new perpson("小強",10);}}建構函式 物件建立時就會呼叫與之對應的建構函式對物件初始化 只調用一次一般函式 物件建立時需要呼叫函式功能時才呼叫 可以多次呼叫過載 引數順序不同也會過載
this指標(虛基類)引例:建構函式: Person (String name) { name=name; }類的初始化: Person p=new Person("小強");p.show(); 結果為 null,0因為person(String name)建構函式在棧裡建了一個name的變數,自己賦給自己,不賦給物件成員變數和區域性變數重名1.當局部變數和成員變數重名時,可以用this來區分this:代表當前物件(所在函式所屬物件的引用)哪個物件呼叫了this所在函式,this就代表哪個物件建構函式: Person (String name) { this.name=name; }類的初始化: Person p=new Person("小強");p.show(); 結果為 小強,0
2.用於一個建構函式呼叫另一個建構函式[注意]只能定義在建構函式的第一行
this應用 /*判斷是否為同齡人*/ public boolean compare(person p) { /*if(this.age!=p.age) return false; else return true;*/ return this.age==p.age; }}staticstatic修飾成員函式則該函式不能使用this物件static不能修飾建構函式、函式引數、區域性成員變數最大特點:不用建立物件就可以呼叫 多一種呼叫方式 直接 類名.靜態成員 person.country特點 是一個修飾符,用於修飾成員 static修飾的成員被所有成員共享 優先於物件存在,其隨著類的載入而載入 修飾的是共享資料,物件中儲存的是特有資料成員變數(例項變數)和靜態變數(類變數)的區別 1.生命週期不同成員變數隨著物件的建立而存在,隨著物件的回收而釋放靜態變數隨著類的載入而存在,隨著類的消失而消失 2.呼叫方式不同成員變數只能被物件呼叫靜態變數可以被物件呼叫,還可以被類名呼叫 3.資料儲存位置不同成員變數資料儲存在堆記憶體的物件中,所以也叫例項變數靜態變數資料儲存在方法區(的靜態區),所以也叫物件的共享資料 4.隱藏靜態變數前隱藏的是 類名.成員變數前隱藏的是 this靜態使用的注意事項
1.靜態方法只能訪問靜態成員(非靜態既可以訪問靜態也可以訪問靜態)2.靜態方法中不可以使用this或者super關鍵字3.主函式是靜態的理解主函式1.格式是固定的public static void main(String [] args)public:許可權必須最大 static:不需要物件,直接用主函式所屬類名呼叫即可main:函式名,不是關鍵字,只是jvm識別的固定的名字String [] args:這是主函式的引數列表,是一個數組型別的引數,而且元素都是字串型別測試class maindemo{ public static void main(String [] args) jvm建立了 new String[0]的String陣列 { System.out.println(args); [Ljava.lang.String;@15db9742 System.out.println(args.length); 0 System.out.println(args[0]); 越界 }但如果在cmd中 java maindemo後面加字串 haha lala xixi結果就會如下class maindemo{ public static void main(String [] args) jvm建立了 new String[0]的String陣列 { System.out.println(args); [Ljava.lang.String;@15db9742 System.out.println(args.length); 3 System.out.println(args[0]); haha }記憶體呼叫
main先入棧呼叫method時,method入棧,堆記憶體無任何產生,直接呼叫靜態變數country,完成後出棧建立p物件,開闢地址,並在堆記憶體中建立臨時變數,初始化name=null,age=0建構函式進棧,把name賦給this.name,age賦給this.age,構造函數出棧show()函式進棧,呼叫靜態變數country,同時呼叫this.name和this.agestatic什麼時候用1.靜態變數相同資料 不需做修改 只需要使用2.靜態函式是否訪問靜態變數如果甚至成員變數靜態變數都不訪問,直接靜態函式(因為不會建立物件,不會浪費堆記憶體)靜態程式碼塊class staticode{static{int num=10;System.out.println("hahaha"); 隨著的載入而執行,而且只執行一次}void show(){System.out.println("hiahiahia");}}class staticdemo{public static void main(String [] args){new staticcode().show(); 結果new staticcode().show(); hahaha hiahiahia hiahiahia}}構造程式碼塊class person{private String name;{ //給所有物件初始化 有幾個物件就有幾次System.out.println("構造程式碼塊");}person() { //給對應的物件進行特定的初始化this.name="baby";}public void show(){System.out.println("name:"+name);}}class demo{person p1=new person();p1.show();person}-->預設初始化 顯式初始化 建構函式初始化-->父類靜態塊 --> 然後是子類靜態塊 --> 父類自由塊 --> 父類建構函式塊 --> 子類自由塊 --> 子類建構函式