内部类专题

2021-05-27  本文已影响0人  攻城老狮

1 内部类的概念

1.1 内部类的分类

定义在外部类的局部位置

定义在外部类的成员位置

1.2 类的五大成员

属性、方法、构造器、代码块和内部类

2 局部内部类

2.1 局部内部类的特征

2.2 局部内部类的测试

public class LocalClass {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.outer_m();
    }
}

class Outer { //外部类
    private int n = 10;

    public void outer_m() {
        final class LocalInner { //局部内部类
            private int n = 100;
        
            public void inner_m() {
                System.out.println("inner method...");
                System.out.println("n=" + n + " outer n=" + Outer.this.n);
            }
        }
        LocalInner localInner = new LocalInner();
        localInner.inner_m();
    }
}

3 匿名内部类

3.1 匿名内部类的特征

3.2 匿名内部类的测试

public class AnnoClass {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.outer_m();
    }
}

class Outer {
    private int n = 10;

    public void outer_m() {
        //类似 public class Outer$1 implements IFly
        IFly bird = new IFly() {
            private int n = 100;

            @Override
            public void fly() {
                System.out.println("bird fly...");
                System.out.println("n=" + n + " outer_n=" + Outer.this.n);
            }
        };
        bird.fly();
        //类似 public class Outer$2 extends Animal
        Animal dog = new Animal(){
            @Override
            public void eat() {
                System.out.println("dog eat...");
            }
        };
        dog.eat();
    }
}

interface IFly {
    public void fly();
}

class Animal {
    public void eat() {
        System.out.println("animal eat...");
    }
}
bird fly...
n=100 outer_n=10
class com.yqj.innerclass.Outer$1
dog eat...
class com.yqj.innerclass.Outer$2

4 成员内部类

4.1 成员内部类的特征

4.2 成员内部类的使用

public class MemberClass {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner1 = outer.new Inner();
        inner1.inner_m();
        System.out.println(inner1);
        
        Outer.Inner inner2 = outer.getInner();
        inner2.inner_m();
        System.out.println(inner2);
        
        Outer.Inner inner3 = new Outer().getInner();
        inner3.inner_m();
        System.out.println(inner3);
    }
}

class Outer{
    private int n = 10;

    private void outer_m(){
        System.out.println("outer method...");
    }

    public class Inner{
        private int n = 100;
        public void inner_m(){
            outer_m();
            System.out.println("n="+100 + " outer_n="+Outer.this.n);
        }
    }

    public Inner getInner(){
        return new Inner();
    }
}
outer method...
n=100 outer_n=10
com.yqj.innerclass.Outer$Inner@677327b6
outer method...
n=100 outer_n=10
com.yqj.innerclass.Outer$Inner@14ae5a5
outer method...
n=100 outer_n=10
com.yqj.innerclass.Outer$Inner@7f31245a

5 静态内部类

5.1 静态内部类特征

5.2 静态内部类的使用

public class StaticClass {
    public static void main(String[] args) {
        Outer.Inner inner1 = new Outer.Inner();
        inner1.inner_m();

        Outer.Inner inner2 = new Outer().getInner1();
        inner2.inner_m();

        Outer.Inner inner3 = Outer.getInner2();
        inner3.inner_m();
    }
}

class Outer {
    private static int n = 10;

    public static class Inner {
        private int n = 100;

        public void inner_m() {
            System.out.println("n=" + n + " outer_n=" + Outer.n);
        }
    }

    public Inner getInner1(){
        return new Inner();
    }

    public static Inner getInner2(){
        return new Inner();
    }
}
n=100 outer_n=10
n=100 outer_n=10
n=100 outer_n=10
上一篇 下一篇

猜你喜欢

热点阅读