一、什么是内部类?

  Java 中运行将一个类定义在另一个类中,里面的称为内部类,内部类分为四种:成员内部类、静态内部类、局部内部类、匿名内部类。

/**
 * 外部类
 */
public class Outer {
    /**
     * 内部类
     */
    class Inner {
    }
}

二、为什么要用内部类?

  因为 Java 不支持多继承,当我们想继承多个类或者实现多个抽象类的时候,不得不借助于内部类来继承多个类。内部类都能独立地继承一个类或实现接口,所以无论外围类是否已经继承了某个接口的实现,对于内部类都没有影响。

三、内部类的应用

1.成员内部类

  成员内部类是最普通的内部类,它的定义为位于另一个类的内部。需要注意的是, 当成员内部类拥有和外部类同名的成员变量或这方法时, 默认情况下访问的是内部类的成员, 如要访问外部类的同名成员, 需要使用以下形式:

外部类.this.成员变量  
外部类.this.成员方法

  内部类是依附外部类而存在的, 也就是说要创建成员内部类的对象,前提是创建一个外部类的对象,创建成员内部类的方式如下:

new 外部类().new 内部类();

  例如:

class Outer {
    private String domainName = "zyxwmj.top";
    static String name = "Yi-Xing";

    public void getValue() {
        // 内部类的private成员变量
        System.out.println("内部类的domainName:" + new Inner().domainName);
    }

    class Inner {
        private String domainName = "emmm";
        // static String name="Yi-Xing"; 不能定义静态方法和静态成员变量
        public void getValue() {
            System.out.println("内部类的domainName:" + domainName);
            // 外部类的private成员变量
            System.out.println("外部类的domainName:" + Outer.this.domainName);
            // 外部类的静态成员变量
            System.out.println("外部类的name:" + name);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.getValue();
        Outer.Inner inner = outer.new Inner();
        inner.getValue();
    }
}

2.匿名内部类

  匿名内部类应该是我们平常使用最多的了,可以减少代码量。
  语法:

[类名 变量名=]new 接口或父类名{

}[.方法名()];

  例如:如果在 Outer 类中创建继承 Outer 类的匿名内部类,则会抛出java.lang.StackOverflowError异常,堆栈溢出。

class Outer {
    private Test inner = new Test() {
        @Override
        public void value() {
            System.out.println("我的名字是:Yi-Xing");
        }
    };

    public void value() {
        System.out.println("我的域名是:zyxwmj.top");
        inner.value();
        new Test() {
            @Override
            public void value() {
                System.out.println("我的年龄是:18岁");
            }
        }.value();
    }
}

public class Test {
    public void value() {
    }

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

3.静态内部类

  静态内部类也是定义在另一个类里面的类,只不过在类前加上了 static。静态内部类是不需要依赖于外部类的,与静态成员变量类似。
  例如:

class Outer {
    String domainName = "zyxwmj.top";
    static String name = "Yi-Xing";

    public static void getValue() {
        // 内部类的private成员变量
        System.out.println("内部类的domainName:" + new Inner().domainName);
        // 内部类的static成员变量
        System.out.println("内部类的name:" + Inner.name);
    }

    static class Inner {
        private String domainName = "emmm";
        static String name = "Yi-Xing";
        // static String name="Yi-Xing"; 不能定义静态方法和静态成员变量
        public void getValue() {
            System.out.println("内部类的domainName:" + domainName);
            // 不能访问外部类的非static的成员变量
            // System.out.println("外部类的domainName:" + Outer.this.domainName);
            // 外部类的静态成员变量
            System.out.println("外部类的name:" + Outer.name);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Outer.getValue();
        Outer.Inner inner = new Outer.Inner();
        inner.getValue();
    }
}

4.局部内部类

  局部内部类是定义在一个方法或作用域中的类,它的访问权限仅限于方法内或作用域内。
  我们是无法在外部去创建局部内部类的实例对象的,因为局部内部类是定义在方法中的,而方法是需要所在类的对象去调用。
  局部内部类如果要去访问局部变量,那么局部变量必须声明为 final 类型。
  局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的。
  例如:

class Outer {
    private String domainName = "zyxwmj.top";
    static String name = "Yi-Xing";

    public void getInner() {
        // 如果想让局部内部类访问局部变量必须用final声明
        final String value="我是局部变量";

        class Inner {
            private String domainName = "emmm";
            // static String name="Yi-Xing"; 不能定义静态方法和静态成员变量
            public void getValue() {
                System.out.println("内部类的domainName:" + domainName);
                // 外部类的private成员变量
                System.out.println("外部类的domainName:" + Outer.this.domainName);
                // 外部类的静态成员变量
                System.out.println("外部类的name:" + name);
                System.out.println("局部变量的value:" + value);
            }
        }
        Inner inner=new Inner();
        inner.getValue();
    }
}

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

标题:Java中的内部类
作者:Yi-Xing
地址:http://47.94.239.232/articles/2019/10/24/1571926812469.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!