天天看點

第7天 構造函數、this關鍵字、靜态修飾符static

1. 複習

對象:真實存在的唯一的事物。

類: 同一種類型的事物公共屬性與公共行為的抽取。

java面向對象語言:

核心思想: 找适合的對象做适合的事情.

找對象的方式:

    方式一: sun已經定義好了很多了類,我們隻需要認識這些類即可建立對象使用。

    方式二: 我們需要自定義類,通過自定義類建立對象。

在整理筆記的過程中對自己有疑問的概念使用代碼驗證或者推翻它。

自定義類三步驟:

    1. 自定義一個類。

         class 類{

           事物 的公共屬性使用成員 變量描述

           事物的公共行為使用函數描述。

         }

    2. 可以通過類建立對象。

    3. 通路(設定)對象的屬性或者調用對象的方法。

成員變量與局部變量 的差別:

    1. 自定義的位置差別:

           1. 成員變量是定義在方法之外,類之内的變量。

           2. 局部變量是聲明在方法之内的變量。

    2. 作用上的差別:

           1. 成員變量的作用描述一類事物的屬性。

           2. 局部變量的作用是提供一個變量給方法内部使用的。

    3. 生命周期的差別;

           1. 成員變量随着對象的建立而存在,随着對象的消失而消失。

           2. 局部變量是調用到了對應的方法執行 到了建立該變量的語句時存在,一旦出了自己的作用域馬上從記憶體中消失。

    4. 初始值的差別:

           1. 成員變量是有預設的初始值的。

           2. 局部變量是沒有預設的初始值的,必須要先初始化才能使用。

匿名對象: 沒有引用類型變量指向的對象就稱作為匿名對象。

匿名對象要注意的細節:

       1. 一般不會給匿名對象的屬性指派,因為永遠都沒法擷取到。

       2. 兩個匿名對象永遠都不可能是同一個對象。

匿名對象好處:簡化書寫。

匿名對象的應用場景:

    1. 如果調用一個對象的方法一次時,然後這個對象就不再使用,那麼這時候可以使用匿名對象。

    2. 可以作為實參調用一個函數。

封裝:

封裝的步驟:

    1. 使用private修飾需要被封裝的屬性.

    2. 根據需要提供get或者set方法設定以及擷取屬性。

封裝的好處:

    1. 提高了資料的安全性。

    2. 操作簡單。

    3. 隐藏了實作。

注意:一般實體類的屬性我們都會封裝起來。 

2.構造函數

1)構造函數的作用

給對應的對象進行初始化

2)構造函數定義的格式

修飾符 函數名(形式參數){

函數體...

}

3)構造函數要注意的細節

ü  構造函數 是沒有傳回值類型的。

ü  構造函數的函數名必須要與類名一緻。

ü  構造函數并不是由我們手動調用的,而是在建立對應的對象時,jvm就會主動調用到對應的構造函數。

ü  如果一個類沒有顯式的寫上一個構造方法時,那麼java編譯器會為該類添加一個無參的構造函數的。

ü  如果一個類已經顯式的寫上一個構造方法時,那麼java編譯器則 不會再為該類添加 一個無參 的構造方法。

ü  構造函數是 可以在一個類中以函數重載 的形式存在多個 的。

