Java内部类详解

一般情况下,类和类之间是谁相互独立的,内部类的意思是打破这种独立,让一个类成为另一个类的内部成员,和成员变量、成员方法同等级别。

为什么要使用内部类?采用内部类这种技术,可以隐藏细节和内部结构,封装性更好,让程序的构造更加合理。

1、成员内部类

成员内部类的作用就是讲内部类当做外部类的一个成员变量/成员方法来使用,所以必须依赖于外部类的 对象才能调用,用法和成员变量/方法是一致的。

public class OuterClass {
    //成员变量
    private String outerName;

    //成员方法
    public void display() {
        System.out.println("OuterClass display");
    }

    //成员内部类
    public class InnerClass {
        //成员变量
        private String innerName;

        //成员方法
        public void display() {
            System.out.println("InnerClass display");
        }
    }

    public static void main(String[] args) {
        //实例化外部类
        OuterClass outerClass = new OuterClass();
        outerClass.display();

        //实例化非静态内部类需要外部类的实例
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.display();
    }
}

成员内部类可以直接访问外部类中的所有成员。但外部类如果要访问成员内部类的成员需要通过实例来取。

2、局部内部类

局部内部类只能在局部作用域内使用,作用域外无法访问。

public class OuterClass {
    //成员变量
    private String outerName;

    //成员方法
    public void display() {
        System.out.println("OuterClass display");

        //局部内部类
        class InnerClass {
            //成员变量
            private String innerName;

            //成员方法
            public void display() {
                System.out.println("InnerClass display");
            }
        }
        //局部内部类只能在局部作用域内使用,作用域外无法访问。
        InnerClass innerClass = new InnerClass();
        innerClass.display();
    }

    public static void main(String[] args) {
        //实例化外部类
        OuterClass outerClass = new OuterClass();
        outerClass.display();
    }
}

局部内部类只能访问作用域中加final关键字的成。

2、静态内部类

静态内部类的构造不需要依赖外部类的对象,类中的所有静态组件都不需要依赖任何对象,可以直接通过类本身进行构造。

public class OuterClass {
    //成员变量
    private String outerName;

    //成员方法
    public void display() {
        System.out.println("OuterClass display");
    }

    //静态内部类
    public static class InnerClass {
        //成员变量
        private String innerName;

        //成员方法
        public void display() {
            System.out.println("InnerClass display");
        }
    }

    public static void main(String[] args) {
        //实例化外部类
        OuterClass outerClass = new OuterClass();
        outerClass.display();

        //实例化静态内部类
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        innerClass.display();
    }
}

3、匿名内部类

不需要单独穿件距离的类文件进行实现接口的方法,使接口执行方法内容直接在当前类展示。

/**
 * 接口
 */
public interface MyInterface {
    void display();
}
/**
 * 接口实现类
 */
public class MyImplement implements MyInterface {
    @Override
    public void display() {
        System.out.println("display");
    }
}
public class OuterClass {

    public static void main(String[] args) {
        //普通实现类
        MyInterface myInterface = new MyImplement();
        myInterface.display();

        //匿名内部类
        MyInterface myInterface1 = new MyInterface() {
            @Override
            public void display() {
                System.out.println("display");
            }
        };
        myInterface1.display();

        //lambda表达式
        MyInterface myInterface2 = () -> System.out.println("display");
        myInterface2.display();
    }
}

posted @ 2022-01-15 15:33  巫鸦  阅读(346)  评论(0编辑  收藏  举报