JAVA内部类

53 阅读3分钟

我们需要先知道什么是内部类,内部类就是指定义在类内部的类,根据定义的类位置和修饰符的不同分为了成员内部类、静态内部类、局部内部类和匿名内部类。

成员内部类

成员内部类使用非常简单,我们只需要在类内部定义一个类,然后定义属性和方法,而且内部类也可以访问外部类的属性和方法,如果想访问内部类,就是要实例化对象,代码:

package com.example.main.test;

public class OuterClass {
    String name;
    public void method(){
        System.out.println("外部类成员方法");
    }
    public static void staticMethod(){
        System.out.println("外部类的静态方法");
    }
    //成员内部类
    class InnerOuterClass{
        private final String name = "张三";
        private void method(){
            System.out.println(name);
            //由于方法名一样,需要调用this关键字。
            OuterClass.this.method();
            staticMethod();
        }
    }

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        //创建内部类的实例化对象就需要用 外部类.new 来创建。
        InnerOuterClass innerOuterClass = outerClass.new InnerOuterClass();
        innerOuterClass.method();
    }
}

静态内部类

静态内部类就更简单了,因为是静态的,它里面的属性和方法必须是静态的,因此他也只能访问外部静态属性和静态方法。

package com.example.main.test;

public class OuterClass {
    String name;
    public void method(){
        System.out.println("外部类成员方法");
    }
    public static void staticMethod(){
        System.out.println("外部类的静态方法");
    }
    //静态内部类
    static class InnerOuterClass{
        private static final String name = "张三";
        private static void method(){
            System.out.println(name);
            staticMethod();
        }
    }

    public static void main(String[] args) {
        //如果该main方法是在其它类中,则可以通过OuterClass.InnerOuterClass.method()来调用即可。
        InnerOuterClass.method();
    }
}

局部类

局部类顾名思义就是在方法内部定义的类,即只有在定义它的方法内部才可以访问它。

package com.example.main.test;

public class OuterClass {
    String name;
    public void method(){
        System.out.println("外部类成员方法");
        //局部类
        class InnerClass{
            //在JDK8.0之前需要给变量添加final属性。
            public void InnerMethod(){
                System.out.println("我是局部类");
            }
        }
        //只有在定义它的方法里面才可以使用,外部无法访问。
        new InnerClass().InnerMethod();
    }
    public static void staticMethod(){
        System.out.println("外部类的静态方法");
    }



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

匿名内部类

匿名内部类就是指没有类名的内部类,当你想要继承或者实现某一个类的时候,并且这个这个内部类只会使用一次,你就可以使用匿名内部类了。

举个例子就明白了,我们学过多线程的知识可以知道,多线程对象类型是Thread,执行方法是start(),我们想要执行的话就可以放入一个Runnable参数的形式放入Thread类的构造方法中,即new Thread(Runnable对象).start。按照以前的逻辑就是先用一个类实现了Runnable接口并重写了里面run()抽象方法,然后实例化这个对象放入到Thread的构造方法中,再用实例化的Thread的对象调用静态方法start()。相当麻烦,但是我们使用匿名内部类就真的很好办了。

package com.example.main.test;

public class OuterClass{
    public static void main(String[] args) {
        //匿名内部类
        new Thread(new Runnable() {
            @Override
            public void run() {
                //里面就是线程的执行逻辑
            }
        });
    }
}

多线程的知识可以看我之前的文章,看不懂也没事,这里主要能理解匿名内部类就可以了。