第四章 类和接口 第24条:静态成员类优于非静态成员类

静态成员类:相比于其他类,它被声明在了一个类内部,能够访问外部类的静态方法及静态变量。私有的静态成员类只在外部类内可访问。
非静态成员类:每个实例都必须与一个外部类实例相关联,可以调用任何外部类实例的方法,可以获取到外部类实例的引用。

一、静态成员类相较于非静态成员类的优势:
1.不依赖外部类的实例,可以单独存在。(内部类不要求访问外部实例,一定要加static)。
2.由于没有和外部类实例关联,可以减少时间空间的开销。非静态内部类由于有关联,会多保存一份指向外部类的引用,导致消耗时间空间的同时。
3.静态成员类没有内存泄漏风险。外部类实例由于存在内部类实例引用,符合垃圾回收却仍会被保留,不处理会导致内存泄漏。
嵌套类需要在多个方法内可见,或类太长了(考虑可读性),使用成员类。当内部类需要外部类实例引用,使用非静态类,否则都使用静态类。使用非静态成员类需要警惕内存泄漏问题。

二、匿名类:
1.使用时才会被声明和实例化,可以出现在任何允许存在表达式的地方。
2.只继承一个父类或实现一个接口
3.不可以有静态变量,只能获取外部作用域的常量
4.定义在非静态作用域内,会引用外部类实例
总的来说匿名类是当需要一个接口的实现或父类的子类实例(只使用一次时)(足够简短)可以使用匿名类。常见使用方法场景是静态工厂。
创建时只有单一方法的接口可以用Lambda转换。

匿名内部类的本质:是一个继承类该类或者实现了该接口的子类匿名对象 

案例一:调用某个方法,方法参数为接口类型,使用匿名内部类

案例二:某个方法的返回值为接口类型,使用匿名内部类解决。

三、局部类:在方法体内定义的类
1.非静态环境下,能获取到外部类的实例,但不能访问当前方法的局部变量(final 修饰过除外)
2.保持简短
当一个类只需要一次使用时,可以做成局部类。有预置类型或行为时考虑匿名类。

posted @ 2023-03-09 10:53  爱喝茶的猫先生  阅读(47)  评论(0)    收藏  举报