打字猴:1.70044146e+09
1700441460
1700441461 提高代码的可读性。相关联的代码放在一起,可读性当然提高了。
1700441462
1700441463 形似内部,神似外部。静态内部类虽然存在于外部类内,而且编译后的类文件名也包含外部类(格式是:外部类+$+内部类),但是它可以脱离外部类存在,也就是说我们仍然可以通过new Home()声明一个Home对象,只是需要导入“Person.Home”而已。
1700441464
1700441465 解释了这么多,读者可能会觉得外部类和静态内部类之间是组合关系(Composition)了,这是错误的,外部类和静态内部类之间有强关联关系,这仅仅表现在“字面”上,而深层次的抽象意义则依赖于类的设计。
1700441466
1700441467 那静态内部类与普通内部类有什么区别呢?问得好,区别如下:
1700441468
1700441469 (1)静态内部类不持有外部类的引用
1700441470
1700441471 在普通内部类中,我们可以直接访问外部类的属性、方法,即使是private类型也可以访问,这是因为内部类持有一个外部类的引用,可以自由访问。而静态内部类,则只可以访问外部类的静态方法和静态属性(如果是private权限也能访问,这是由其代码位置所决定的),其他则不能访问。
1700441472
1700441473 (2)静态内部类不依赖外部类
1700441474
1700441475 普通内部类与外部类之间是相互依赖的关系,内部类实例不能脱离外部类实例,也就是说它们会同生同死,一起声明,一起被垃圾回收器回收。而静态内部类是可以独立存在的,即使外部类消亡了,静态内部类还是可以存在的。
1700441476
1700441477 (3)普通内部类不能声明static的方法和变量
1700441478
1700441479 普通内部类不能声明static的方法和变量,注意这里说的是变量,常量(也就是final static修饰的属性)还是可以的,而静态内部类形似外部类,没有任何限制。
1700441480
1700441481
1700441482
1700441483
1700441484 编写高质量代码:改善Java程序的151个建议 [:1700438108]
1700441485 编写高质量代码:改善Java程序的151个建议 建议39:使用匿名类的构造函数
1700441486
1700441487 阅读如下代码,看看是否可以编译:
1700441488
1700441489 public static void main(String[]args){
1700441490
1700441491 List l1=new ArrayList();
1700441492
1700441493 List l2=new ArrayList(){};
1700441494
1700441495 List l3=new ArrayList(){{}};
1700441496
1700441497 System.out.println(l1.getClass()==l2.getClass());
1700441498
1700441499 System.out.println(l2.getClass()==l3.getClass());
1700441500
1700441501 System.out.println(l1.getClass()==l3.getClass());
1700441502
1700441503 }
1700441504
1700441505 注意ArrayList后面的不同点:l1变量后面什么都没有,l2后面有一对{},l3后面有2对嵌套的{},这段程序能不能编译呢?若能编译,那输出是多少呢?
1700441506
1700441507 答案是能编译,输出的是3个false。l1很容易解释,就是声明了ArrayList的实例对象,那l2和l3代表的是什么呢?
1700441508
1700441509 (1)l2=new ArrayList(){}
[ 上一页 ]  [ :1.70044146e+09 ]  [ 下一页 ]