天天看點

Java基礎十一(private、this關鍵字和構造函數)

私有private關鍵字

成員變量是否一定需要全部向外界通路? 如果需要向外界通路 則public,如不需要向外界通路 則private,但是一般而言 都會将成員變量私有化,給成員變量+private是徹底不想給外界類中不需要對外提供的内容都私有化,包括屬性和行為。

注意:私有僅僅是封裝的展現形式而已

通路器

給成員變量加了private關鍵字外界就不能通路和更改,但是對于一些特殊情況我們又需要讓外界通路更改,按照之前所學習的封裝的原理,隐藏後,還需要提供通路方式。隻要對外提供可以通路的方法,讓其他程式通路這些方法。同時在方法中可以對資料進行驗證。

一般對成員屬性的通路動作:指派(設定 set),取值(擷取 get),是以對私有的變量通路的方式可以提供對應的 setXxx或者getXxx的方法。

成員變量初始化

對象在堆中建立 其成員變量有預設初始化

預設初始化–顯式初始化–針對性初始化

構造函數

當我們需要在建立對象的同時賦給對象的屬性值時,就需要面向對象中比較重要的一個方法——構造函數,構造函數就是為對象創造時用的函數,即就是對象建立時要執行的函數。是以在new對象時,知道其執行的構造函數是什麼,就可以在執行這個函數的時候給對象進行屬性指派。

構造函數的三個特殊性 :

  • 構造函數必須具備和所在類相同的名字 。
  • 構造函數沒有傳回值類型 , 甚至連 void 也沒有 。
  • 構造函數是在建立一個對象使用new 操作符時調用的 。 構造函數的作用是初始化對象 。
  • 和所有其他方法一樣 , 構造方法也可以重載 ( 也就是說 , 可以有多個同名的構造方法 , 但它們要有不同的簽名 ) , 這樣更易于用不同的初始資料值來構造對象 。

注意:構造方法在使用new 操作符建立對象的時候被調用 。

構造函數的格式

修飾符 構造函數名(參數清單){

}

如果一個類裡面沒有定義任何構造函數則會有一個隐藏的無參構造函數

權限修飾符 類名(參數清單){
    
    return;
}
           

如果一旦定義出其他的構造函數 則預設的無參構造函數不存在了!是以建議一般把無參構造函數都寫出來

寫一個構造函數例子:

class  Dog
{
    //Dog的成員屬性age和name
    private String name;
    private int age;
    //Dog的構造函數,擁有參數清單
    public Dog(int a , String nm)
    {
        //接受到建立對象時傳遞進來的值,将值賦給成員屬性
        age = a;
        name = nm;
    }
    Dog的成員函數speak
    public void speak()
    {
        System.out.println("name="+name+",age="+age);
    }
}
           

寫一次測試類

class DogTest
{
    public static void main(String[] args)
    {
        //建立Dog對象,并明确對象的年齡和姓名
        Dog wangcai= new Dog(3,"旺财");
        wangcai.speak();
    }
}
           

構造函調用記憶體圖解

上述代碼的記憶體圖解:

Java基礎十一(private、this關鍵字和構造函數)

1、主函數進棧

2、先執行第一句的右半部分 new Dog(3,“旺财”);

3、在堆記憶體中随機給Dog配置設定一片區域,區域位址位0X666,并給成員變量預設初始化。

4、構造函數進棧執行構造函數,就會把 3,“旺财” 賦給成員變量age和name,執行結束,構造函數彈棧。

5、Dog對象建立完成,把0X666賦給wangcai。

this關鍵字

關鍵字 this 引用對象自身 。 它也可以在構造方法内部用于調用同一個類的其他構造方法 。

  • 構造函數之間的調用可以通過this關鍵字來完成
  • this 關鍵字可以用于引用類的隐藏數據域 。
  • 關鍵字 this 可以用于調用同一個類的另一個構造方法 。

例如上面Dog的構造函數我們就可以寫為:

public Dog(int age , String name)
    {
        this.age = age;
        this.name = name;
    }
public Dog()
    {
      this(3,"旺财");
    }
           

第一個構造函數中的兩個this用于引用所建構的對象的隐藏資料域 age和name,在第二個構造方法中,this(3,“旺财”) 這一行調用第一個構造方法 。

當在函數中出現了局部變量和成員變量同名的時候,我們也可以在成員變量名前面加上this來差別方法中成員變量和局部變量

構造函數和成員函數的差別

1、外界調用角度

  • 構造函數隻能在建立對象時調用,對象建立完畢之後不能已建立的對象調用
  • 成員函數隻能在對象建立之後調用,可以重複的

2、傳回值角度

  • 構造函數不需要傳回值
  • 成員函數可需可不需

3、權限修飾符

  • 構造函數可以用任意權限修飾符
  • 成員函數也可以用任意權限修飾符

4、内部調用

  • 構造函數可以調用成員函數 ,但是這個成員函數一般不會當做對象行為去看待
  • 構造函數可以調用構造函數,this(參數清單) 調用目前類中的其他構造函
  • 構造函數之間不能互相調用,會無限遞歸而且this(…)必須在第一句!防止值的覆寫
  • 成員函數可以調用成員函數
  • 成員函數不能調用構造函數,但是可以new

    (構造函數可以和成員函數重名!)