天天看点

使用静态内部类提高封装性

转载来自:http://blog.csdn.net/chenzhiqin20/article/details/10458747

java中的嵌套类(nested class)分为两种:静态内部类(也叫静态嵌套类,static nested class)和内部类(inner class)。内部类我们介绍过很多了,现在来看看静态内部类。什么是静态内部类呢?是内部类,并且是静态(static修饰)的即为静态内部类。只有在是静态内部类的情况下才能把static修复符放在类前,其他任何时候static都是不能修饰类的。

静态内部类的形式很好理解,但是为什么需要静态内部类呢?那是因为静态内部类有两个优点:加强了类的封装性和提高了代码的可读性,我们通过一段代码来解释这两个优点,如下所示:

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方法省略 */  

其中,person类中定义了一个静态内部类home,它表示的意思是“人的家庭信息”,由于home类封装了家庭信息,不用在person类中再定义homeaddre、hometel等属性,这就使封装性提高了。同时我们仅仅通过代码就可以分析出person和home之间的强关联关系,也就是说语义增强了,可读性提高了。所以在使用时就会非常清楚它要表达的含义:

public static void main(string[] args) {  

     //定义张三这个人  

     person p = new person("张三");  

     //设置张三的家庭信息  

     p.sethome(new person.home("上海","021"));  

定义张三这个人,然后通过person.home类设置张三的家庭信息,这是不是就和我们真实世界的情形相同了?先登记人的主要信息,然后登记人员的分类信息。可能你又要问了,这和我们一般定义的类有什么区别呢?又有什么吸引人的地方呢?如下所示:

提高封装性。从代码位置上来讲,静态内部类放置在外部类内,其代码层意义就是:静态内部类是外部类的子行为或子属性,两者直接保持着一定的关系,比如在我们的例子中,看到home类就知道它是person的home信息。

提高代码的可读性。相关联的代码放在一起,可读性当然提高了。

形似内部,神似外部。静态内部类虽然存在于外部类内,而且编译后的类文件名也包含外部类(格式是:外部类+$+内部类),但是它可以脱离外部类存在,也就是说我们仍然可以通过new home()声明一个home对象,只是需要导入“person.home”而已。

解释了这么多,读者可能会觉得外部类和静态内部类之间是组合关系(composition)了,这是错误的,外部类和静态内部类之间有强关联关系,这仅仅表现在“字面”上,而深层次的抽象意义则依赖于类的设计。

那静态内部类与普通内部类有什么区别呢?问得好,区别如下:

(1)静态内部类不持有外部类的引用

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

(2)静态内部类不依赖外部类

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

(3)普通内部类不能声明static的方法和变量

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