Java基礎之this,static,建構函式
阿新 • • 發佈:2019-01-26
建構函式函式名與類名相同 不用定義函式的返回值 沒有具體的返回值(因為建構函式沒有結果)建構函式:構建創造物件時候調動的函式,可以給物件初始化,但給物件賦值推薦用setpublic class Person{ public Person() { System. out.print("我被new了" ); } public static void main(String[] args) { Person p = new Person();//會選擇空引數的建構函式進行呼叫 }}預設的建構函式 如果沒有在該類中定義建構函式,編譯的時候會自動的加上一個空引數的建構函式,但是如果你手動加了一個建構函式,那麼該類預設的建構函式就沒有了 建構函式和一般函式的區別
多個建構函式是以過載的形式體現的建構函式記憶體圖解this關鍵字的作用this:this所在函式所屬物件的引用,簡單的說,哪個物件呼叫了this所在的函式,this就代表哪個物件this關鍵字呼叫其他建構函式 必須放在第一句話。this(String name);因為初始化動作要先執行this的實際應用public class Demo { public static void main(String[] args) { Person p = new Person("張三" , 17); Person p2 = new Person("李四" , 18); //這麼呼叫是不是有點太牽強了呢? System. out.print(p.compare(p, p2)); }}class Person { public Person(String name, int age) { this.name = name; this.age = age; } public String name ; public int age ; public boolean compare(Person p, Person p2) { return p.age == p2.age; }}可以利用this這麼調public boolean compare(Person p ) { return this.age == p.age; }p1.compare(p2 );static關鍵字 1.資料共享public String name ;public static String country;//正常情況下, 要是建立一個物件,其中每個物件都會建立country的全域性變數 //但是你發現,國家都是中國,這個時候就可以加上static靜態的,不然會導致資料重複 //static起到了資料共享的作用,單獨存放在一個區域,誰要用呼叫它就可以了2.static關鍵字特點 2.1載入順序,static優先於物件的存在進記憶體之後先載入被static修飾的成員,隨著類的載入就載入完。 因為static需要資料共享,要是先載入物件的話,需要共享資料 找誰去啊? 2.2static修飾的成員被所有物件所共享 例子:就像飲水機一樣,飲水機就像是被static修飾的成員一樣 如果要是想用飲水機,就得用杯子,但是杯子不用一個, 這時候就需要物件,飲水機就被很多杯子所共享2.2呼叫方式 可以用過new物件的方式來呼叫 可以用過類名.靜態成員來呼叫2.3什麼時候用,static修飾的資料是共享資料,而物件儲存的是特有資料 靜態的好處就是又多了一種呼叫方式,而且不用建立物件 那麼name如果變成靜態的,如果一個物件給name變成李磊 是不是所有name都變成了李磊,這樣就行,有些資料是共享 的。 在一個就是靜態變數隨著類的消失而消失,很佔記憶體,如果你載入很多類 那麼Java雖然有GC機制,但是相對來說還是少用為好!3.成員變數和靜態變數的區別 3.1變數的生命週期不同 成員變數 隨著物件的建立而建立,隨著物件被GC回收被釋放 靜態變數 隨著類的載入而存在,隨著類的消失而消失 3.2變數的呼叫方式不同 成員變數 只能用過new物件的方式訪問 靜態變數 可以用過類名訪問,還可以通過物件訪問,但推薦用類名訪問 3.3別名不同,叫發不同 成員變數 -- 例項變數 靜態變數 -- 類變數3.4資料的儲存位置不同成員變數 儲存在堆記憶體中,所以也叫物件的特有資料 靜態變數 儲存在方法區的靜態方法區,所以也叫物件的共享資料4.static關鍵字注意事項 4.1靜態函式不可以訪問非靜態成員(成員函式,成員變數)class Demo{ public static String name; public int age ; public void getName() { System. out.print(Demo.name + this. age); }}class Demo{ public static String name; public int age ; public static void getName() { System. out.print(age); }}//很好解釋,因為靜態變數是根據類的建立而來的。有類的時候還沒有物件呢,你訪問age,就是訪問物件中的age 4.2靜態函式裡面不可以使用this和super關鍵字 也很好解釋,因為類變數先有,你this指向的是所屬物件,有類的時候還沒有物件,那麼this指向誰呢?4.3main函式就是一個靜態的 public 因為許可權必須是最大的 static 不需要物件呼叫,直接需要主函式的類名呼叫即可 void 主函式沒有具體的返回值,因為返回給JVM,JVM要它有啥用啊 main 函式名稱,並不是關鍵字,只是被JVM識別的名字 String[] args 主函式引數列表,String型別的陣列public static void main(String[] args)//new String[0]預設是這樣的 { //執行的時候輸入 java Demo 張三 李四 王五 System. out.println(args.length ); for(int x = 0; x < args.length; x++) { System. out.print(args[x] + "\n" ); } }區域性程式碼塊和構造程式碼塊定義在方法中的程式碼塊,叫區域性程式碼塊。作用是:讓變數儘可能的早的從記憶體消失,提高程式效率
定義在方法外的程式碼塊,叫做構造程式碼塊。作用是:建構函式重複的資料定義在構造程式碼塊中,每次呼叫構造都會先執行構造程式碼塊Random和Math Random類 Random r = new Random(); 空引數的建構函式有預設種子 Random r = new Random(long send);保持隨機數隨機一次之後不變 r.nextInt(); int範圍內隨意一個數 r.nextInt(int x); 隨機一個從0開始(包含0),到x結束(不包含x)的隨機數Math靜態類 int randomNumber = (int)(Math.random() * 100 + 1);
建構函式在物件建立時,就會呼叫對應的建構函式,對物件進行初始化操作一般函式在物件建立後,需要函式功能時才呼叫建構函式物件建立時,會呼叫一次一般函式在物件建立後,呼叫多次
多個建構函式是以過載的形式體現的建構函式記憶體圖解this關鍵字的作用this:this所在函式所屬物件的引用,簡單的說,哪個物件呼叫了this所在的函式,this就代表哪個物件this關鍵字呼叫其他建構函式 必須放在第一句話。this(String name);因為初始化動作要先執行this的實際應用public class Demo { public static void main(String[] args) {
定義在方法外的程式碼塊,叫做構造程式碼塊。作用是:建構函式重複的資料定義在構造程式碼塊中,每次呼叫構造都會先執行構造程式碼塊Random和Math Random類 Random r = new Random(); 空引數的建構函式有預設種子 Random r = new Random(long send);保持隨機數隨機一次之後不變 r.nextInt(); int範圍內隨意一個數 r.nextInt(int x); 隨機一個從0開始(包含0),到x結束(不包含x)的隨機數Math靜態類 int randomNumber = (int)(Math.random() * 100 + 1);