JAVA作业02

一,      课堂练习

(一)构造方法

1,源代码

public class Test{

         public static void main(String[] args){

                  Foo obj1=new Foo();

         }

}

class Foo{

         int value;

         public Foo(int initValue){

                  value=initValue;

         }

}

2,运行结果

3,结果分析

如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

(二)JAVA字段初始化

1,源代码

 

public class InitializeBlockDemo {

         public static void main(String[] args) {

                 

                  InitializeBlockClass obj=new InitializeBlockClass();

                  System.out.println(obj.field);

                 

                  obj=new InitializeBlockClass(300);

                  System.out.println(obj.field);

         }

 

}

 

class InitializeBlockClass{

         {

             field=200;

         }

         public int field=100;

         public InitializeBlockClass(int value){

                  this.field=value;

         }

         public InitializeBlockClass(){

                 

         }

}

2,运行结果

 

3,结果分析

关与java字段初始化问题 ,无继承情况:初始化块第一个执行,字段初始值设置代码第二个执行,构造函数第三个执行。

(三)有继承情况时的初始化问题

1,源代码

class B{

 public B() {

  System.out.println("父类  构造函数第四个执行");

 }

 {

  System.out.println("父类  动态代码块第三个执行");

 }

 static {

  System.out.println("父类   静态块第一个执行");

 }

}

public class A extends B{

 public A() {

  System.out.println("子类   构造函数第六个执行");

 }

 {

  System.out.println("子类   动态代码块第五个执行");

 }

 static {

  System.out.println("子类   静态块第二个执行");

 }

 public static void main(String[] args) {

  new A();

 }

}

2运行结果

 

3结果分析

父类静态块第一个执行,子类静态块第二个执行,父类初始值代码第三个执行,父类构造函数第四个执行,子类动态初始化块第五个执行,子类构造函数第六个执行。

当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

(四)运行结果:

总结分析:

对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

二,      课后作业

请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象

(一)源代码:

public class Test {
               private int id;
               private String name;
               private static long count;
               private final static ThreadLocal tl=new ThreadLocal();

               public Test() {
                               super();
                               count++;
                               tl.set(count);
               }
               public long getCount(){
                               return (Long)tl.get();
               }
               public static void main(String[] args) {
                               for (int i = 0; i < 5; i++) {
                                              Test t=new Test();
                                              System.out.println(t.getCount());
                               }
               }
              
}

(二), 运行结果

 

posted @ 2015-10-17 10:23  张晓晨  阅读(187)  评论(0编辑  收藏  举报

作者: 张晓晨

出处: https://www.cnblogs.com/420Rock/>

关于作者:专注java与大数据领域,请多多赐教!

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(zhangxiaochen643@sina.com)咨询.