天天看點

java 程式設計思想筆記之this關鍵字(包括一些對方法在記憶體中的配置設定的解析)

This關鍵字:隻能在方法内部使用,表示對“調用方法的那個對象”的引用。

<b>Leaf.java</b>

public class Leaf { 

            private int i = 0; 

            Leaf increment() { 

                i++; 

                return this; 

            } 

            void print() { 

                System.out.println("i = " + i); 

            public static void main(String[] args) { 

                Leaf x = new Leaf(); 

                //increment方法被對象x調用,這方法内的this指向x對象。 

                x.increment().increment().increment().print(); 

}

通常,當我們說this的時候,都是指“這個對象”或者“目前對象”。而且它本身會産生目前對象的一個引用。在一個建構器中,若為其賦予一個參數清單,那麼this關鍵字會具有不同的含義:它會對與那個參數清單相符的建構函數進行明确的調用。這樣一來,我們就可通過一條直接的途徑來調用其他建構函數。

<b>City.java</b>

public class City { 

        private double code; 

        private String name;    

        //構造函數 

        public City(double code) { 

             this.code = code; 

        } 

        public City(String name){ 

             this.name = name; 

        public City(double code, String name) { 

             this(code); 

             //在一個構造函數中隻能通過this調用一次其他構造函數 

             this(name);//将會報錯 

        }        

        //get方法 

        public double getCode() { 

             return code; 

        public String getName() { 

             return name; 

        public static void main(String[] args){ 

             String str = "鳳山"; 

             City city1 = new City(str); 

             City city2 = new City(str); 

//方法在記憶體中隻儲存有一份。那怎樣知道getName方法是被哪個對象調用?通過this知道。當city1調用getName方法時,this就相當于city1的引用,當city2調用getName方法時,this就相當于city2的引用。 

             System.out.println(city1.getName()); 

             System.out.println(city2.getName()); 

由于以上例子說到了方法在記憶體中隻儲存有一份,這裡就解析一下方法的存儲(個人了解):一個程式所占用的的記憶體,分為存儲代碼片段,存儲資料片段和程式申請配置設定的記憶體(堆和棧)。方法作為程式代碼片段,是不存在任何申請配置設定的問題的,是以既不會在堆中,也不會在堆棧中。

以下再截個圖上來好了解(此圖出自尚學堂視訊):

現在知道了方法做為代碼片段是存儲在一個專門存儲代碼片段的記憶體中的,是以對于多個執行個體對象,它們共享這個方法代碼片段。既然這樣,對于上述例子中的getName()方法被city1和city2兩個執行個體調用,getName()方法是如何判斷到底是哪個執行個體調用它的name值的呢?對了,它是通過this關鍵字來判斷的。其實在getName()的方法中它隐藏了this關鍵字,它的寫法可以是以下這樣:

             return this.name; 

        }

在筆記開始我就寫了this關鍵字表示對“調用方法的那個對象”的引用。現在明白了吧,當city1調用getName方法時,this就相當于city1的引用,當city2調用getName方法時,this就相當于city2的引用。是以雖然方法片段隻有一份,但它可以通過this來區分引用。

總結:1. this關鍵字隻能在方法内部使用,表示對“調用方法的那個對  象”的引用。

         2. 在一個構造函數中隻能通過this調用一次其他構造函數。

3.方法片段在記憶體中隻儲存有一份,是以不同的執行個體調用方法時是通過this關鍵字來區分方法中的屬性。

本文轉自 yzzh9 51CTO部落格,原文連結:http://blog.51cto.com/java999/136116,如需轉載請自行聯系原作者