打字猴:1.70044138e+09
1700441380
1700441381 非常遗憾,你错了,实例对象的数量还是3,程序没有任何问题。奇怪吗?不奇怪,上一个建议是说编译器会把构造代码块插入到每一个构造函数中,但是有一个例外的情况没有说明:如果遇到this关键字(也就是构造函数调用自身其他的构造函数时)则不插入构造代码块,对于我们的例子来说,编译器在编译时发现String形参的构造函数调用了无参构造,于是放弃插入构造代码块,所以只执行了一次构造代码块—结果就是如此。
1700441382
1700441383 那Java编译器为什么会这么聪明呢?这还要从构造代码块的诞生说起,构造代码块是为了提取构造函数的共同量,减少各个构造函数的代码而产生的,因此,Java就很聪明地认为把代码块插入到没有this方法的构造函数中即可,而调用其他构造函数的则不插入,确保每个构造函数只执行一次构造代码块。
1700441384
1700441385 还有一点需要说明,读者千万不要以为this是特殊情况,那super也会类似处理了。其实不会,在构造代码块的处理上,super方法没有任何特殊的地方,编译器只是把构造代码块插入到super方法之后执行而已,仅此不同。
1700441386
1700441387 注意 放心地使用构造代码块吧,Java已经想你所想了。
1700441388
1700441389
1700441390
1700441391
1700441392 编写高质量代码:改善Java程序的151个建议 [:1700438107]
1700441393 编写高质量代码:改善Java程序的151个建议 建议38:使用静态内部类提高封装性
1700441394
1700441395 Java中的嵌套类(Nested Class)分为两种:静态内部类(也叫静态嵌套类,Static Nested Class)和内部类(Inner Class)。内部类我们介绍过很多了,现在来看看静态内部类。什么是静态内部类呢?是内部类,并且是静态(static修饰)的即为静态内部类。只有在是静态内部类的情况下才能把static修复符放在类前,其他任何时候static都是不能修饰类的。
1700441396
1700441397 静态内部类的形式很好理解,但是为什么需要静态内部类呢?那是因为静态内部类有两个优点:加强了类的封装性和提高了代码的可读性,我们通过一段代码来解释这两个优点,如下所示:
1700441398
1700441399 public class Person{
1700441400
1700441401 //姓名
1700441402
1700441403 private String name;
1700441404
1700441405 //家庭
1700441406
1700441407 private Home home;
1700441408
1700441409 //构造函数设置属性值
1700441410
1700441411 public Person(String_name){
1700441412
1700441413 name=_name;
1700441414
1700441415 }
1700441416
1700441417 /*home、name的getter/setter方法省略*/
1700441418
1700441419 public static class Home{
1700441420
1700441421 //家庭地址
1700441422
1700441423 private String address;
1700441424
1700441425 //家庭电话
1700441426
1700441427 private String tel;
1700441428
1700441429 public Home(String_address, String_tel){
[ 上一页 ]  [ :1.70044138e+09 ]  [ 下一页 ]