天天看點

揭開this的神秘面紗-方法篇 | 帶你學《Java面向對象程式設計》之八

上一篇:揭開this的神秘面紗-屬性篇 | 帶你學《Java面向對象程式設計》之七

【本節目标】

通過閱讀本節内容,你将了解到借助this實作構造方法的進階重寫方式,學會使用this通路類内各類方法,養成編寫可重用性高的代碼的良好習慣。

使用this調用方法

除了調用屬性之外,this也可以實作方法的調用,但是對于方法的調用就必須考慮構造與普通方法:

  • 構造方法的調用(this()):使用關鍵字new執行個體化對象的時候才會調用構造方法;
  • 普通方法調用:(this.方法名稱()):執行個體化對象産生之後就可以調用普通方法。

範例:調用類中的普通方法

class Person{
   private String name ;
   private int age ;
   public Person(String name ,int age){
      this.setName(name) ;
      this.setAge(age) ;              //加與不加this都表示本類方法
   }
   public void tell(){
       System.out.println(“姓名:”+ this.name + “、年齡:”+ this.age );
   }
   public void setName(String name){
       this.name = name ;
   }
   public void setAge(int age){
       this.age = age;
   }
   public String getName(){
       return this.name ;
   }
   public int getAge(){
       return this.age ;
   }
}  
public class JavaDemo {          //主類
    public static void main(String args[]) {
      Person per = new person(“王五” ,38) ;
      per.tell() ;
    }
}           
揭開this的神秘面紗-方法篇 | 帶你學《Java面向對象程式設計》之八

圖一 執行結果一

除了普通的方法調用之外呢,還需要進行構造方法的調用,對于構造方法的調用,肯定是要放在構造方法中執行。假設類中一共定義有三個構造方法,但是要求不管調用哪個構造方法,都執行一行輸出語句“一個新的person類對象執行個體化了”。

傳統做法實作:

class Person{
   private String name ;
   private int age ;
   public Person(){
       System.out.println(“***一個新的person類對象執行個體化了。”) ;
   } 
   public Person(String name){
       System.out.println(“***一個新的person類對象執行個體化了。”) ;
       this.name = name ;
   }

   public Person(String name ,int age){
      System.out.println(“***一個新的person類對象執行個體化了。”) ;
      this.name = name ;
      this.age = age ;              
  }
  public void tell(){
      System.out.println(“姓名:”+ this.name + “、年齡:”+ this.age );
  }
//setter、getter略
}  
public class JavaDemo {          //主類
    public static void main(String args[]) {
      Person per = new person(“王五” ,38) ;
      per.tell() ;
    }
}           
揭開this的神秘面紗-方法篇 | 帶你學《Java面向對象程式設計》之八

圖二 執行結果二

若改為單參,Person per = new person(“王五” ) ;

揭開this的神秘面紗-方法篇 | 帶你學《Java面向對象程式設計》之八

圖三 執行結果三

如果要想評價一個代碼的好壞:

  1. 代碼結構可以重用,提供的是一個中間獨立的支援;
  2. 我們的目标是:沒有重複。

利用this()構造調用優化:

class Person{
   private String name ;
   private int age ;
   public Person(){
       System.out.println(“***一個新的person類對象執行個體化了。”) ;
} 
   public Person(String name){
       this() ;                //調用本類無參構造
       this.name = name ;
}

   public Person(String name ,int age){
      this(name) ;           //調用單參構造
    this.age = age ;              
}
  public void tell(){
    System.out.println(“姓名:”+ this.name + “、年齡:”+ this.age );
}
//setter、getter略
}  
public class JavaDemo {          //主類
    public static void main(String args[]) {
      Person per = new person(“王五” ,38) ;
      per.tell() ;
}
}           
揭開this的神秘面紗-方法篇 | 帶你學《Java面向對象程式設計》之八

圖四 執行結果四

若調用多參構造,Person per = new person(“王五” , 10) ;

揭開this的神秘面紗-方法篇 | 帶你學《Java面向對象程式設計》之八

圖五 執行結果五

對于本類代碼的互相調用需要注意以下幾點重要問題:

構造方法必須在執行個體化新對象的時候調用,是以“this()”的語句隻允許放在構造方法的首行

public Person(String name){
       this.name = name ;
         this() ;                //調用本類無參構造
}           
揭開this的神秘面紗-方法篇 | 帶你學《Java面向對象程式設計》之八

