1.1 構造方法與成員方法的區別jvm
構造方法分爲無參構造和有參構造,其中有參構造方法和無參構造方法爲方法的重載關係。分佈式
構造方法在初始化一個類的對象時進行調用,它沒有返回值,方法名與類名相同,而成員方法是則是由對象主動調用,它有返回值,表現爲對象的操做行爲。微服務
簡單來講,構造方法定義了一個對象,賦予了對象屬性值,而成員方法由對象主動調用,是對象具體行爲的表現。源碼分析
1.2 無參構造性能
[修飾符] 類名(){ } public Dog(){ }
當類中沒有定義無參構造時,jvm會默認分配一個無參構造。學習
1.3 有參構造this
[修飾符] 類名(Type arg1,Type arg2,…){spa
// 初始化代碼視頻
}對象
public Dog(String name,int health,int love,String strain){ name = name; health = health; love = love; strain = strain; }
在實例化有參構造方法的時候必須按照有參構造的參數列表的內容傳值。
當在類中定義了有參構造方法後,jvm不會再默認分配無參構造,所以在定義了有參構造方法後,應再定義一個無參構造方法,以便對對象進行建立。
1.4 對象初始化的內存圖
當一個類在進行編譯時,jvm會將該類的字節碼文件加載到方法區,並讀取類中定義的成員變量和方法,完成方法的加載並根據定義的屬性計算出須要申請的內存。在使用new關鍵字建立一個對象時,jvm會在堆區申請內存並進行初始化,該對象的內存地址儲存在棧區中,當咱們調用構造方法對該對象的屬性進行賦值時,會經過棧區的內存地址來對堆區的對象進行訪問。
封裝:將類的某些信息私有化,不容許外部程序直接訪問,而是經過該類提供的設置器和訪問器來實現對私有化信息的操做和訪問。
封裝的步驟
[1]屬性私有化
[2]提供公共的設置器和訪問器
[3]在設置器和訪問器中添加業務校驗邏輯
public class Dog{ // 【1】private 私有的,對外不可見 private String name; // 【2】提供公共的設置器(setter)和訪問器(getter) public void setName(String name){ // 【3】邏輯校驗 if(name.equals("")){ System.out.println("姓名不能爲空."); }else{ this.name = name; } } public String getName(){ return this.name; } public Dog(){ } public Dog(String name){ this.setName(name); } public void showInfo(){ System.out.print("個人名字叫"+this.name); } }
3. This關鍵字
this表示對象自己(引用),通常而言,類的外部使用對象名自己,類的內部使用This關鍵字。
3.1 This調用本類中的屬性
public class Dog{ String name; int health; int love; String strain; public Dog2(String name,int health,int love,String strain){ this.name = name; this.health = health; this.love = love; this.strain = strain; //調用本類中的屬性 } }
this用於訪問本類屬性,解決了局部變量和成員變量同名的問題。
3.2 This調用本類的方法
public class Dog{ private String name; public void setName(String name){ if(name.equals("")){ System.out.println("姓名不能爲空."); }else{ this.name = name; } } public String getName(){ return this.name; } public Dog(){ } public Dog(String name){ this.setName(name); //調用本類中的方法 } public void showInfo(){ System.out.print("個人名字叫"+this.name); } }
3.3 This調用本類的其餘構造方法(調用時應放首行)
public class Dog{ private String name;<br> private String heath; public void setName(String name){ if(name.equals("")){ System.out.println("姓名不能爲空."); }else{ this.name = name; } } public String getName(){ return this.name; }<br>
public void setHeath(String heath){ if(heath<0){ System.out.println("健康值不能爲0");<br> this.heath=0; }else{ this.heath=heath; } } public String getHeath(){ return this.heath; }
public Dog(){<br> } public Dog(String name){ this.setName(name); }
public Dog(String name){ this(name,health,love); //調用本類其餘構造方法 this.setStrain(strain); }}
4. static 關鍵字
static 關鍵字表示靜態,能夠修改變量,也能夠修飾方法。
4.1 靜態變量
靜態變量由static修飾,存放在方法區,可被類中的對象共享訪問。
訪問方式有兩種:[1] 類名.靜態變量(推薦); [2] 對象.靜態變量。
public class Car{ String brand; String type; float price; static int count = 0; //定義一個靜態變量 public Car(){ Car.count++; } public Car(String brand,String type,float price){ this.brand = brand; this.type = type; this.price = price; Car.count++; } public void showInfo(){ System.out.println("車輛信息:"); System.out.println("品牌:"+this.brand); System.out.println("型號:"+this.type); System.out.println("價格:"+this.price); System.out.println("我是第"+Car.count+"輛車"); //對靜態變量進行訪問 } }
4.2 靜態方法
靜態方法由static 修飾,歸類全部。
[修飾符] static 返回值類型 方法名(arg…){ }
訪問方式有兩種:[1] 類名.方法名(推薦); [2] 對象.方法名。
需注意的是,實例方法能夠訪問靜態成員,而靜態方法不能訪問非靜態成員。(在靜態成員被定義時,對象還未被定義。)
圖示小結:
代碼塊由{ }進行聲明,根據其位置能夠分爲普通代碼塊、靜態代碼塊、構造代碼塊、同步代碼塊(我還沒學到)。
5.1 普通代碼塊
普通代碼塊通常存在於方法或者類、方法等的定義中,普通代碼塊造成一個做用域。
public class Test03{ public static void main(String[] args){ int count_1 = 10; // 普通代碼塊 { int count_2 = 20; System.out.println("count_1:"+count_1); System.out.println("count_2:"+count_2); } // 在代碼塊的做用域外無效 System.out.println("count_2:"+count_2); } }
5.2 構造代碼塊
構造代碼塊位於類中。構造代碼塊在構造方法前執行。構造一個對象執行一次。
public class Person{ String name; int age; // 構造代碼塊 { System.out.println("構造代碼塊"); } public Person(){ System.out.println("構造方法"); } public Person(String name,int age){ this.name = name; this.age = age; } } //每當構造一個對象時,都會執行一次構造代碼塊中的語句。
5.3 靜態代碼塊
靜態代碼塊位於類中,歸類全部,用static修飾。在類加載時執行,在構建多個對象時只執行一次。
public class Person{ String name; int age; static{ System.out.println("靜態代碼塊"); } //靜態代碼塊 public Person(){ System.out.println("構造方法"); } public Person(String name,int age){ this.name = name; this.age = age; } } //靜態代碼塊在加載類時執行,在構建多個對象時只執行一次
小結:
靜態代碼塊通常用於初始化靜態資源,構造代碼塊通常用於初始化實例成員。
若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:787707172,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。