Java面向對象之內部類案例講解

1. 內部類

很多時候我們創建類的對象的時候並不需要使用很多次,每次隻使用一次,這個時候我們就可以使用內部類瞭

1.1 內部類概述

  • 內部類就是在一個類的內部在定義一個類,比如,A類中定義一個B類,那麼B類相對A類來說就稱為內部類,而A類相對B類來說就是外部類瞭。
  • 內部類不是在一個java源文件中編寫倆個平行的倆個類,而是在一個類的內部再定義另外一個類。 我可以把外邊的類稱為外部類,在其內部編寫的類稱為內部類。
  • 內部類分為四種:
    • 成員內部類
    • 靜態內部類
    • 局部內部類
    • 匿名內部類

1.2 成員內部類(實例內部類、非靜態內部類)

註:成員內部類中不能寫靜態屬性和方法


1.2.1 【定義一個內部類】

//在A類中申明瞭一個B類,此B類就在A的內部,並且在成員變量的位置上,所以就稱為成員內部類
public class Outer {
    private int id;

    class Inner {
        public void in() {
            System.out.println("這是內部類方法");
        }
    }

    public void out() {
        System.out.println("這是外部類方法");
    }
}

1.2.2【實例化內部類】

實例化內部類,首先需要實例化外部類,通過外部類去調用內部類

// 代碼接上
class Test {
    public static void main(String[] args) {
        //實例化成員內部類分兩步
        //1、實例化外部類
        Outer outObject = new Outer();
        //2、通過外部類調用內部類
        Outer.Inner inObject = outObject.new Inner();
        //測試,調用內部類中的方法
        inObject.in();//打印:這是內部類方法
    }
}

在這裡插入圖片描述

分析:
想想如果你要使用一個類中方法或者屬性,你就必須要先有該類的一個對象,同理,一個類在另一個類的內部,那麼想要使用這個內部類,就必須先要有外部類的一個實例對象,然後在通過該對象去使用內部類。


1.2.3 【成員內部類能幹什麼?】

訪問外部類的所有屬性(這裡的屬性包括私有的成員變量,方法)

//在A類中申明瞭一個B類,此B類就在A的內部,並且在成員變量的位置上,所以就稱為成員內部類
public class Outer {
    private String id = "11923020124";

    class Inner {
        public void in() {
            System.out.println("這是內部類方法");
        }

        //內部類訪問外部類私有的成員變量
        public void getId() {
            System.out.println("id: " + id);
        }

        public void useOut() {
            out();
        }
    }

    public void out() {
        System.out.println("這是外部類方法");
    }
}

class Test {


    public static void main(String[] args) {
        //實例化成員內部類分兩步
        //1、實例化外部類
        Outer outObject = new Outer();
        //2、通過外部類調用內部類
        Outer.Inner inObject = outObject.new Inner();
        //測試,調用內部類中的方法
        inObject.in();//打印:這是內部類方法
        inObject.getId();
        inObject.useOut();
    }
}

在這裡插入圖片描述

如果內部類中的變量名和外部類的成員變量名一樣,要通過創建外部類對象 “.”屬性來訪問外部類屬性,通過this.屬性訪問內部類成員屬性

//在A類中申明瞭一個B類,此B類就在A的內部,並且在成員變量的位置上,所以就稱為成員內部類
public class Outer {
    private String id = "Outer Id";

    class Inner {
        private String id = "Inner Id"; //這個id跟外部類的屬性id名稱一樣。

        public void getInnerId() {
            System.out.println(id);//輸出Inner Id,內部類中的變量會暫時將外部類的成員變量給隱藏
        }

        public void getOuterId() {
            System.out.println(Outer.this.id);//輸出Outer Id,內部類中的變量會暫時將外部類的成員變量給隱藏
        }
    }

    public void out() {
        System.out.println("這是外部類方法");
    }
}

class Test {
    public static void main(String[] args) {
        //實例化成員內部類分兩步
        //1、實例化外部類
        Outer outObject = new Outer();
        //2、通過外部類調用內部類
        Outer.Inner inObject = outObject.new Inner();
        //測試,調用內部類中的方法
        inObject.getInnerId();
        inObject.getOuterId();
    }
}

在這裡插入圖片描述

說明:

如何調用外部類的成員變量呢?通過Outer.this,因為如果想實例化內部類對象,就必須通過外部類對象,當外部類對象new出內部類對象時,會把自己(外部類對象)的引用傳到瞭內部類中,所以內部類就可以通過Outer.this來訪問外部類的屬性和方法,到這裡,你也就可以知道為什麼內部類可以訪問外部類 的屬性和方法,這裡由於有兩個相同的屬性名稱,所以需要顯示的用Outer.this來調用外部類的屬性,平常如果屬性名 不重復,那麼我們在內部類中調用外部類的屬性和方法時,前面就隱式的調用瞭Outer.this。


1.2.4 借助成員內部類,來總結內部類(包括4種內部類)的通用用法:

  • 要想訪問內部類中的內容,必須通過外部類對象來實例化內部類。
  • 能夠訪問外部類所有的屬性和方法,原理就是在通過外部類對象實例化內部類對象時,外部類對象把自己的引用傳進瞭內部類,使內部類可以用通過Outer.this去調用外部類的屬性和方法,一般都是隱式調用瞭,但是當內部類中有屬性或者方法名和外部類中的屬性或方法名相同的時候,就需要通過顯式調用Outer.this瞭。

到此這篇關於Java面向對象之內部類案例講解的文章就介紹到這瞭,更多相關Java面向對象之內部類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: