1. 程式人生 > >在Java內部類中使用外部類的成員方法以及成員變數

在Java內部類中使用外部類的成員方法以及成員變數

眾所周知,在定義成員方法或者成員變數的時候,可以給其加上一些許可權的修飾詞,以防止其他類的訪問。如在成員變數或者成員方法前面,加上Private關鍵字,則其他類就無法呼叫這個類中的成員方法或則和成員變數。但是,如果這個類有成員內部類,則不受這方面的限制。也就是說,在成員內部類中可以隨意引用外部類的成員方法以及成員變數,即使這些類成員方法或者成員變數被修飾了private.如在成員外部類中定義了一個i變數,並且利用private關鍵字來修飾。此時在其他類中是不能夠引用這個私有成員變數的。但是這個類的成員內部類的方法中,則不僅可以引用這個外部類的私有變數,而且還可以對其進行賦值等操作。這個賦值操作對於外部類也是有效的。即成員內部類可以更改外部類中私有變數的值。(深入理解巢狀類和內部類)

要在外部類中例項化內部類物件的引用。

如果一個類定義在另外一個類中,成為成員內部類,此時一定要注意,內部類的例項一定要繫結在Java外部類的例項上。(如何在內部類中返回外部類物件)也就是說,要從外部類中初始化一個內部類的物件,此時內部類的物件就會繫結在外部類的物件上。這跟普通的類有所不同。普通的類,建立完之後,不一定馬上需要例項化。在需要用到這個物件的時候,再進行例項化即可。但是,如果一個類成為另外一個類的成員內部類,則就不同了。必須要在外部類中例項化內部類物件的引用,以實現將內部類的例項繫結在外部類的例項上。簡單的說,就是在定義外部類的時候,如果有成員內部類,那麼就不要忘了在外部類中利用new關鍵字來例項化內部類物件的引用。而對於外部類來說,則可以在需要的時候再進行例項化。如此就可以保證,利用外部類建立物件的同時建立了內部類的物件。從而可以保證Java內部類的例項繫結在外部類的例項上。

成員內部類中成員方法與成員變數的私有性。

作為成員內部類,可以隨意引用外部類中的成員變數與成員方法。那麼在成員內部類中定義的成員變數,外部類是否也可以隨意訪問呢?答案是否定的。內部類可以訪問它外部類的成員,但是內部類的成員(如成員變數或者成員方法)只有在內部類的範圍之內是可知的,不能夠被外部類直接引用。如現在在外部類中定義了一個變數i,在內部類中定義了另一個變數ii.此時在成員內部類中,可以直接引用這個外部類中的變數i,也可以對其直接進行賦值,如i=5等等。但是在外部類中,則不能夠直接引用內部類中的成員變數。如在外部類中,利用ii=5的賦值語句改變這個變數的值,就屬於語法錯誤,在編譯的時候就會出現錯誤。如果外部類真的要引用內部類的成員,那也不是不可以。只是不能夠進行直接的引用,而是要使用內部類物件引用的方法才能夠呼叫內部類的成員變數。這一點程式開發人員需要切記。成員內部類與外部類相互訪問彼此的成員方法限制是不同的。特別需要注意的是,如果在外部類和非靜態方法之外例項化內部物件,則需要使用外部類。內部類的形式來制定這個物件的型別。這非常的麻煩。為此要儘量避免在外部類和非靜態方法之外例項化內部類物件。再者,內部類物件會依賴於外部類物件,除非已經存在一個外部類物件,否則類中不會出現內部類物件。簡單的說,內部類物件與外部類物件之間的關係非常的緊密。有時候即像一對父子(成員內部類可以隨意使用外部類的成員),有時候又像是陌生人(外部類不能夠直接使用內部類中的成員)。作為一個出色的程式開發人員,必須要深入瞭解外部類物件與內部類物件的關係。因為在實際工作中,在外部類中定義成員內部類還是很常見的。只有瞭解他們彼此之間的關係,在編寫應用程式中,才可以把控好他們。

使用this關鍵字獲取內部類與外部類物件的引用。

在外部類和成員內部類中,都可以定義變數。成員內部類可以隨意訪問外部類中的變數,而外部類不能夠直接訪問內部類中的變數,只有通過使用內部類物件來引用內部類的成員變數。不過需要注意的是,在外部類中定義的變數與內部類中定義的變數名字可以相同。也就是說,在外部類中可以定義一個變數i,在內部類中也可以定義一個變數i。此時新的問題就出來了。由於在內部類中可以隨意訪問外部類中成員方法與成員變數。但是此時成員內部類與外部類的變數名相同,那麼如果要在內部類使用這個變數i,編譯器怎麼知道現在需要呼叫外部類的變數i,還是內部類的變數i呢?

在實際工作中,應該儘量避免這種情況。即在定義變數名字的時候,Java內部類中的變數名字儘量不要與外部類中的變數名字相同。但是如果真的發生這種情況的話,Java編譯器還是有手段可以解決這個變數名字的衝突問題。如果在類中的成員內部類中遇到成員變數名字與外部類中的成員變數名字相同,則可以通過使用this關鍵字來加以區別。如現在有一個類名字叫做student.而在這個類中又建立了一個成員內部類,名字叫做age.現在在這兩個類中各自定義了一個成員變數i,用來做迴圈之用。此時如果在成員內部類中呼叫這個變數,該如何進行區分呢?通常情況下,如果使用this.i 的方式來呼叫變數,則表示這個變數是成員內部類中定義的變數。而通過使用student.this.i的形式呼叫變數時表示此時引用的是外部類的成員變數。也就是說,如果內部類中引用外部類中同名的成員,需要通過外部類迷名字。this.外部類成員名字的方式加以引用。而且,在引用成員內部類自己的定義的成員時也需要使用this關鍵字,以加以區別。顯然這非常的麻煩。為此筆者仍然要強調一遍,除非有非常特殊的必要,否則的話要儘量避兩外部類與成員內部類中成員變數或者成員方法採用相同的名字。否則的話,會給後續的引用帶來很大的麻煩。

從以上的總結中可以看出,成員內部類與外部類之間的關係確實很複雜。作為一個Java程式開發人員,必須要了解內部類與外部類成員相互之間引用的準則、內部類物件與外部類物件的關係。在編寫程式碼的時候,儘量避免內部類與外部類中成員變數與成員方法的命名衝突。如果真的發生重名的話,要學會利用this關鍵字來消除這個衝突。筆者上面談的一些注意實現也是一些比較抽象的內容,需要開發人員在實際工作中去領悟。