Java的this、public、static、protected關鍵字——有C++基礎的Java入門(四)
目錄
一、 this關鍵字
我覺得this在Java和C++、C#的作用都是差不多的,this比較重要,還是拉出來講講。
1、 概念
列印一個物件的時候,輸出的是這個物件的地址(JDK提供的一個地址,真正的地址是十六進位制的)。
this 只能在類的物件方法中使用。
this 代表當前呼叫這個this所在方法的物件的自身。
this 可以在方法內區分同名的類的屬性和引數名(有this的一定是屬性,沒有this的一定是方法的引數名)。
2、 例項
public class Demo {
public void work(){
System.out.println("Demo--------"+this);
}
}
class TestDemo{
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println("TestDemo--------"+demo);
demo.work();
}
}
執行結果
通過上面這個例子,不難看出this和demo的地址(每次new的時候都是唯一的)是相同的,說明它們兩個用的是同一個物件,誰呼叫的這個方法,這個打印出來的地址就是誰的。
3、 常見用法
還是舉個栗子吧~
public class PersonInfo{ private String name; /** *大家都知道下面的測試類要獲取 *這裡的私有資料,需要set和get。 *下面這種情況就需要區分一下誰是誰的name。 */ public void setName(String name){ //this後面的name是屬性 //這個方法的name是引數 this.name=name; } public void getName(String name){ return name; } } class TestPersonInfo{ PersonInfo person = new PersonInfo (); person.setName("王大錘"); String personName=person.getName(); System.out.println(personName); }
類內部 | package內 | 子類 | 其他 | |
public | 允許 | 允許 | 允許 | 允許 |
protected | 允許 | 允許 | 允許 | 不允許 |
default | 允許 | 允許 | 不允許 | 不允許 |
private | 允許 | 不允許 | 不允許 | 不允許 |
4、 原理
假設是一個汽車類(Car),這個車有color、name、carNo(車牌號)的屬性,有 run() 和 introduce() 的方法。另外有一個測試類(TestCar)來呼叫汽車類的方法。程式碼很簡單,這裡主要詳解一下原理。關於堆和棧以及進棧出棧的方式,自行補腦。
執行流程
第一步:java執行到TestCar的時候,把TestCar.class載入到JVM(各就各位,),把main放入方法區壓棧。
第二步:載入Car.class到JVM,然後把run() 和 introduce() 載入到方法區,在堆中建立一片空間建立了一個Car物件,在棧中產生一個變數car 指向堆中的物件。然後給 car 物件的三個屬性賦值。
第三步:car 的run() 方法進棧,把 car 變數所指向的地址賦值給this關鍵字,執行方法體。
第四步:run() 方法出棧,run() 中的 this 消失。
第五步:car 變數消失,main 出棧後消失。
第六步:由於Car堆中的物件失去了變數的引用變成了匿名物件,所以也被系統回收。
二、 public關鍵字
使用物件:類、介面、成員
介紹:無論它所處在的包定義在哪,該類(介面、成員)都是可訪問的
三、static關鍵字
使用物件:類、方法、欄位、初始化函式
介紹:成名為static的內部類是一個頂級類,它和包含類的成員是不相關的。
1、修飾在屬性上
class User{
//一般的變數命名
String username;
String password;
//加上static的命名
static String realName;
}
加上static關鍵字之後,表示realName這個變數名不再是User的屬性,而是這個類的屬性。
2、修飾在方法上
語法:public static 返回值型別 方法名(資料型別 引數名);
方法名上不帶static的方法都是物件的方法。
public class Demo {
String name;
int age;
String lesson;
/**
* 物件的方法,每一個老師的例項可以使用
*/
public void teach(){
System.out.println("老師在上課.....");
}
/**
* 類方法
*/
public static void sleep(){
System.out.println("老師在睡覺.....");
}
}
class TestDemo{
public static void main(String[] args) {
// 使用類名來呼叫類方法,推薦使用
Demo.sleep();
//不推薦使用下面的方法來呼叫
Demo demo = new Demo();
demo.sleep();
}
}
總結:上面這個例項說明,有static關鍵字的方法是類的屬性,則可通過 “類名.方法名” 來呼叫。
四、 protected關鍵字
推薦一個教程連結:http://www.runoob.com/w3cnote/java-protected-keyword-detailed-explanation.html
下一章節:有C++基礎的Java入門(五)