1. 程式人生 > >private實現封裝處理 &構造方法(匿名物件)

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設計原則必須提供一下兩種方法:

  1. setter方法:主要用於進行屬性內容的設定與修改
  2. 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實封裝的最大特徵在於:只允許本類訪問,而不允許外部類訪問。
類的設計原則:

  1. 類中的所有屬性必須使用private封裝。
  2. 屬性若要被外部訪問,必須定義setter、getter方法。

2. 構造方法與匿名物件

上一篇部落格中,我們如何產生物件?

①類名稱 ②物件名稱 =new ④類名稱();

針對以上定義我們做了如下分析:

  1. ① 任何物件都應該有其對應的類,類是產生物件的藍圖。
  2. ② 是一個為一的標記,引用一塊堆記憶體
  3. ③ 表示開闢新的堆記憶體空間
  4. ④ 構造方法
    構造方法就是使用關鍵字new例項化新物件時來進行呼叫的操作方法。

2.1 構造方法(類中屬性進行初始化)

2.1.1 類中的組成

在上一篇部落格中,我們簡單的說了類是由屬性方法 組成的。現在我們再來看看類中的組成:屬性構造方法普通方法

  1. 屬性是在物件開闢堆記憶體是開闢的空間。
  2. 構造方法是在使用new後呼叫的。
  3. 普通方法是在空間開闢了構造方法執行之後可以多次呼叫的。

2.1.2 構造方法的三大特徵

  1. 方法名稱必須和類名稱相同
  2. 構造方法沒有返回值型別宣告
  3. 每一個類中至少存在一個構造方法,如果沒有明確定義,系統將會自動生成無參構造。若在類中定義了構造方法,則系統不會預設生成無參構造。
    問題一:構造方法無返回值,為什麼沒有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();
    }
}

執行結果如下:
在這裡插入圖片描述
建議:若干個構造方法,請按照引數個數升序或降序書寫。

在進行類定義時,順序應為:

  1. 定義屬性
  2. 定義構造方法
  3. 定義普通方法

2.2 匿名物件

匿名物件是沒有名字的實體,就是該實體沒有對應的變數名引用

2.2.1 匿名物件的特徵

  1. 建立匿名類的物件只能夠呼叫一次。
  2. 匿名物件只在堆記憶體中開闢空間,而不存在棧記憶體的引用
  3. 每次建立匿名物件都是不同的物件
    舉例:
public class Test{
    public static void main(String[] args){
        new Person("zhangsan", 18).print_Info();
    }
}

在這裡插入圖片描述
由於匿名物件不會有任何的棧空間所指向,所以使用一次就成為垃圾空間。