關於Java內部類的理解
最近通過複習面向物件的三大特徵,對於一些細節加深了理解,並且希望記錄下來,在以後學習複習上能夠翻一翻。
面向物件三大特徵分別是:封裝,繼承與多型,在學習封裝的時候我習慣把知識點進行分類,分別是:
1.什麼是分裝
2.訪問修飾符
3.this關鍵字
4.內部類
首先提出幾個疑問:
1.那麼內部類是什麼呢?究竟有什麼用呢?
在講內部類的時候就必須講到封裝跟訪問修飾符,那麼封裝是什麼呢?跟訪問修飾符又有什麼關係呢?在類中所定義的一些變數,我們可以將它進行隱藏,封裝到類中的一個方法中,在其他類中就無法直接呼叫該變量了。如果要進行呼叫屬性的話,只需要通過建立物件呼叫方法來獲取、傳入變數。當我們需要封裝該變數的時候,我們就需要講該變數定義一個訪問修飾符,訪問修飾符就是指該變數,該方法,該類的訪問範圍,有四種訪問修飾符:public,protected,預設,private。這四種訪問修飾符分別所可以訪問的訪問範圍不同,在我們要對屬性進行封裝的時候我們需要對其進行定義一個private的訪問修飾符。(關於四種訪問修飾符的不同本文章不提及)
2.那麼內部類有什麼作用呢?
剛才講了內部類跟封裝有很大的聯絡,因為:
(1)內部類將會提供更好的封裝,我們可以將屬性與方法封裝到類中,將內部類隱藏到外部類中,這樣在同一包中的不同類中就不可以進行呼叫了。
(2)當內部類封裝到外部類中,內部類可以呼叫外部類的所有屬性與方法,並且包括私有的屬性。
內部類的作用就講到這裡,接下來我們講一講內部類的型別
內部類主要有四大內部類,分別是:
1.成員內部類
2.靜態內部類
3.方法內部類
4.匿名內部類
關於第四個匿名內部類我們先不講,主要是前三種內部類
1.成員內部類
我們還是通過程式碼進行理解吧
package com.xun;
/**
* 創造一個成員內部類
* @author XunselF
*
*/
public class MemberIc {
private String name = "xun";
int age = 20;
public class Inner{
String name = "xunself";
public void show(){
System.out.println("呼叫外部類的name變數:"+MemberIc.this.name);
System.out.println("呼叫外部類的age變數"+age);
System.out.println("呼叫內部類的name變數"+name);
}
}
public static void main(String[] args){
MemberIc I = new MemberIc();
Inner C = I.new Inner();
C.show();
}
}
在這個程式碼我們發現,在MemberIc類中定義了一個Inner類
那麼這個MemberIc類就是外部類,Inner類就是內部類
成員內部類的特點:
1.在MemberIc類中定義了一個普通的Inner類,如果我們要進行呼叫Inner內部類方法時,我們就必須要先建立一個MemberIc的外部類物件,再通過外部類物件進行初始化Inner類的內部類物件,最後通過內部類物件進行呼叫方法
2.如果在MemberIc外部類中定義了一個name變數,在Inner內部類也定義了一個name變數,如果要在Inner內部類方法中使用,就要用外部類名.this.屬性名才能進行呼叫外部類同名屬性
2.靜態內部類
程式碼如下:
package com.xun;
public class StaticIc {
private static int score = 58;
private int age = 10;
public static class SInner{
int score = 20;
public void show(){
System.out.println("呼叫非靜態的age變數:"+new StaticIc().age);
System.out.println("呼叫外部類中的score靜態變數:"+StaticIc.score);
System.out.println("呼叫靜態內部類中的score變數:"+score);
}
}
public static void main(String[] args){
SInner S = new SInner();
S.show();
}
}
靜態內部類的特點:(可以與成員內部類進行對比)
1.StaticIc類是一個外部類,SInner是一個靜態內部類,與成員內部類相比,靜態內部類無需通過外部類物件進行初始化內部類物件,只需直接建立內部類物件即可
2.在外部類與內部類同名屬性問題上,相比成員內部類,靜態內部類只需通過外部類名.屬性名即可
3.靜態內部類有著與其他內部類不一樣的特點是:在靜態內部類中無法直接使用非靜態成員,如果要使用非靜態成員,我們需要通過new 外部類名().屬性名進行呼叫
3.方法內部類
程式碼如下:
package com.xun;
public class WayIc {
public void print(){
int score1 = 1;
class MInner{
int score = 12;
public void show(){
System.out.println(score);
}
}
MInner I = new MInner();
I.show();
}
public static void main(String[] args){
WayIc C = new WayIc();
C.print();
}
}
方法內部類其實很容易理解,它與其他內部類都有所不同
方法內部類的特點主要有:
1.將MInner內部類封裝到WayIc外部類中的print()方法中,因為封裝在方法裡,所以不需要給MInner內部類定義訪問修飾符(在方法中不允許定義訪問修飾符跟static關鍵字,因為在方法中定義的變數屬於區域性變數,在方法外其他地方都無法使用,所以定義了訪問修飾符也沒有什麼意義,但是在eclipse當中這是一個錯誤)
2.因為MInner內部類定義在方法中,所以除了方法內其他地方都無法呼叫,所以在方法內要將MInner內部類進行初始化物件,通過物件呼叫方法,這樣在建立WayIc外部類物件時,通過物件呼叫方法即可
以上就是我關於內部類的理解