構造方法總結:
構造方法: 特殊方法,它的作用是在對象建立的時候自動執行一些初始化工作。
特徵: a.方法名與類名一致
b.沒有傳回值類型,甚至連void也沒有
c.不能被final static synchronized abstract等修飾
d.不可以像普通方法一樣隨意調用,只能在對象建立時調用一次
e.所有的類都必須有構造器(若類中沒有構造器,編譯器會自動添加一個無參構造器,若類中有構造器,編譯器不會自動添加無參構造器)
構造器的使用:構造器可以重載
構造器間可以利用this()調用,實現連鎖調用,但至少應該有一個沒有使用this()(不能無限遞迴)
this()調用必須在第一行(有效行),保證對其他構造器的調用必須先執行。
包含構造器,對象在建立時,記憶體中的執行過程分析:
來源程式:
記憶體執行過程分析:
匿名對象:建立一個對象,直接調用對象的方法,不將對象的記憶體位址儲存在參考型別變數
匿名對象可以作為實參給方法傳值。
若在方法中以對象為參數時,在方法中可以利用引用修改對象的資訊。
物件導向中的兩個關鍵字:package,import
package:告訴編譯器當前源檔案中的所有類最終產生class檔案後,class檔案儲存的包目錄結構。
package必須寫在程式的第一行。
命名:字母全部小寫
四部分:機構類型名稱.機構名稱.項目名稱.模組名稱
註:類中一旦使用了package語句,這個類的編譯不一樣,
javac -d . 源檔案.java (在目前的目錄中產生package語句中指示的包目錄結構)
類名不一樣,在調用這個類的時候一定要寫類的全限定名稱(全稱包名+類名)
import: 導類,建議一個一個類的匯入,這樣更清晰。
import作用告訴編譯器,當前的源檔案中要使用的其他包的類在什麼包目錄下面。
java.lang包中所有類都已經自動匯入。
對於構造器,對象作為參數傳遞,package,import關鍵字有如下小例子供參考。
package com.atguigu.javase.javabean;/** Student類,包含id,name,gender,major屬性封裝, 並提供兩個構造器,一個是無參的另一個是4個參數的 並添加say方法 再添加一個參數的構造器,參數是id, 在構造器中使用this(...)實現構造器的連鎖調用*/public class Student { //對屬性進行封裝 private int id; private String name; private String gender; private String major; //無參構造器,若是自己沒有定義構造器,系統會自動添加一個預設的無參構造器 public Student() { this(1); //利用this()實現構造器的連鎖調用(調用,棧結構) //this()必須在有效行的第一行,保證對其他構造器的調用必須先執行 //this()不能無限遞迴 System.out.println("Student()...."); } //參數為id的有參構造器 public Student(int id) { this(id,"未知","未知","未知"); System.out.println("Student(int)...."); } //參數為int id, String name, String gender, String major的有參構造器 public Student(int id, String name, String gender, String major) { this.id = id; this.name = name; this.gender = gender; this.major = major; System.out.println("Student(int,String,String,String)"); } //為外界提供一個公用調用屬性的方法 //id的set/get方法 public void setId(int id) { this.id = id; } public int getId() { return id; } //neme的set/get方法 public void setName(String name) { this.name = name; } public String getName() { return name; } //gender的set/get方法 public void setGender(String gender) { this.gender = gender; } public String getGender() { return gender; } //major的set/get方法 public void setMajor(String major) { this.major = major; } public String getMajor() { return major; } //將形參設定為參考型別的,如Phone ph //在該類中使用其他類的對象 public void call(Phone ph) { System.out.println(this.say() + ",在使用手機" + ph.say() + "打電話"); } //say方法 public String say() { return "學號:" + id + ",名字:" + name + ",性別:" + gender + ",專業:" + major; }}
package com.atguigu.javase.javabean;/* 寫一個phone類,屬性os,screen 在Student類中添加一個方法,call(Phone phone) 在測試類別中調用call方法*/public class Phone { private String os; private double screen; public Phone() { } public Phone(String os, double screen) { this.os = os; this.screen = screen; } public void setOs(String os) { this.os = os; } public String getOs() { return os; } public void setScreen(double screen) { this.screen = screen; } public double getScreen() { return screen; } public String say() { return "[作業系統:" + os + ",螢幕大小:" + screen + "]"; }}
package com.atguigu.javase.test; //機構類型名.機構名稱.項目名稱.模組名稱import com.atguigu.javase.javabean.Student; //匯入Student類import com.atguigu.javase.javabean.Phone; //匯入Phone類/** 在測試類別中分別使用兩個構造器建立兩個對象, 列印輸出對象的詳細資料 註:1.類中一旦使用了package語句,這個類的編譯不一樣。 javac -d . 源檔案.java 在目前的目錄中產生package語句中 指示的包目錄結構 2.類中一旦使用了package語句這個類的類名也會不一樣。 在其他類中使用該類,必須使用該類的全限定名稱(全稱包名+類名)*/public class StudentTest { public static void main(String[] args) { //使用無參構造器建立對象 //com.atguigu.javase.javabean.Student s1 = new com.atguigu.javase.javabean.Student(); Student s1 = new Student(); System.out.println(s1.say()); //使用4參構造器建立對象 //com.atguigu.javase.javabean.Student s2 = new com.atguigu.javase.javabean.Student(2,"沈yl","男","電腦"); Student s2 = new Student(2,"沈yl","男","電腦"); System.out.println(s2.say()); //s2.call(new com.atguigu.javase.javabean.Phone("andriod",5.0)); s2.call(new Phone("andriod",5.0)); }}