圖六 執行結果六

public void tell(){
    this() ;                //調用本類無參構造
    System.out.println(“姓名:”+ this.name + “、年齡:”+ this.age );
}           
揭開this的神秘面紗-方法篇 | 帶你學《Java面向對象程式設計》之八

圖七 執行結果七

構造方法互相調用時請保留有程式的出口,别形成死循環。

public Person(){
       this.(“HAHA” , 11) ;
       System.out.println(“***一個新的person類對象執行個體化了。”) ;
} 
   public Person(String name){
       this() ;                //調用本類無參構造
       this.name = name ;
}

   public Person(String name ,int age){
      this(name) ;           //調用單參構造
    this.age = age ;              
}           

此時的程式在進行編譯的時候将會直接出現錯誤提示:告訴使用者,出現了構造方法的遞歸調用。

構造方法互相調用案例:

現在要求定義一個描述有員工資訊的程式類,該類中提供有:編号、姓名、部門、工資,這個類中提供有四個構造方法:

【無參構造】編号定義為1000,姓名定義為無名氏;

【單參構造】傳遞編号,姓名定義為“新員工”,部門定義為“未定”,工資為0.0;

【三參構造】傳遞編号、姓名、部門,工資為2500.00;

【四參構造】所有的屬性全部進行傳遞。

範例:進行代碼的初期實作

class Emp{
    private long empno ;          //員工編号
    private String ename ;         //員工姓名
    private String dept ;           //部門名稱
    private double salary ;         //基本工資
    public Emp(){
        this.empno = 1000 ;
        this.ename = “無名氏” ;
    }
    public Emp(long empno) {
        this.empno = empno ;
        this.ename = “新員工” ;
        this.dept = “未定” ;
    }
    public Emp(long empno ,String ename , String dept) {
        this.empno = empno ;
        this.ename = ename ;
        this.dept = dept ;
        this.salary = 2500.00 ;
    }
    public Emp(long empno ,String ename , String dept ,double salary) {
        this.empno = empno ;
        this.ename = ename ;
        this.dept = dept ;
        this.salary = salary ;
    }
//setter、getter略
    public String getInfo(){
        return  “雇員編号:” + this.empno +
           “、雇員姓名:” + this.ename +
           “、所在部門:” + this.dept +
           “、基本工資:” +this.salary ;
    }
} 
 public class JavaDemo {          //主類
    public static void main(String args[]) {
Emp emp = new Emp(7369L,”史密斯”, “财務部” ,6500.00) ;
     System.out.println(emp.getInfo()) ;
    }
}           
揭開this的神秘面紗-方法篇 | 帶你學《Java面向對象程式設計》之八

圖八 執行結果八

此時可以發現代碼有重複,是以就可以對Emp類進行簡化定義:

class Emp{
    private long empno ;          //員工編号
    private String ename ;         //員工姓名
    private String dept ;           //部門名稱
    private double salary ;         //基本工資
    public Emp(){
        this(1000 , “無名氏” ,null ,0.0) ;
    }
    public Emp(long empno) {
        this(empno, “新員工” ,”未定”,0.0) ;
    }
    public Emp(long empno ,String ename , String dept) {
        this(empno, ename,dept ,2500.00) ;
    }
    public Emp(long empno ,String ename , String dept ,double salary) {
       this.empno = empno ;
       this.ename = ename ;
       this.dept = dept ;
       this.salary = salary ;
    }
//setter、getter略
    public String getInfo(){
         return  “雇員編号:” + this.empno +
           “、雇員姓名:” + this.ename +
           “、所在部門:” + this.dept +
           “、基本工資:” +this.salary ;
    }
} 
 public class JavaDemo {          //主類
    public static void main(String args[]) {
Emp emp = new Emp(7369L,”史密斯”, “财務部” ) ;
     System.out.println(emp.getInfo()) ;
   }
}           

通過上述改造,我們輸出三參定義:

揭開this的神秘面紗-方法篇 | 帶你學《Java面向對象程式設計》之八

圖九 執行結果九

代碼的任何位置上都可能重複,是以消除重複的代碼是先期學習之中最需要考慮的部分。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:一則案例帶你通曉簡單Java類 | 帶你學《Java面向對象程式設計》之九 更多Java面向對象程式設計文章檢視此處