1. 程式人生 > >Java中this關鍵字和static關鍵字

Java中this關鍵字和static關鍵字

1 this關鍵字

this關鍵字主要有三個方面的用途:

  1. this表示本類屬性。
  2. this表示本類方法。
  3. this表示當前物件。

1.1 this表示本類屬性

觀察以下程式碼:

class Person{
    private String name;
    private int age;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       name=name;
    }

    public int getAge
() { return age; } public void SetAge(int age) { if(age <= 0) { System.out.println("年齡輸入錯誤!"); } else { age=age; } } //建構函式 public Person(String name,int age) { name=name; SetAge(age)
; } public void work() { System.out.println(name+"在工作!"); } public void age() { System.out.println(name+age+"歲了!"); } } public class Test{ public static void main(String[] args) { Person per1=new Person("花花",-18); per1.work(); per1.
age(); } }

在這裡插入圖片描述   通過以上程式碼,我們發現當引數與類中的屬性同名時,類中的屬性無法被正確賦值(就近原則,相當於自己=自己)。此時我們加上this關鍵字便可以正確給物件屬性賦值。

class Person{
    private String name;
    private int age;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       this.name=name;
    }

    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年齡輸入錯誤!");
       }
       else
       {
           this.age=age;
       }
    }
    //建構函式
    public Person(String name,int age)
    {
        this.name=name;
        SetAge(age);
    }
    public void work()
    {
        System.out.println(name+"在工作!");
    }
    public  void  age()
    {
        System.out.println(name+age+"歲了!");
    }
}
public class Test{
    public static void main(String[] args)
    {
       Person per1=new Person("花花",18);
        per1.work();
        per1.age();
    }
}

在這裡插入圖片描述 只要在類中訪問類的屬性,一定要加上this關鍵字

1.2 this呼叫本類方法

1.2.1 this呼叫普通方法

格式:this.方法名稱(引數)

class Person{
    private String name;
    private int age;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       this.name=name;
    }

    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年齡輸入錯誤!");
       }
       else
       {
           this.age=age;
       }
    }
    //建構函式
    public Person(String name,int age)
    {
        this.name=name;
        SetAge(age);
        this.work();
    }
    public void work()
    {
        System.out.println(name+"在工作!");
    }
    public  void  age()
    {
        System.out.println(name+age+"歲了!");
    }
}
public class Test{
    public static void main(String[] args)
    {
       Person per1=new Person("花花",18);
    }
}

在這裡插入圖片描述   雖然呼叫本類的普通方法不需要加this也可以正常呼叫,但還是建議加上,this的可以區分方法定義來源,在繼承中有效。

1.2.2 this呼叫構造方法

觀察構造方法存在的問題:

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 String getPersonInfo(){
		return "姓名:" + name + ",年齡:"+age;
	}
}
public class Test{
		public static void main(String[] args) {
			Person per1 = new Person();
			Person per2 = new Person("張三");
			Person per3 = new Person("李四",20);
			System.out.println(per1.getPersonInfo());
			System.out.println(per2.getPersonInfo());
			System.out.println(per3.getPersonInfo());
	}
}

  上述程式碼中有大量的重複程式碼,然而Java最忌諱的就是程式碼的重複書寫。在Java中,支援構造方法的互相呼叫。 修改上述程式碼:

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 String getPersonInfo(){
		return "姓名:" + name + ",年齡:"+age;
	}
}
public class Test{
		public static void main(String[] args) {
			Person per1 = new Person();
			Person per2 = new Person("張三");
			Person per3 = new Person("李四",20);
			System.out.println(per1.getPersonInfo());
			System.out.println(per2.getPersonInfo());
			System.out.println(per3.getPersonInfo());
	}
}

使用this呼叫構造方法時請注意:

  1. this呼叫構造方法的語句必須在構造方法的首行。
  2. this呼叫構造方法不允許成環。 在這裡插入圖片描述

1.2.3 this表示當前物件

class Person{
	private String name;
	private int age;

