Java 內部類

weixin_34148456發表於2018-12-07
什麼是內部類

在類的內部定義另一個類。定義就這麼簡單。如果在類Outer的內部再定義一個類Inner,此時Inner就稱為內部類,而Outer則稱為外部類。內部類的定義格式如下:

public class 外部類的名稱{
    //外部類的成員
    public class 內部類的名稱{
             //內部類的成員
    }
}
內部類優缺點

使用內部類的優點:
1)實現多重繼承;
2)內部類可以很好的實現隱藏:一般的非內部類,是不允許有 private 與protected許可權的,但內部類可以
3)減少了類檔案編譯後的產生的位元組碼檔案的大小

使用內部類的缺點:使程式結構不清楚。

內部類的種類:

成員內部類、靜態內部類、區域性內部類、匿名內部類

成員內部類

1、成員內部類也叫例項內部類。應用場合:每一個外部類物件都需要一個內部類的例項,內部類離不開外部類存在(相當於心臟對人體)

2、成員內部類的特徵:
作為外部類的一個成員存在,與外部類的屬性、方法並列成員內部類持有外部類的引用,成員內部類中不能定義static變數和方法

3、使用格式:

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

示例程式碼一

public class Body {
    String arm;
    String leg;
    String blood;
    public Body(String arm, String leg, String blood) {
        super();
        this.arm = arm;
        this.leg = leg;
        this.blood = blood;
    }
    //內部類Heart
    class Heart{
        String name;
        void work() {
            System.out.println("心臟正在給"+arm+leg+"輸"+blood);
        }
    };
}
public class BodyTest {
    public static void main(String[] args) {
        Body body=new Body("兩個胳膊","兩條腿","血");
        Body.Heart  heart=body.new Heart();
        heart.work();
    }
}

示例程式碼二

public class Outer {
    private String name="Hello World";
    public class Inner{
        public void print(){
            System.out.println(name);
        }
    };
    public void print(){//定義外部類方法
        new Inner().print();//通過內部類的例項化物件呼叫方法
    }
    public static void main(String[] args) {
        Outer outer=new Outer();
        outer.print();//呼叫外部類的方法
    }
}
靜態內部類

1、內部類如果使用static宣告,則此內部類就稱為靜態內部類。(其實也相當於外部類)可以通過外部類 . 內部類來訪問。

2、靜態內部類使用場合:內部類不需要外部類的例項(注意區分成員內部類),靜態內部類存在僅僅為外部類提供服務或者邏輯上屬於外部類,且邏輯上可以單獨存在。

3、靜態內部類的特徵:
靜態內部類不會持有外部類的引用,靜態內部類可以訪問外部的靜態變數,如果訪問外部類的成員變數必須通過外部類的例項訪問

4、Java中只有內部類才可以是靜態的
使用格式:Outer.Inner inner = new Outer.Inner();

public class Company {
    String companyNam;
    static String country;

    static class Clear{
        String name;
        public Clear() {
            // TODO Auto-generated constructor stub
        }

        public Clear(String name) {
            super();
            this.name = name;
        }

        public void work(String name){
            String s = new Company().companyNam = "蘋果公司";
            country="中國";
            System.out.println(name+"為"+s+"工作,該公司屬於"+country);
        }
    }
}
public class CompanyTest {
    public static void main(String[] args) {
        Company.Clear c = new Company.Clear();
        c.work("Alex");
    }
}
區域性內部類

1、區域性內部類也叫區域內嵌類,區域性內部類與成員內部類類似,不過,區域內嵌類是定義在一個方法中的內嵌類。

2、使用場合:如果內部類物件僅僅為外部類的某個方法使用,使用區域性內部類

3、特徵:
○用在方法內部,作用範圍僅限於該方法中
○根據情況決定持有外部類物件引用
○不能使用private,protected,public修飾符
○不能包含靜態成員

示例程式碼

public class School {
    String schoolName;
    String buss = "培養人才";
    int studentNum;

    public School() {
        // TODO Auto-generated constructor stub
    }

    public School(String schoolName, String buss, int studentNum) {
        super();
        this.schoolName = schoolName;
        this.buss = buss;
        this.studentNum = studentNum;
    }

    //宣傳
    public void show(){
        final double tvMoney = 10000;
        final double netMoney = 20000;

        class AdverTeam{
            String teamName="無敵是多麼寂寞";
            //電視宣傳
            public void tvShow(){
                System.out.println("宣傳隊是:"+teamName);
                System.out.println("這是電視宣傳、學校名稱:"+schoolName+"、業務內容:"+buss+"、學校人數:"+studentNum+"、宣傳所需費用:"+tvMoney);
            }

            //網路宣傳
            public void netShow(){
                System.out.println("宣傳隊是:"+teamName);
                System.out.println("這是網路宣傳、學校名稱:"+schoolName+"、業務內容:"+buss+"、學校人數:"+studentNum+"、宣傳所需費用:"+netMoney);
            }
        }
        new AdverTeam().tvShow();
        new AdverTeam().netShow();
    }
}
public class SchoolTest {
    public static void main(String[] args) {
        School qinghua=new School("清華","網際網路培訓",1000);
        qinghua.show();
    }
}
匿名內部類

1、匿名內部類也就是沒有名字的內部類,這是java為了方便我們編寫程式而設計的一個機制,因為有時候有的內部類只需要建立一個它的物件就可以了,以後再不會用到這個類,這時候使用匿名內部類就比較合適。

2、使用場合:簡化內部類的使用

3、特徵:
○匿名內部類不能定義任何靜態成員、方法。
○匿名內部類中的方法不能是抽象的;
○匿名內部類必須實現介面或抽象父類的所有抽象方法。
○匿名內部類訪問的外部類成員變數或成員方法必須用static修飾;

public interface Inter {
    public void show1();
    public void show2();
}
public class Outer {
    public void method(){
        new Inter(){

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

            @Override
            public void show2() {
                System.out.println("這是show2方法");
            }
        }.show1();

        new Inter(){

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

            @Override
            public void show2() {
                System.out.println("這是show2方法");
            }
        }.show2();
    }
}
public class OuterTest {
    public static void main (String[] args){
        Outer t = new Outer();
        t.method();
    }
}

相關文章