【本節目标】
通過閱讀本節内容,你将了解到借助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() ;
}
}

圖一 執行結果一
除了普通的方法調用之外呢,還需要進行構造方法的調用,對于構造方法的調用,肯定是要放在構造方法中執行。假設類中一共定義有三個構造方法,但是要求不管調用哪個構造方法,都執行一行輸出語句“一個新的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() ;
}
}
圖二 執行結果二
若改為單參,Person per = new person(“王五” ) ;
圖三 執行結果三
如果要想評價一個代碼的好壞:
- 代碼結構可以重用,提供的是一個中間獨立的支援;
- 我們的目标是:沒有重複。
利用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() ;
}
}
圖四 執行結果四
若調用多參構造,Person per = new person(“王五” , 10) ;
圖五 執行結果五
對于本類代碼的互相調用需要注意以下幾點重要問題:
構造方法必須在執行個體化新對象的時候調用,是以“this()”的語句隻允許放在構造方法的首行
public Person(String name){
this.name = name ;
this() ; //調用本類無參構造
}
圖六 執行結果六
public void tell(){
this() ; //調用本類無參構造
System.out.println(“姓名:”+ this.name + “、年齡:”+ this.age );
}
圖七 執行結果七
構造方法互相調用時請保留有程式的出口,别形成死循環。
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()) ;
}
}
圖八 執行結果八
此時可以發現代碼有重複,是以就可以對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()) ;
}
}
通過上述改造,我們輸出三參定義:
圖九 執行結果九
代碼的任何位置上都可能重複,是以消除重複的代碼是先期學習之中最需要考慮的部分。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:一則案例帶你通曉簡單Java類 | 帶你學《Java面向對象程式設計》之九 更多Java面向對象程式設計文章檢視此處