关于Java的静态内部类

前言

  看Spring源码和Map的源码时,发现有使用静态内部类。所以想知道静态内部类的特点是什么?在什么情况下使用静态内部类?

正文

在网上找了一上资料,把这次资料中重要的部分总结一下。

问题1:静态内部类的特点是什么?和普通内部类的区别是什么?

(1)静态内部类不持有外部类的引用
在普通内部类中,我们可以直接访问外部类的属性、方法,即使是private类型也可以访问,这是因为内部类持有一个外部类的引用,可以自由访问。而静态内部类,则只可以访问外部类的静态方法和静态属性(如果是private权限也能访问,这是由其代码位置所决定的),其他则不能访问。

(2)静态内部类不依赖外部类
普通内部类与外部类之间是相互依赖的关系,内部类实例不能脱离外部类实例,也就是说它们会同生同死,一起声明,一起被垃圾回收器回收。而静态内部类是可以独立存在的,即使外部类消亡了,静态内部类还是可以存在的。

(3)普通内部类不能声明static的方法和变量
普通内部类不能声明static的方法和变量,注意这里说的是变量,常量(也就是final static修饰的属性)还是可以的,而静态内部类形似外部类,没有任何限制。


问题2:什么情况使用静态内部类

  由于静态内部类不能使用外部类的非静态成员,所以静态内部类的主要工作是:

  • 保存(或说成封装)一些和外部类有关的信息
  • 封装一些和外部类相关的处理

举例:
1, 保存(或说成封装)一些和外部类有关的信息

public class Person{  
     //姓名  
     private String name;  
     //家庭  
     private Home home;  
     //构造函数设置属性值  
     public Person(String _name){  
          name = _name;  
     }  
     /* home、name的getter/setter方法省略 */  

     public static class Home{  
          //家庭地址  
          private String address;  
          //家庭电话  
          private String tel;  

          public Home(String _address,String _tel){  
            address = _address;  
            tel = _tel;  
          }  
          /* address、tel的getter/setter方法省略 */  
     }  
} 


2, 封装一些和外部类相关的处理

public class Outer {
    private String name;
    private int age;

    public static class Builder {
        private String name;
        private int age;

        public Builder(int age) {
            this.age = age;
        }

        public Builder withName(String name) {
            this.name = name;
            return this;
        }

        public Builder withAge(int age) {
            this.age = age;
            return this;
        }

        public Outer build() {
            return new Outer(this);
        }
    }

    private Outer(Builder b) {
        this.age = b.age;
        this.name = b.name;
    }
}


问题3:静态内部类的好处是什么?

  自己想了一想,又看了一些资料,感觉好处就是“提高了可读性”。因为这些静态内部类定义在了其它类的内部,给人的感觉是这个静态内部类的作用一定是和外部类相关的。当然也可以把静态内部类定义在外面,在外部类中引用它,但这样这个静态内部类可用范围就扩大了,潜意识中给人的感觉是“可不可以在其它地方使用它呢”?


问题4:什么时候什么普通内部类,什么时候使用静态内部类呢?

静态内部类和普通内部类的最大的区别就是:

  • 对外部类属性的使用
  • 实例化的方式

例如:你的内部类如果需要访问外部类的属性,那就要使用普通内部类。如果你想主动地限制内部类对外部类属性的访问,那就要使用静态内部类。具体的使用方式还不限定于这些,还是根据你的需求,看哪种类型的类更适合你。


参考文章:(下面这3篇文章都写的非常好,建议读一下)
Java静态类:举例1来自于这篇文章
建议38: 使用静态内部类提高封装性:举例2来自于这篇文章
java提高篇(八)—-详解内部类:例举了都有什么样的内部类可以使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值