课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java构造代码块会想你所想
  • java构造代码块会想你所想

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-30

  • 上一昆明Java培训机构的老师的建议中我们提议使用构造代码块来简化代码,并且也了解到编译器会自动把构造代码块插入到各个构造函数中,那我们接下来看看,编译器是不是足够聪明,能为我们解决真实的开发问题,有这样 个案例,统计一个类的实例变量数。你可要说了,这很简单,在每个构造函数中加入一个对象计数器补救解决了嘛?或者我们使用上一建议介绍的,使用构造代码块也可以,确实如此,我们来看如下代码是否可行:

    1 public class Client37 {

    2    public static void main(String[] args) {

    3        new Student();

    4        new Student("张三");

    5        new Student(10);

    6        System.out.println("实例对象数量:"+Student.getNumOfObjects());

    7    }

    8 }

    9

    10 class Student {

    11    //对象计数器

    12    private static int numOfObjects = 0;

    13

    14    {

    15        //构造代码块,计算产生的对象数量

    16        numOfObjects++;

    17    }

    18

    19    public Student() {

    20

    21    }

    22

    23    //有参构造调用无参构造

    24    public Student(String stuName) {

    25        this();

    26    }

    27

    28    //有参构造不调用无参构造

    29    public Student(int stuAge) {

    30

    31    }

    32    //返回在一个JVM中,创建了多少实例对象

    33    public static int getNumOfObjects(){

    34        return numOfObjects;

    35    }

    36 }

    这段代码可行吗?能计算出实例对象的数量吗?如果编译器把构造代码块插入到各个构造函数中,那带有String形参的构造函数就可能有问题,它会调用无参构造,那通过它生成的Student对象就会执行两次构造代码块:一次是无参 造函数调用构造代码块,一次是执行自身的构造代码块,这样的话计算就不准确了,main函数实际在内存中产生了3个对象,但结果确是4。不过真的是这样吗?我们运行之后,结果是:

    实例对象数量:3;

    实例对象的数量还是3,程序没有问题,奇怪吗?不奇怪,上一建议是说编译器会把构造代码块插入到每一个构造函数中,但是有一个例外的情况没有说明:如果遇到this关键字(也就是构造函数调用自身的其它构造函数时),则不 入构造代码块,对于我们的例子来说,编译器在编译时发现String形参的构造函数调用了无参构造,于是放弃插入构造代码块,所以只执行了一次构造代码块。

    那Java编译器为何如此聪明?这还要从构造代码块的诞生说起,构造代码块是为了提取构造函数的共同量,减少各个构造函数的代码产生的,因此,Java就很聪明的认为把代码插入到this方法的构造函数中即可,而调用其它的构造 数则不插入,确保每个构造函数只执行一次构造代码块。

    还有一点需要说明,大家千万不要以为this是特殊情况,那super也会类似处理了,其实不会,在构造块的处理上,super方法没有任何特殊的地方,编译器只把构造代码块插入到super方法之后执行而已。仅此不同。

    昆明Java培训机构的老师提醒大家注意:放心的使用构造代码块吧,Java已经想你所想了。

    推荐文章

上一篇:使用构造代码块精简程序

下一篇:使用静态内部类提高封装性

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56