1、本次的預計講解的知識
1、構造方法的定義語以及調用時機;
2、匿名的基本使用。
2、具體內容
現在已經清楚了對象的產生格式:
①類名稱 ②對象名稱 = ③new④類名稱();
· ①類名稱:規定了對象的類型,即:對象可以使用哪些屬性與那哪些方法,都是類定義的
· ②對象名稱:如果想使用對象,需要有一個名字,這是一個唯一的標記;
· ③new:開闢系新的堆內存空間,如果沒有此語句,對象無法實例化;
· ④類名稱():調用了一個和類名稱一樣的方法,這就是構造方法。
通過以上的簡短分析可以發現,所有的構造方法實際上一直在被調用,但是我們從來沒有定義一個構造方法,之所以能夠使用時因爲整個Java類中,爲保證程序的可以正常的執型,那麼即使用戶沒有定義任何的構造方法,在程序編譯之後自動的爲類裏面增加一個沒有參數,方法名稱與類名稱稱相同,沒有返回值得構造方法。
構造方法的定義原則:方法名稱與類名稱相同,沒有返回值聲明。
class Book { public Book () {} //無參的,無返回值得構造方法 } |
如果在我們Book類裏面沒有寫上以上的構造方法,那麼也會自動生成一個。
構造方法一直都存在,但是並沒有發現構造方法有什麼作用。
class Book { public Book () {//無參的,無返回值得構造方法 System.out.println("**********"); } } public class Demo { public static void main(String[] args) { Book book = null; //聲明對象 book = new Book();//實例化對象 } } |
通過以上的代碼可以發現,所有的構造方法都在使用關鍵字new實例化的時候被默認調用。
構造方法與普通方法的最大區別:
構造方法是在實例化新對象的時候只調用一次。
普通方法是在實例化對象產生之後可以隨意調用多次。
既然構造方法是在對象實例化的時候調用的,那麼請問,這樣的做法有什麼用處呢?
class Book { private String title ; //書的名字 private double price ; //書的價格 public void getInfo () { //此方法由對象調用 System.out.println("圖書名稱:" + title + "價格:" + price); } public String getTitle() { return title; } public void setTitle(String t) { title = t; } public double getPrice() { return price; } public void setPrice(double p) { price = p; } } public class TextDemo { public static void main(String[] args) { Book bookA = new Book() ; //使用默認生成的構造方法 bookA.setTitle("Java開發") ; bookA.setPrice(89.8) ; bookA.getInfo(); } } |
本程序是先實例化的了Book類對象,而後利用Book類的實例化對象去調用類中setter方法,如果要想設置全部屬性的內容,那麼一定要調用多次setter方法。
範例:定義一個構造方法
class Book { private String title ; //書的名字 private double price ; //書的價格 //已經明確定義了一個構造,默認的構造將不再自動生成 public Book (String t,double p) { title = t; setPrice(p);//調用類定中的setter方法 } public void getInfo () { //此方法由對象調用 System.out.println("圖書名稱:" + title + "價格:" + price); } public String getTitle() { return title; } public void setTitle(String t) { title = t; } public double getPrice() { return price; } public void setPrice(double p) { if (p > 0.0) { price = p; } } } public class TextDemo { public static void main(String[] args) { //在實例化的同時將所需要的類屬性傳遞到隊形方法裏 Book bookA = new Book("Java開發",89.8) ; //使用默認生成的構造方法 bookA.getInfo(); } } |
在實際的工作之中,構造方法的核心作用:在類對象實例化的時候設置屬性的初始化美容,構造方法是爲屬性初始化準備的。
如果一個類之中已經明確的定義了一個構造方法的話,那麼將不會自動生成默認的構造方法,即:一個類之中至少保留一個構造方法。
另外,既然構造方法與屬於方法的行列,可以針對於構造方法進行重載,但是構造方法由於其定義的特殊性,所以在構造方法重載時,要求只注意參數的類型及個數即可(方法名稱不可動)。
範例:構造方法重載
class Book { public Book() {//無參的,無返回值得構造方法 System.out.println("無參構造"); } public Book(String t) {//無參的,無返回值得構造方法 System.out.println("有一個參數的構造"); } public Book(String t,double p) {//無參的,無返回值得構造方法 System.out.println("有二個參數的構造"); } //其他方法省略 } public class Demo { public static void main(String[] args) { Book book = new Book(); } } |
在進行構造方法重載的時候有一點代碼編寫要求:請按照參數的個數進行升序或降序排列。
遺留問題:在定義一個類的時候樂意爲屬性直接設置默認值,但是這個默認值只有在構造執行完後纔會設置,否則不會設置,而構造方法是屬於對象構造過程的最後一步,即:是留給用戶處理的步驟。
在對象實例化過程之中,一定會經歷類的加載,內存的分配,默認值的設置,構造方法。
class Book { private String title = "Java開發"; punic Book() {}//title現在的默認值跟構造方法沒關係 } |
本程序之中,只有在整個構造都完成之後,纔會真正將“Java開發”這個字符串的內容設置給title,之前在沒有構造之前title都是其對應詩句類型的默認值。
那麼既然有了構造方法的概念,實際上就可以依照次方式使用匿名對象,之前定義的都屬於有名對象,所有的對象都給了一個名字,但是這名字真正使用的時候調用的肯定是堆內存空間,即:真是的對象信息都保存在可堆內存之中,那麼沒有棧指向的對象就稱爲匿名對象。
class Book { private String title ; //書的名字 private double price ; //書的價格 //已經明確定義了一個構造,默認的構造將不再自動生成 public Book (String t,double p) { title = t; setPrice(p);//調用類定中的setter方法 } public void getInfo () { //此方法由對象調用 System.out.println("圖書名稱:" + title + "價格:" + price); } public String getTitle() { return title; } public void setTitle(String t) { title = t; } public double getPrice() { return price; } public void setPrice(double p) { if (p > 0.0) { price = p; } } } public class TextDemo { public static void main(String[] args) { new Book("Java開發",89.8).getInfo(); } } |
但是匿名對象由於沒有其他對象對其進行引用,所以只能使用一次,一次之後該對象空間將稱爲垃圾,等待回收。
疑問?什麼時候使用有名對象,什麼時候使用匿名對象?
如果覺得匿名對象那個麻煩就都用有名的。
3、總結
1、構造方法的定義要求:方法名稱與類名稱相同無返回值聲明;
2、構造方法是在類對象使用關鍵字new實例化的時候被默認調用的,不管代碼如何改變,只要有了關鍵字new就一定需要構造方法;
3、一個類之中至少保留有一個構造方法,如果沒有明確定義構造方法,那麼會自動生成一個無參的什麼都不做的構造方法;
4、構造方法的核心功能是在類對象實例化的時候爲類中的屬性初始化;
5、構造方法重載時只要求考慮參數的類型即個數即可;
6、匿名對象只能夠使用一次。