1. 程式人生 > >Java基礎之this,static,建構函式

Java基礎之this,static,建構函式

建構函式函式名與類名相同     不用定義函式的返回值     沒有具體的返回值(因為建構函式沒有結果)建構函式:構建創造物件時候調動的函式,可以給物件初始化,但給物件賦值推薦用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);