iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
自我挑戰組

前端工程師的java學習紀錄系列 第 17

Day17-constructor & this

  • 分享至 

  • xImage
  •  

constructor

constructor是一種Java中的構造器,也是class的其中一個成員,透過new class(); 的格式去進行創建

假設今天有一個class Personclass PersonTest 在同一個package 中(還記得為什麼要在同一個package 中嗎?因為沒有加上publicPerson 前面,他的權限最多僅限於在同一個package 中使用)

程式碼如下:

class Person {

	private String name;
	int age;
	
	public void setName(String n) {
		name = n;
	}
	
	public String getName() {
		return name;
	}

}
public class PersonTest {
	public static void main(String[] args) {
		Person person = new Person();
		person.age = 20;
		person.setName("Jack");
		System.out.println(person.getName()); // Jack
	}
}
  1. 首先宣告了一個Person class ,並且在裡面宣告了private (私有,只能在Person class 中使用)的name 屬性、和一個default (未填寫,可以在相同的package 中使用)的 age 屬性,以及publicsetNamegetName 方法去獲取name 屬性的值。
  2. setName 帶有一個參數 n 並且將n 賦值給name 屬性
  3. getNamePerson class私有 屬性name 返回,以提供給需要name 值的class使用
  4. 接著宣告了一個PersonTest class ,並在裡面宣告了一個main 的入口點,裡面實例化 了一個Person class ,並且透過person.age = 20;,將20賦值給了age,並且透過person.setName("Jack"); 將Jack賦值給name 屬性
  5. 透過person.getName();name 的值提供給System.out.println(); 使用並列印在terminal

由上述可以看到,當實例化一個class 時,如果透過class.xxx = xx; 或者是class.setXXX(); 的方式去賦值並不是每次都那麼必要,這時候可以使用constructor 直接在Person class 中先將初始化的部分寫好。

創造它的方法很簡單,格式:

權限修飾符 類名稱(){}

如下:

class Person {
	String name;
	int age;
	
	Public Person(String n, int a) {
		name = n;
		age = a;
	}
	
	下略
}

透過這樣的方式去定義Person class 時,就可以在實例化 這個class 時,直接將參數 代入後面的()

如下:

public class PersonTest {
	public static void main(String[] args) {
		Person person = new Person("Jack", 20);
		
		System.out.println(person.getName()); // Jack
	}
}

這樣在宣告時可以節省不少時間~~~

前面有提到constructorclass 的一個成員(其二是屬性及方法),當定義class 時沒有特別寫時,其實Java也會自動創建一個沒有任何參數內容constructor

例如這樣:

class Person {
	String name;
	int age;
	
	Person() {
	}
	
	下略
}

並且當沒有寫權限修飾符 時,它會默認和class 的權限相同。


this

this 指的是”這”,在Java中的this 指的是當前物件 屬性方法構造器

前面在定義PersonsetName 方法或者是透過constructor 在替屬性的值初始化時,故意將參數寫成單一個字母na ,這樣的命名方式其實不是那麼恰當,因為一般不管是在class屬性方法變數參數 等命名時,都會盡量以符合 這個方法的用途或者是符合 這個變數是代表什麼去進行命名

錯誤範例:

class Person {
	private String name;
	
	public void setName(String name) {
		name = name;
	}
	
	public String getName() {
		return name;
	}
}

若是今天用這樣的方式去對name 進行賦值時,當使用getName() 去取得name 的值時,永遠只會得到null ,因為setName() 中的name ,所對應的都會是參數中的name 而不是屬性name ,這時候this 就派上用場了。

this的使用方式:

class Person {
	private String name;
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
}

當在setName 中使用this.name 時,這時候它所指的就會是Person class 中的name

this 除了能夠指定物件本身的屬性 外,也可以指定方法構造器

如下:

class Person {
	private String name;
	
	public void eat() {
		System.out.println("吃飽飯好開心");
		this.sleep();
	}
	
	public void sleep() {
		System.out.println("來去睡覺囉");
	}
	
	public String getName() {
		return this.name;
	}
}

但是一般如果沒有遇到和參數 相同的命名時,在class 中調用自己的屬性方法 時,可以省略不寫。

當使用this 是指向構造器 時,使用的方式和屬性方法 不太一樣

如下:

class Person {
	String name;
	int age;
	
	public Person() {
	}
	
	public Person(String name) {
		this();
		this.name = name;
	}
	
	public Person(String name, int age) {
		this(name);
		this.age = age;
	}
}

有沒有發現這個Person構造器 似曾相識的感覺? 沒錯,構造器 也可以使用overload 的方式去定義多個不同的構造器

構造器 中使用this 時,有幾個要求:

  • 必須在構造器 的第一行使用
  • 要避免無限調用自己(例如無法在第一個未寫任何參數構造器 中使用this() )

以上方的例子來看,在構造器 中使用必須使用this(); 的方式去調用,並且當帶有參數 時,它會去調用符合構造器 進而減少程式碼 重複的問題。


上一篇
Day16-封裝
下一篇
Day18-繼承 & override & super
系列文
前端工程師的java學習紀錄37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言