4)`構造函數代碼示例

<span style="font-family:Microsoft YaHei;font-size:14px;">class Baby{
    int id; //身份證
    String  name;  //名字
    //構造函數
    public  Baby(int i ,String n){
       id  = i;
       name = n;
       System.out.println("baby的屬性初始化完畢!!");
    }
    //無參 的構造函數
    public Baby(){
       System.out.println("無參的構造函數被調用了..");
    }
    //哭
    public void cry(){
       System.out.println(name+"哇哇哭...");
    }  
}
class Demo2
{
    public static void main(String[] args)
    {  
       //建立一個baby對象
       Baby b1 = newBaby(110,"狗娃"); //嬰兒誕生   白戶
       System.out.println("編号:"+ b1.id +" 姓名:"+ b1.name);
       b1.cry();
       b1.cry();
    }
}</span>
           

5)構造函數的疑問

建立對象時,jvm就會調用到對應的構造方法,那麼我們以前沒有學構造方法,那麼

以前建立對象時,jvm是否 也會調用構造方法呢?如果有?構造方法從何而來呢?

會調用, java編譯器在編譯的 時候給加上去的。

jdk提供了一個java開發工具(javap.exe)給我們進行反編譯的。

javap 反編譯工具的使用格式:javap -c -l -private 類名

6)構造函數與普通函數的差別

1. 傳回值類型的差別:

ü  構造函數是沒有傳回值類型 的,

ü  普通函數是有傳回值類型的,即使函數沒有傳回值,傳回值類型也要寫上void。

2. 函數名的差別:

ü  構造函數的函數名必須要與類名一緻,

ü  普通函數的函數名隻要符合辨別符的命名規則即可。

3. 調用方式的差別:

ü  構造函數是 在建立對象的時候由jvm調用的。

ü  普通函數是由我們使用對象調用的,一個對象可以對象多次普通 的函數

4. 作用上的差別:

ü  構造函數 的作用用于初始化一個對象。

ü  普通函數是用于描述一類事物的公共行為的。

3.構造代碼塊(1)

1)構造代碼塊的作用:給對象進行統一的初始化。

2)構造函數的作用: 給對應的對象進行初始化。

3)構造代碼塊的格式

    {

        構造代碼塊

    }

注意: 構造代碼塊的大括号必須位于成員位置上。

4)構造代碼塊的類别:

    1. 構造代碼塊。

    2. 局部代碼塊.  大括号位于方法之内。 作用:縮短局部 變量 的生命周期,節省一點點記憶體。

    3. 靜态代碼塊 static

{

       //System.out.println("構造代碼塊的代碼執行了......");  

}

4.構造代碼塊(2)

構造 代碼塊要注意的事項:

    1. java編譯器編譯一個java源檔案的時候,會把成員變量的聲明語句提前至一個類的最前端。

    2. 成員變量的初始化工作其實都在在構造函數中執行的。

    3. 一旦經過java編譯器編譯後,那麼構造代碼塊的代碼塊就會被移動構造函數中執行,是在構造函數之前執行的,構造函數的中代碼是最後執行的。

    4. 成員變量的顯示初始化與構造代碼塊 的代碼是按照目前代碼的順序執行的。

<span style="font-family:Microsoft YaHei;font-size:14px;">class Demo5
{
    //構造函數
    public Demo5(){   //構造函數
       i = 300000000;   
    }
    //構造代碼塊   //構造代碼塊的初始化
    {
       i = 200000000;
    }
    int i = 100000000;   //成員變量的顯初始化
    public static void main(String[] args)
    {
       Demo5 d = new Demo5();
       System.out.println("i = "+d.i); //    雙、吳、劉 :2000   :
    }
}</span>
           

5.this關鍵字

1)this關鍵字

this關鍵字代表是對象的引用。也就是this在指向一個對象,所指向的對象就是調用該函數的對象引用。

2)this關鍵字的作用

ü  如果存在同名成員變量與局部變量時,在方法内部預設是通路局部變量的資料,可以通過this關鍵字指定通路成員變量的資料。

ü  在一個構造函數中可以調用另外一個構造函數初始化對象。

3)this關鍵字調用其他的構造函數要注意的事項

ü  this關鍵字調用其他的構造函數時,this關鍵字必須要位于構造函數中的第一個語句。

ü  this關鍵字在構造函數中不能出現互相調用 的情況,因為是一個死循環。

4)this關鍵字要注意的事項

ü  存在同名的成員變量與局部變量時,在方法的内部通路的是局部變量(java 采取的是“就近原則”的機制通路的。)

ü  如果在一個方法中通路了一個變量,該變量隻存在成員變量的情況下,那麼java編譯器會在該變量的 前面添加this關鍵字。

5)this關鍵字代碼執行個體

<span style="font-family:Microsoft YaHei;font-size:14px;">class Animal{
    String name ;  //成員變量
    String color;
    public Animal(String n , String c){
       name = n;
       color = c;
    }
    //this關鍵字代表了所屬函數的調用者對象
    public void eat(){
       //System.out.println("this:"+ this);
       String name = "老鼠"; //局部變量
       System.out.println(name+"在吃..."); //需求: 就要目前的name是成員變量的name.
      
    }
}
class Demo6
{
    public static void main(String[] args)
    {
       Animal dog = new Animal("狗","白色");  //現在在記憶體中存在兩份name資料。
       Animal cat = new Animal("貓","黑色");
       cat.eat();
    }
}</span>
           

6.this關鍵字調用本類的構造方法

<span style="font-family:Microsoft YaHei;font-size:14px;">classStudent{
    int id; //身份證
    String name; //名字
    //目前情況:存在同名 的成員 變量與局部變量,在方法内部預設是使用局部變量的。
    public Student(int id,String name){  //一個函數的形式參數也是屬于局部變量。
       this(name); //調用了本類的一個參數的構造方法
       //this(); //調用了本類無參的 構造方法。
       this.id = id; // this.id = id 局部變量的id給成員變量的id指派
       System.out.println("兩個參數的構造方法被調用了...");
    }
    public Student(){
       System.out.println("無參的構造方法被調用了...");
    }
    public Student(String name){
       this.name = name;
       System.out.println("一個參數的構造方法被調用了...");
    }
}
classDemo7
{
    public static void main(String[] args)
    {
       Student s = new Student(110,"鐵蛋");
       System.out.println("編号:"+ s.id+" 名字:" + s.name);
/*
       Student s2 = new Student("金胖子");
       System.out.println("名字:" + s2.name);
    */
    }
}</span>
           

總結:實際工作中,存在着構造函數之間的互相調用,但是構造函數不是普通的成員函數,不能通過函數名自己接調用

是以sun公司提供this關鍵字。

this是什麼

1:在構造函數中列印this

2:建立對象,列印對象名p

3:this和p是一樣的都是記憶體位址值。

4:this代表所在函數所屬對象的引用。

7.this關鍵字的練習

需求: 使用java定義一個人類,人具備 id、name 、 age三個屬性,還具備一個比較年齡的方法。

要求: 必須 要 寫上構造函數,構造函數也必須要使用上this關鍵字。

<span style="font-family:Microsoft YaHei;font-size:14px;">class Person{
    int id; //編号
    String name; //姓名
    int age;  //年齡
    //構造函數
    public Person(int id,String name ,int age){
       this.id  = id;
       this.name = name;
       this.age = age;
    }
    //比較年齡的方法
    public void compareAge(Person p2){
       if(this.age>p2.age){
           System.out.println(this.name+"大!");
       }else if(this.age<p2.age){
           System.out.println(p2.name+"大!");
       }else{
           System.out.println("同齡");
       }
    }
}
class Demo8{
    public static void main(String[] args)
    {
       Person p1 = new Person(110,"狗娃",17);
       Person p2 = new Person(119,"鐵蛋",9);
       p1.compareAge(p1);
    }
}</span>
           

8.static修飾成員變量

static(靜态\修飾符)

    1. static修飾成員變量 :如果有資料需要被共享給所有對象使用時,那麼就可以使用static修飾。

       靜态成員變量的通路方式:

              方式1: 可以使用對象進行通路。

                  格式: 對象.變量名。

              方式二: 可以使用類名進行通路。

                  格式: 類名.變量名;

           注意:

              1. 非靜态的成員變量隻能使用對象進行通路,不能使用類名進行通路。

              2. 千萬不要為了友善通路資料而使用static修飾成員變量,隻有成員變量的資料是真正需要被共享的時候

              才使用static修飾。

       static修飾成員變量的應用場景: 如果一個資料需要被所有對象共享使用的時候,這時候即可好實用static修飾。

    2. static修飾成員函數:

<span style="font-family:Microsoft YaHei;font-size:14px;">classStudent2{
    static Stringname;  //非靜态成員變量
    static String  country = "中國";    //靜态的成員變量
    public Student2(String name){
       this.name = name;
    }
}
classDemo10 {
    public static void main(String[] args)
    {
       Student2 s1 = new Student2("狗娃");
       Student2 s2 = new Student2("狗剩");
       //System.out.println("國籍:"+Student.country);
       System.out.println("名字:"+ s1.name);
       System.out.println("名字:"+ s2.name);
    }
}</span>
           

9.static修飾成員變量的應用場景

需求: 統計一個類被使用了多少次建立對象,該類對外顯示被建立的次數。

<span style="font-family:Microsoft YaHei;font-size:14px;">class Emp{
    //非靜态的成員變量。
    static int count = 0;    //計數器
    String name;
    //構造代碼塊
    {
       count++;
    }
    public Emp(String name){
       this.name = name;
 
    }
    public Emp(){  //每建立一個對象的時候都會執行這裡 的代碼
    }
    public void showCount(){
       System.out.println("建立了"+ count+"個對象");
    }
}
class Demo11
{
    public static void main(String[] args)
    {
       Emp e1 = new Emp();
       Emp e2 = new Emp();
       Emp e3 =new Emp();
       e3.showCount();
    }
}</span>
           

繼續閱讀