天天看点

内部类 - Java

文章目录

  • ​​一、内部类的多种形式​​
  • ​​二、成员内部类​​
  • ​​三、局部内部类​​
  • ​​四、匿名内部类​​
  • ​​五、内部类的调用方式总结​​

一、内部类的多种形式

  • 静态内部类, ​

    ​static class StaticInnerClass{ };​

  • 成员内部类, ​

    ​private class InstanceInnerClass{ };​

  • 局部内部类, 定义在方法或表达式内部
  • 匿名内部类, ​

    ​(new Thread() { }).start​

package top.clearlight.book.efficientcode.insideclass;

public class InnerClassTest1 {

    // 成员内部类
    private class InstanceInnerClass {

    }

    // 静态内部类
    static class StaticInnerClass {

    }

    static int a = 1;

    public static void main(String[] args) {
        // 两个匿名内部类
        (new Thread() {}).start();
        (new Thread() {}).start();

        // 两个方法内部类
        class MethodClass {
        }
        class MethodClass2 {
        }
    }
}      
源出处 : < Easy Coding >

二、成员内部类

将一个类直接定义在类的里面, 作为类中成员, 与属性或方法层次一致
  1. 内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域(包括私有的)
  2. 正常类的修饰符可以为​

    ​public或default​

    ​, 成员内部类可以使用不同的修饰符来修饰.
  3. 内部类与外部类出现相同的变量名,想要引用外部类的域 -> ​

    ​外部类.this.外部成员​

    ​​. (其中 ​

    ​OuterClass.this​

    ​表示外围类的引用
  4. 内部类中声明的所有静态域必须用​

    ​final​

    ​修饰.
  5. 内部类不能有static方法
  6. 源码进行编译后,产生一个字节码:​

    ​外部类$内部类.class​

三、局部内部类

将一个类定义在方法/块里面,作为方法的内部结构,与临时的局部变量一个层次
  1. 局部类不能用public或private访问符声明.只能用abstract或final修饰.
  2. 局部类可以对外部完全隐藏,只有方法之外的代码,都不能访问它. 因此需要在内部类里面完成对象的定义和引用.
  3. 局部内部类访问外部类的成员使用 : ​

    ​外部类名.this.成员名​

    ​.
  4. 从内部类引用本地变量必须用​

    ​final​

    ​修饰或者实际上的最终变量. 内部类访问的局部变量必须事实上为final,一旦赋值就绝对不会改变!
public void testDemo() {
        System.out.println("这是外部类中的方法");
        int b = 1;
        // 定义一个局部内部类
        class LocalClass {
            private String name;
            int aa = 1;
            public void test1() {
                aa++;
                // 报错,因为调用的本地变量jdk8默认添加了final修饰符不可变
                // b++;
            }
            public void test() {
                System.out.println(InnerClassTest.this.name);
            }
        }
        LocalClass lc = new LocalClass();
        lc.test();
        lc.test1();
    }      
public void testDemo() {
        System.out.println("这是外部类中的方法");
        int b = 1;
        System.out.println(++b); // 此处做了自增,因此变量b不会默认添加final修饰符
        // 定义一个局部内部类
        class LocalClass {
            private String name;
            int aa = 1;
            public void test1() {
                aa++;
             
                System.out.println(b); // 报错, 因为局部内部类访问方法内的变量,需要使用final修饰.
            }
        }

        LocalClass lc = new LocalClass();
        lc.test1();
        System.out.println(lc.aa);
    }      
内部类 - Java

四、匿名内部类

  1. 格式 : new 抽象类|接口(构造参数) {

       实现的抽象方法 或 重写方法;

    };

  2. 如果抽象类被使用一次,可以使用匿名内部类创建该类实例实现抽象方法,但是多次使用,建议重新定义类!
  3. 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
  4. 匿名内部类中是不能定义构造函数的。
  5. 匿名内部类中不能存在任何的静态成员变量和静态方法。
  6. 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
  7. 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

3 - 7 引用优秀博客第二篇

五、内部类的调用方式总结