一, 课堂练习
(一)构造方法
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());
}
}
}
(二), 运行结果