Java——this關鍵字(調用本類屬性、調用本類方法、表示當前對象)

目錄

1、調用本類屬性

2、調用本類方法

3、表示當前對象


this是一個非常靈活的關鍵字,不會明確表示一個固定概念,比如int,它就是表示一個整型。

1、調用本類屬性

類中有許多成員,大部分情況下類中直接進行成員調用,但是爲了清楚的描述調用是本類屬性,會用this.屬性表示。

    class Person{
        String name;
        int age;
        public Person(){}
        public Person(String name, int age) {
            name = name;
            age = age;
        }
    }

如上定義的類,構造方法按上述寫法,對象中不會保存我們定義的內容,而是默認值,因爲程序以{}爲界定範圍,如果在此範圍內有指定的變量名稱,則會直接調用,若沒有,則會調用類中的相應屬性。

當參數與屬性名稱相同時,則會出現混淆,則需要用戶自己手動明確調用的是屬性還是方法中的參數,若是屬性,則需要加this.屬性,標準程序開發中都會以此方式進行:

    class Person{
        String name;
        int age;
        public Person(){}
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }

2、調用本類方法

一個類中存在普通方法和構造方法,this調用本類方法時,對應的語法不同:

1)調用本類中的其他方法:this.方法()

一個類中可能存在很多方法,這些方法之間可以直接進行調用,但是不夠標準,應用this.方法()調用,標準化風格。

2)調用本類其他構造方法:this()

一個類中可以有多個方法,且可以重載,並且構造方法在實例化對象時只能被調用一次。

若現在需求:Person類中中有三個構造方法,無論調用哪個構造方法,都要求執行語句"**********"。

【舉例】:原始實現方式

    class Person{
        String name;
        int age;
        public Person(){
            System.out.println("********");
        }
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
            System.out.println("********");
        }
    }

程序設計的一個重要原則,避免重複代碼。按照這個原則,以上的代碼並不符合開發要求,這時可以使用this()形式實現,調用本類無參構造。

class Person{
        String name;
        int age;
        public Person(){
            System.out.println("********");
        }
        public Person(String name) {
            this();
            this.name = name;
        }
        public Person(String name, int age) {
            this(name);
            this.name = name;
            this.age = age;
        }
    }

需要注意的是,this()形式只能放在構造方法的首行。在使用this()調用本類其他構造方法時,應該避免循環調用。

下面通過實例說明構造方法互調的意義所在。

【舉例】:寫一個僱員的信息類,類中提供如下四個屬性:姓名、職位、部門、工資,還有4個構造方法:

  • 無參構造:姓名未知、職位待定、部門後勤、工資爲0;
  • 單參構造(姓名):職位主管、部門技術部、工資10;
  • 雙參構造(姓名、部門):職位工程師、工資5;
  • 四參構造。

針對以上要求可以有兩種代碼實現方法:

第一種:傳統實現

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Emp emp = new Emp();
        System.out.println(emp.getInfo());

    }


    class Emp{
        private String name;
        private String job;
        private String dept;
        private double sal;

        public Emp(){
            this.name ="未知";
            this.job = "待定";
            this.dept = "後勤";
            this.sal = 0.0;
        }
        public Emp(String name){
            this.name =name;
            this.job = "主管";
            this.dept = "技術部";
            this.sal = 10.0;
        }
        public Emp(String name,String dept){
            this.name =name;
            this.job = "工程師";
            this.dept = dept;
            this.sal = 5.0;
        }

        public Emp(String name,String job, String dept, double sal){
            this.name =name;
            this.job =job;
            this.dept = dept;
            this.sal = sal;


        }
        public String getInfo(){
            return "姓名:"+this.name+"職位:"+this.job+"部門:"+this.dept+"工資:"+this.sal;
        }
    }

以上程序重複的代碼太多,過於冗餘。

第二種:使用this改進

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Emp emp = new Emp();
        System.out.println(emp.getInfo());

    }


    class Emp{
        private String name;
        private String job;
        private String dept;
        private double sal;

        public Emp(){
            this("未知","待定","後勤",0.0);
        }
        public Emp(String name){
            this(name,"主管","技術部",10.0);
        }
        public Emp(String name,String dept){
            this(name,"工程師",dept,5.0);
        }

        public Emp(String name,String job, String dept, double sal){
            this.name =name;
            this.job =job;
            this.dept = dept;
            this.sal = sal;
        }
        public String getInfo(){
            return "姓名:"+this.name+"職位:"+this.job+"部門:"+this.dept+"工資:"+this.sal;
        }
    }

以上代碼消除了很多重複代碼,實際開發中應用較多。

3、表示當前對象

一個類,可以生成若干個對象,每個對象都可調用類中的方法,類中實際上很難描述某一個具體的對象,爲了能區分出當前正在操作類中的方法是哪一個,可以使用this完成。

【舉例】:觀察

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Person perA = new Person();
        Person perB = new Person();

        System.out.println("MainActivity類中對象輸出:"+perA);
        System.out.println("MainActivity類中對象輸出:"+perB);

    }

    class Person{
    }

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Person perA = new Person();
        Person perB = new Person();

        System.out.println("MainActivity類中對象輸出:"+perA);
        perA.print();
        System.out.println("--------------------------------");
        System.out.println("MainActivity類中對象輸出:"+perB);
        perB.print();

    }

    class Person{

        void print(){
            System.out.println("Person類中的輸出,this="+this);
        }
    }

由以上可知,由perA調用print()方法時,this=perA,由perB調用print()方法時,this=perB, 所以,this的對象引用會隨着調用類方法對象的不同而不同,屬於相對性的概念。

進一步考慮,this.屬性表示的就是當前對象中的屬性。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章