Java之内部类

初次接触内部类时,由于它特殊的语法规则而产生反感,这玩意怎么不按套路出牌?后来直到学了建造者模式,使用到了静态内部类后,才改变了这种看法,今天恰好在读书的时候读到了内部类的章节,索性总结一下心得体会,以免日后忘记。

书中对内部类的定义是:定义在另一个类中的类。

对于内部类存在的意义也给出了三点解释:

内部类可以访问外部类的变量。

内部类可以对同包中其他类隐藏。

匿名内部类可以简化回调函数的代码。

 

那么内部类是如何做到引用外部类的成员变量的呢?既没有使用外部类的实例对象,也没有使用外部类的类名调用静态变量,却可以直接使用外部类的成员变量。对于这一点,书中给出的解释是隐式引用,这个隐式引用指向了外部类的对象。编译器修改了所有内部类的构造器,添加了外部类引用参数,当内部类创建的时候,会将外部类的引用传进去,而这一切都是隐式的。

 

内部类访问外部类变量以及在外部类之外创建内部类实例:

public class OutClass {

    private Integer id = 2;

    public class InnerClass {
        public void write() {
            System.out.println(id);//内部类访问外部类变量写法1
            System.out.println(OutClass.this.id);//内部类访问外部类变量写法2
        }
    }
}

class Test {
    public static void main(String[] args) {
        OutClass.InnerClass innerClass = new OutClass().new InnerClass();//在外部类之外创建内部类实例对象
        innerClass.write();
    }
}

 

局部内部类

局部内部类是定义在方法中的内部类,它的作用域被限定在方法内,即便是外部类中其他的位置也无法访问局部内部类。局部内部类不仅可以对外部完全隐藏,还可以访问局部变量,但前提是局部变量必须由final修饰,然后在书中的示例代码中发现原来final关键字还可以用来修饰形参。

匿名内部类,形式上看上去貌似和匿名类没什么区别,只是将其放入了另一个类中。

静态内部类,没有对外部类对象的引用。

 

posted @ 2020-10-23 10:42  无心大魔王  阅读(86)  评论(0编辑  收藏  举报