12、構造方法與匿名對象

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、匿名對象只能夠使用一次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章