关于Java的静态内部类

来源:互联网 发布:淘宝2017双十一成交额 编辑:程序博客网 时间:2024/05/22 04:44

前言

  看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提高篇(八)—-详解内部类:例举了都有什么样的内部类可以使用

0 0
原创粉丝点击