Java中this關鍵字和static關鍵字
阿新 • • 發佈:2018-12-16
1 this關鍵字
this關鍵字主要有三個方面的用途:
- this表示本類屬性。
- this表示本類方法。
- 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呼叫構造方法時請注意:
- this呼叫構造方法的語句必須在構造方法的首行。
- 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方法或屬性。