java基礎 內部類

基礎鞏固 ,都是課本上的例子

 package 內部類;
/**
 * 
 * 成員內部類
 * @author CZ
 * 在一個類中使用內部類,可以在內部類中直接存取其所在類的私有成員變量。
 */
public class Demo1 {
    private class InnerClass{
        //...在內部類中可以隨意使用外部類的成員方法以及成員變量
    }
}

 public class Demo2 {
    
    public class InnerClass{
        int y = 0;//定義內部類的成員變量
        public InnerClass() {
            //內部類的構造方法
        }
        public void inf() {
            //內部類的成員方法
        }
    }
    
    InnerClass in = new InnerClass();
    
    public InnerClass doit() {//外部類方法,返回爲內部類的引用
        //y=4;        外部類不可以直接訪問內部類的成員變量
        in.y = 4;
        return new InnerClass();
    }
    
    public void ouf() {
        in.inf();//在外部類中調用內部類的成員方法
    }
    
    public static void main(String[] args) {
        Demo2 demo2 = new Demo2();
        //內部類的對象實例化操作必須在外部類或外部類的非靜態方法中實現
        Demo2.InnerClass in = demo2.doit();
        //不能在new之前使用外部類的名稱直接實例化外部類,應首先應該創建一個外部類的對象,通過外部類的對象實例化內部類對象
        Demo2.InnerClass in2 = demo2.new InnerClass();
        
    }
}

package 內部類;

//定義一個接口
interface InterFace {
    public void f();
}
public class Demo3 {
    public static void main(String[] args) {
        OuterClass out = new OuterClass();
        InterFace inter = out.doit();
        inter.f();
        
        //運行結果
        //訪問內部類的構造方法
        //訪問內部類中的f()方法
        
        //隱藏f()方法的具體實現細節,只爲編寫子類的人提供一個接口和一個外部類,這是內部類的基本用途
    }
}
class OuterClass{
    //定義一個內部類實現InterFace接口
    private class InnerClass implements InterFace{
        public InnerClass(String s) {
            System.out.println(s);
        }
        @Override
        public void f() {//實現接口中的f()方法
            System.out.println("訪問內部類中的f()方法");
        }
    }
    public InterFace doit() {
        return new InnerClass("訪問內部類的構造方法");
    }
}

 

package 內部類;

public class Demo4 {
    private int x;
    private class Inner {
        private int x = 9;
        public void doit(int x) {
            x ++;    //調用的是內部類的形參x
            this.x++;    //調用的是內部類的變量x
            Demo4.this.x++;        //調用的是外部類的變量x
        }
    }
    //在內存中所有的對象都被放置在堆中
    //方法以及方法中的形參或局部變量都放置在棧中
}

 

package 局部內部類;
/**
 * 內部類不僅可以在類中進行定義,也可以在類的局部進行定義
 * 在類的方法和任何作用域中都可以定義
 * @author CZ
 *
 */

interface OutInterface{}

public class Demo1 {
    //在方法中定義的內部類只能訪問方法中final類型的變量,因爲在方法中定義的局部變量相當於一個常量
    public OutInterface doit(final String x) {
        //在doit方法中定義一個內部類
        class InnerClass implements OutInterface{
            public InnerClass(String s) {
                s = x ;
                System.out.println(s);
            }
        }
        return new InnerClass("doit");
    }
}

 public class Demo1 {
    int x = 100;
    static class Inner{
        void doitInner() {
            //System.out.println("外部類"+x);
            //發生編譯錯誤,因爲非靜態外部類的成員變量爲非靜態
        }
        //實踐與練習2
        public static void main(String[] args) {
            System.out.println("a");
        }
    }
    public static void main(String[] args) {
        //實踐與練習3
        Inner inner = new Inner();
    }
}

package 匿名內部類;

//定義一個接口 實踐與練習1
interface OutInterface{}
public class Demo1 {
    public OutInterface doit(final String x) {
        return new OutInterface() {
            private int i = 0;
            public int getValue() {
                return i;
            }
        };
    }
}

 

package 內部類的繼承;

public class Demo1 extends ClassA.ClassB{
    public Demo1(ClassA a) {
        a.super();
    }
}
class ClassA{
    class ClassB{
        
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章