1. 程式人生 > >Java:內部類的四種形式

Java:內部類的四種形式

內部類

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

內部類可看做外部類的成員。外部類只能由public修飾或者預設包內訪問
而內部類卻可以用四種訪問控制符以及static修飾


成員內部類

解釋:除靜態常量外沒有靜態內容且宣告在類的成員區
外部類內容的訪問許可權:顧名思義 此時的內部類就相當於外部類的一個成員,因此可以訪問外部類的所有內容
成員限制:除靜態常量外,無靜態內容

public class OuterClass {

    private int out;
    public static  final  int
CONST = 5; private static int getCONST(){ return CONST; } //成員內部類 class InnerClass{ private int out;//內部類變數與外部類變數重名 private static final int test = 5; public int getOut(){ System.out.println(OuterClass.this.out);//內部用out訪問到的是內部變數, return
out;//用 外部類名.this.變數名 訪問外部變數 } public int innerGetCONST(){ return getCONST(); } } InnerClass ic = new InnerClass();//外部類內製造成員內部類物件 InnerClass p = this.new InnerClass();//實際通過this建立 } //成員內部類是依附外部類而存在的,製造成員內部類的物件,必須存在一個外部類的物件 OutClass oc = new OutClass(); OutClass.InnerClass oi = oc.new
InnerClass(); //方法二 OutClass.InnerClass oi = new OutClass().new InnerClass();

區域性內部類

解釋:作用域類似區域性變數,只在當前程式碼塊中有效的,只有在作用域內才能被例項化的內部類
外部類內容的訪問許可權:
如果在靜態方法中:
可以訪問外部類中所有靜態成員,包含私有
如果在例項方法中:
可以訪問外部類中所有的成員,包含私有
成員限制:區域性內部類中不可定義靜態變數

public class Outer {

    private int out;

    public void print(){
    //區域性內部類
        class Inner{

            private int in;

            private final int tset=3;

            private int getIn(){
                return in;
            }
        }
        System.out.println(new Inner().getIn());//可以在外部類中直接製造區域性內部類的物件
    }
}

靜態內部類

解釋:由static修飾的靜態內部類類似靜態變數/方法
可含有static修飾的方法
外部類內容訪問許可權:只可訪問外部類的靜態成員

實際上由static修飾後,此內部類已經與外部類的物件無關了,它是直接屬於外部類的,可以認為是巢狀類,類名為 外部類名.內部類名 ,實際上就是一種外部類 這個特點在製造物件的方式中可見一斑

public class Out {
    private int out = 10;
//靜態內部類
    static class In{
        private int inner = 5;
        private static int in = 6;

        public void setIn(int num){
            in = num;
        }
        public static int getIn(){
            return in;
        }
        public static  int getInner(){
            return new In().inner;
        }
    }

    In in = new In();//外部類內可直接使用
}//靜態內部類的物件製造方式
//外部類名.內部類名 變數名 = new 外部類名.內部類名();

匿名內部類

解釋:顧名思義,沒有名字的內部類。。
沒有class,interface,implements,extends關鍵字
沒有構造器
一般隱式的繼承某一個父類或者實現某一個介面,只使用一次

public class OutClass {

    private int out=1;

    public int getOut(OutClass oc){
        return  oc.out;
    }


    public static void main(String[] args) {
        System.out.println(new OutClass(){//由此開始  繼承了OutClass類
            @Override//臨時重寫了getOut方法
            public int getOut(OutClass oc){
                return 10;
            }
        }/*匿名內部類自此結束*/.getOut(new OutClass())//呼叫這個該匿名內部類的getOut方法);
    }
}
//輸出為10

2018/7/21