	public Person(String name,int age){
        this.name = name;
		this.age = age ;
	}
	public void getPersonInfo(){
		System.out.println(this +" 姓名:" + name + ",年齡:"+age);
	}
}
public class Test{
		public static void main(String[] args) {
			Person per1 = new Person("李四",17);
		    System.out.println("&per1="+per1);
            per1.getPersonInfo();
			Person per2 = new Person("張三",18);
            System.out.println("&per2="+per2);
            per2.getPersonInfo();
	}
}

在這裡插入圖片描述

2 static關鍵字

2.1 static屬性(類屬性)

觀察此段程式碼:

class Person{
	private String name;
	private int age;
    private String schoolName;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年齡輸入錯誤!");
       }
       else
       {
           this.age=age;
       }
    }
     public String getSchoolName()
    {
        return name;
    }
    public void setSchoolName(String schoolName)
    {
       this.schoolName=schoolName;
    }
	//構造方法
    public Person(String name, int age, String schoolName)
    {
        this.name=name;
        this.age=age;
        this.schoolName=schoolName;
    }
    public void getPeopleInfo()
    {
        System.out.println("學校:"+schoolName+"  姓名:"+name+" 年齡:"+age);
    }
}
public class Test{
		public static void main(String[] args) {
		Person per1=new Person("張三",18,"勵志中學");
		Person per2=new Person("李四",17,"勵志中學");
        per1.getPeopleInfo();
        per2.getPeopleInfo();
	}
}

記憶體分析圖: 在這裡插入圖片描述   一個學校裡有成千上萬個學生,雖然名字各不相同,但是學校名稱卻是相同的,像上圖那樣儲存學生的資訊,會造成系統資源的浪費。   描述共享屬性,只需在屬性前新增static關鍵字即可。   static屬性又稱類屬性,儲存在全域性資料區的記憶體之中,所有物件都可以進行該資料區的訪問。通過類名呼叫,與物件例項化無關。 修改上述程式碼:public static String schoolName=“勵志中學”; //static之前用public修飾

class Person{
	private String name;
	private int age;
    public static String schoolName="勵志中學";
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年齡輸入錯誤!");
       }
       else
       {
           this.age=age;
       }
    }
    public Person(String name, int age)
    {
        this.name=name;
        this.age=age;
    }
	
    public void getPeopleInfo()
    {
        System.out.println("學校:"+schoolName+"  姓名:"+name+" 年齡:"+age);
    }
}
public class Test{
		public static void main(String[] args) {
		Person per1=new Person("張三",18);
		Person per2=new Person("李四",17);
        per1.getPeopleInfo();
        per2.getPeopleInfo();
        System.out.println(Person.schoolName);
	}
}

在這裡插入圖片描述 此時的記憶體分析圖如下:

在這裡插入圖片描述 結論:

  • 訪問static屬性(類屬性)應使用類名稱.屬性名
  • 所有的非static屬性必須在物件例項化後使用,而static屬性(類屬性)不受物件例項化的控制。若想執行:System.out.println(Person.age);會報錯: 在這裡插入圖片描述

2.2 static方法(類方法)

  通過類名呼叫,與物件例項化無關,常見於工具類方法。

class Person{
	private String name;
	private int age;
    public int old;
    public static String schoolName;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年齡輸入錯誤!");
       }
       else
       {
           this.age=age;
       }
    }
    public Person(String name, int age)
    {
        this.name=name;
        this.age=age;
    }
	//靜態方法
    public static void setschoolName(String n)
    {
        schoolName=n;
    }
    public void getPeopleInfo()
    {
        System.out.println("學校:"+schoolName+"  姓名:"+name+" 年齡:"+age);
    }
}
public class Test{
		public static void main(String[] args) {
        Person.setschoolName("勵志中學");    
		Person per1=new Person("張三",18);
		Person per2=new Person("李四",17);
        per1.getPeopleInfo();
        per2.getPeopleInfo();
	}
}

在這裡插入圖片描述 關於static方法的說明:

  • 所有的static方法不允許呼叫任何非static定義的屬性或方法。
  • 所有的非static方法允許訪問static方法或屬性。