Day18---學習Java第二彈
阿新 • • 發佈:2021-07-28
2021-07-28
物件和類
二、類中的構造方法
先來看物件的產生格式:
1 ①類名稱 ②物件名稱 = ③new ④類名稱();
①類名稱:規定了物件的型別。即:物件可以使用哪些屬性和方法都是由類定義的;
②物件名稱:如果需要使用物件,需要有一個名稱,這是一個唯一的標記;
③new:分配新的堆記憶體空間;
④類名稱():呼叫了名稱和類名稱相同的方法,這就是構造方法。
實際上,構造方法一直在被我們呼叫,但我們並沒有去定義它,為什麼能夠使用呢?這是因為在整個Java開發中,
為了保證程式可以正常執行,即便使用者沒有定義任何構造方法,也會在程式編譯後自動為類增加一個沒有引數,
方法名稱與類名稱相同,沒有返回值的構造方法。
構造方法的定義:方法名稱和類名稱相同,沒有返回值宣告。
1 //無參,無返回值的構造方法
2 public Book() {
3
4 }
如果在Book類中沒有定義以上的構造方法,那麼也會自動生成一個無參,無返回值的構造方法。
我們再看:
1 package com.wz.classandobj;
2
3 class Book{
4
5 //無參,無返回值的構造方法
6 public Book() {
7 System.out.println("無參構造方法");
8 }
9
10 }
11
12 public class TestDemo {
13 public static void main(String args[]) {
14 Book book = null;//宣告物件
15 }
16 }
執行,什麼也沒有列印。
在主方法中加入例項化物件的程式碼:
1 public class TestDemo {
2 public static void main(String args[]) {
3 Book book = null;//宣告物件
4 book = new Book();// 例項化物件
5 }
6 }
執行:
無參構造方法
以上說明,構造方法是在物件使用關鍵字new例項化的時候被呼叫。
構造方法與普通方法最大的區別是:
構造方法在例項化物件(new)的時候只調用一次,而普通方法是在例項化物件之後可以隨意呼叫多次。
在實際開發中,構造方法的作用是在類物件例項化的時候設定屬性的初始化內容,範例如下:
1 package com.wz.classandobj;
2
3 class Book{
4
5 private String title;
6 private double price;
7
8 public Book(String title, double price) {
9 this.title = title;
10 this.price = price;
11 }
12
13 public String getTitle() {
14 return title;
15 }
16
17 public void setTitle(String title) {
18 this.title = title;
19 }
20
21 public double getPrice() {
22 return price;
23 }
24
25
26 public void setPrice(double price) {
27 this.price = price;
28 }
29
30 public void getInfo(){
31 System.out.println("圖書的名稱:"+title+" 圖書的價格:"+price);
32 }
33 }
34
35 public class TestDemo {
36 public static void main(String args[]) {
37 Book book = new Book("Java開發",89.9);//設定屬性的初始化內容
38 book.getInfo();
39
40 }
41 }
執行結果:
圖書的名稱:Java開發 圖書的價格:89.9
如果一個類中已經明確定義了一個構造方法,則無參構造方法將不會自動生成。而且,一個類之中至少存在一個構造方法。另外,既然構造方法也屬於方法,那麼構造方法也可以過載,但是由於構造方法的特殊性,所以在構造方法過載時注意其引數的型別及引數的個數即可。
範例如下:
1 package com.wz.classandobj;
2
3 class Book{
4
5 private String title;
6 private double price;
7
8
9 public Book() {
10 System.out.println("無參的構造方法");
11 }
12
13
14 public Book(String title) {
15 this.title = title;
16 System.out.println("有一個引數的構造方法");
17 }
18
19
20 public Book(String title, double price) {
21 this.title = title;
22 this.price = price;
23 System.out.println("有倆個引數的構造方法");
24 }
25
26 public void getInfo(){
27 System.out.println("圖書的名稱:"+title+" 圖書的價格:"+price);
28 }
29 }
30
31 public class TestDemo {
32 public static void main(String args[]) {
33 Book book1 = new Book();
34 book1.getInfo();
35
36 Book book2 = new Book("Java開發");
37 book2.getInfo();
38
39 Book book3 = new Book("Java開發",89.9);
40 book3.getInfo();
41
42 }
43 }
執行結果:
無參的構造方法
圖書的名稱:null 圖書的價格:0.0
有一個引數的構造方法
圖書的名稱:Java開發 圖書的價格:0.0
有倆個引數的構造方法
圖書的名稱:Java開發 圖書的價格:89.9
在進行構造方法過載時有一個編寫建議:所有過載的構造方法按照引數的個數由多到少,或者是由少到多排列。
我們再來看,如果在類中為屬性直接設定預設值,結果會怎樣?
1 package com.wz.classandobj;
2
3 class Book{
4
5 private String title = "Android開發";
6 private double price = 199.9;
7
8
9 public Book() {
10 System.out.println("無參的構造方法");
11 }
12
13
14 public Book(String title) {
15 this.title = title;
16 System.out.println("有一個引數的構造方法");
17 }
18
19
20 public Book(String title, double price) {
21 this.title = title;
22 this.price = price;
23 System.out.println("有倆個引數的構造方法");
24 }
25
26 public void getInfo(){
27 System.out.println("圖書的名稱:"+title+" 圖書的價格:"+price);
28 }
29 }
30
31 public class TestDemo {
32 public static void main(String args[]) {
33 Book book1 = new Book();
34 book1.getInfo();
35
36 Book book2 = new Book("Java開發");
37 book2.getInfo();
38
39 Book book3 = new Book("Java開發",89.9);
40 book3.getInfo();
41
42 }
43 }
執行結果:無參的構造方法
圖書的名稱:Android開發 圖書的價格:199.9 有一個引數的構造方法 圖書的名稱:Java開發 圖書的價格:199.9 有倆個引數的構造方法 圖書的名稱:Java開發 圖書的價格:89.9
從上面可以發現:如果在類中為屬性直接設定預設值,而且這個默認值是在構造方法執行完後才會設定的,
且屬性內容為對應資料型別的預設值時才設定類中定義的這個預設值。但是,要注意的是在構造方法沒有執行之前,屬性內容都是其對應資料型別的預設值。