private實現封裝處理 &構造方法(匿名物件)
文章目錄
1. private實現封裝處理
封裝是面向物件李最複雜的概念沒使用private關鍵字實現的封裝處理只是封裝的第一步,若想完全掌握封裝,需要後續將繼承和多型學習結束。
舉例:無封裝程式
class Person{
String name;
int age;
public void getPerson(){
System.out.println("姓名:" + name + " 年齡:" + age);
}
}
public class Test{
public static void main(String[] args){
Person per = new Person();
per.name = "zhangsan";
per.age = 10;
per. getPerson();
}
}
此時,要想回避此類問題,讓內部操對外部不可見(物件不能直接操作屬性),可使用private進行封裝。
舉例:使用private封裝屬性
private String name;
private int age;
將屬性、方法用private封裝後表示:被封裝屬性及方法只能在本類中使用類外都不可見。
用於private對屬性進行了封裝,要訪問私有屬性,按照Java設計原則必須提供一下兩種方法:
- setter方法:主要用於進行屬性內容的設定與修改
- getter方法:主要用於屬性內容的取得
舉例:擴充套件Person類的內容
class Person{
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
if(age > 0 && age < 150)
{
this.age = age;
}
else
{
this.age = 0;
}
}
public int getAge() {
return age;
}
public void getPerson(){
System.out.println("姓名:" + name + " 年齡:" + age);
}
}
public class Test {
public static void main(String[] args) {
Person per = new Person();
per.setName("zhangsan");
per.setAge(-10);
per.getPerson();
}
}
通過除錯我們可以發現,當我們使用setAge()函式對age屬性進行設定時,我們雖然傳參為-10,但根據條件設定了一個基本值0。
通過以上程式碼我們可以發現,private實封裝的最大特徵在於:只允許本類訪問,而不允許外部類訪問。
類的設計原則:
- 類中的所有屬性必須使用private封裝。
- 屬性若要被外部訪問,必須定義setter、getter方法。
2. 構造方法與匿名物件
上一篇部落格中,我們如何產生物件?
①類名稱 ②物件名稱 = ③new ④類名稱();
針對以上定義我們做了如下分析:
- ① 任何物件都應該有其對應的類,類是產生物件的藍圖。
- ② 是一個為一的標記,引用一塊堆記憶體
- ③ 表示開闢新的堆記憶體空間
- ④ 構造方法
構造方法就是使用關鍵字new例項化新物件時來進行呼叫的操作方法。
2.1 構造方法(類中屬性進行初始化)
2.1.1 類中的組成
在上一篇部落格中,我們簡單的說了類是由屬性 和 方法 組成的。現在我們再來看看類中的組成:屬性 、構造方法 、普通方法。
- 屬性是在物件開闢堆記憶體是開闢的空間。
- 構造方法是在使用new後呼叫的。
- 普通方法是在空間開闢了構造方法執行之後可以多次呼叫的。
2.1.2 構造方法的三大特徵
- 方法名稱必須和類名稱相同
- 構造方法沒有返回值型別宣告
- 每一個類中至少存在一個構造方法,如果沒有明確定義,系統將會自動生成無參構造。若在類中定義了構造方法,則系統不會預設生成無參構造。
問題一:構造方法無返回值,為什麼沒有void宣告?
public void Person(){} // 命名不標準的普通方法(方法的命名規範:小駝峰)
public Person(){} // 無參構造方法
結合1&2來看,編譯器是根據程式結構來區分普通方法和構造方法的,所以構造方法前沒有返回值型別說明。
若類中定義了構造方法,則預設的無參構造將不再生成。
在自定義了一個帶有兩個引數的構造方法時,如果我想要呼叫無參構造來例項化物件,就會報上面的錯誤,那應該怎麼樣既可以用同一類名呼叫帶有兩個引數的構造方法,也可以呼叫無參構造。
對於上述情況就有了構造方法過載的定義。
2.1.3 構造方法的過載
引數型別或個數不同
舉例:
class Person{
private String name;
private int age;
public Person(){
System.out.println("0.這是無參構造");
}
public Person(String name){
System.out.println("1.這是帶有一個引數的構造方法");
this.name = name;
}
public Person(String name, int age){
System.out.println("2.這是帶有兩個引數的構造方法");
this.name = name;
this.age = age;
}
public void print_Info()
{
System.out.println(this.name + " " + this.age);
}
}
public class Test{
public static void main(String[] args){
Person per1 = new Person("zhangsan", 18);
Person per2 = new Person("lisi");
Person per3 = new Person();
}
}
執行結果如下:
建議:若干個構造方法,請按照引數個數升序或降序書寫。
在進行類定義時,順序應為:
- 定義屬性
- 定義構造方法
- 定義普通方法
2.2 匿名物件
匿名物件是沒有名字的實體,就是該實體沒有對應的變數名引用
2.2.1 匿名物件的特徵
- 建立匿名類的物件只能夠呼叫一次。
- 匿名物件只在堆記憶體中開闢空間,而不存在棧記憶體的引用
- 每次建立匿名物件都是不同的物件
舉例:
public class Test{
public static void main(String[] args){
new Person("zhangsan", 18).print_Info();
}
}
由於匿名物件不會有任何的棧空間所指向,所以使用一次就成為垃圾空間。