1. 程式人生 > >關於Java內部類的理解

關於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外部類物件時,通過物件呼叫方法即可

以上就是我關於內部類的理解