Java内部类

1.内部类分为4种:

  1. 成员内部类(定义在类里面的类),又称普通内部类
  2. 局部内部类(定义在方法体或者代码块里面的类)
  3. 静态内部类(static关键字修饰的内部类)
  4. 匿名内部类

2.内部类的特点:

  • 可以使用外部类的属性,即使这个属性是private的也可以使用
  • 可以调用外部类的方法
  • 在多线程时常用内部类-->后来进化到了lambeda表达式

3.1 成员内部类

public class OuterClass {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

//这里在外部类里面定义了一个成员内部类(普通内部类)
class InnerClass { public InnerClass() { name = "Jacike CHAN";//内部类可以使用外部类的属性和方法 age = 66; } public void display() { System.out.println("姓名:" + getName());//调用外部类的getName()方法 System.out.println("年龄:" + getAge());//调用外部类的getAge()方法 } } public static void main(String[] args) { OuterClass outer = new OuterClass(); InnerClass inner = outer.new InnerClass();//创建内部类对象 inner.display(); } }

创建成员内部类对象的注意点:

不能直接new一个成员内部类对象,需要先常见外部类对象,再用外部对对象.new InnerClass()的方式去创建普通内部类对象

OuterClass outer = new OuterClass();
InnerClass inner = outer.new InnerClass();

3.2 局部内部类:

import com.sun.org.apache.bcel.internal.classfile.InnerClass;
import javafx.scene.effect.InnerShadow;

public class OuterClass {
    public int ofield1 = 1;
    protected int ofield2 = 2;
    int ofield3 = 3;
    private int ofield4 = 4;

    public OuterClass() {
        System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象.");
    }

    private void outerTest() {
        class A {
            public A() {
                System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象.");
                System.out.println("其外部类的fied1字段值为:" + ofield1);
                System.out.println("其外部类的fied2字段值为:" + ofield2);
                System.out.println("其外部类的fied3字段值为:" + ofield3);
                System.out.println("其外部类的fied4字段值为:" + ofield4);
            }
        }

        A a = new A();

        {
            class B {
                public B() {
                    System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象.");
                    System.out.println("其外部类的fied1字段值为:" + ofield1);
                    System.out.println("其外部类的fied2字段值为:" + ofield2);
                    System.out.println("其外部类的fied3字段值为:" + ofield3);
                    System.out.println("其外部类的fied4字段值为:" + ofield4);
                }
            }
            B b = new B();
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.outerTest();
    }
}

结果:

在外部类里面创建OuterClass类对象.
在外部类里面创建A类对象.
其外部类的fied1字段值为:1
其外部类的fied2字段值为:2
其外部类的fied3字段值为:3
其外部类的fied4字段值为:4
在外部类里面创建B类对象.
其外部类的fied1字段值为:1
其外部类的fied2字段值为:2
其外部类的fied3字段值为:3
其外部类的fied4字段值为:4

3.3静态内部类:

public class OuterClass {
    public int field10 = 10;

    public OuterClass() {
        System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象.");

        InnerClass inner = new InnerClass();
        System.out.println("静态内部类fied1字段值为:" + inner.field1);
        System.out.println("静态内部类fied2字段值为:" + inner.field2);
        System.out.println("静态内部类fied3字段值为:" + inner.field3);
        System.out.println("静态内部类fied4字段值为:" + inner.field4);
        System.out.println("静态内部类fied5字段值为:" + InnerClass.filed5);
    }

    static class InnerClass {
        public int field1 = 1;
        protected int field2 = 2;
        int field3 = 3;
        private int field4 = 4;
        static int filed5 = 5;

        public InnerClass() {
            System.out.println("在静态内部类里面创建" + this.getClass().getSimpleName() + "类对象.");
            //   System.out.println("在静态内部类调用外部类的fied10字段值为:" + field10);
        }

    }

    public static void main(String[] args) {
        //可以通过外部类.内部类的方式创建静态内部类对象
        OuterClass.InnerClass in = new OuterClass.InnerClass();

        //也可以直接创建静态内部类对象
        InnerClass inner = new InnerClass();
        OuterClass out = new OuterClass();
    }
}

结果:

在静态内部类里面创建InnerClass类对象.
在静态内部类里面创建InnerClass类对象.
在外部类里面创建OuterClass类对象.
在静态内部类里面创建InnerClass类对象.
静态内部类fied1字段值为:1
静态内部类fied2字段值为:2
静态内部类fied3字段值为:3
静态内部类fied4字段值为:4
静态内部类fied5字段值为:5

3.4匿名内部类:

匿名内部类在多线程和java图形化界面编程时用的比较多。

它后来进化成了lambeda表达式

public class OuterClass {
    public int field1 = 1;
    protected int field2 = 2;
    int field3 = 3;
    private int field4 = 4;
    static int filed5 = 5;

    public OuterClass() {
        System.out.println("这是外部内的构造方法--创建对象:" + this.getClass().getSimpleName());
    }


    interface ITest {
        void test();
    }

    public void anonymousTest() {
        ITest it = new ITest() {
            @Override
            public void test() {
                System.out.println("我在匿名内部类里面");
                System.out.println("这是匿名内部类的对象:" + this.getClass());
                System.out.println("其外部类的 field1 字段的值为: " + field1);
                System.out.println("其外部类的 field2 字段的值为: " + field2);
                System.out.println("其外部类的 field3 字段的值为: " + field3);
                System.out.println("其外部类的 field4 字段的值为: " + field4);
                System.out.println("其外部类的 field5 字段的值为: " + filed5);
            }
        };
        it.test();
    }

    public static void main(String[] args) {
        OuterClass out = new OuterClass();
        out.anonymousTest();
    }
}

结果:

这是外部内的构造方法--创建对象:OuterClass
我在匿名内部类里面
这是匿名内部类的对象:class OuterClass$1
其外部类的 field1 字段的值为: 1
其外部类的 field2 字段的值为: 2
其外部类的 field3 字段的值为: 3
其外部类的 field4 字段的值为: 4
其外部类的 field5 字段的值为: 5

参考资料:

Oracle官方文档--匿名内部的语法结构

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

其它很有用的参考:

这个例子容易理解

https://blog.csdn.net/hacker_zhidian/article/details/82193100

详细的帖子

https://www.cnblogs.com/chenssy/p/3388487.html

后记:

2020年3月8日 星期日 上海 晴转多云 气温 13度,比较冷。

原文地址:https://www.cnblogs.com/majestyking/p/12443756.html