建民老师有关类和对象动手动脑的实践性报告
有关动手动脑的实验性总结
1.P29 首先定义了一个类Foo,在这个类中包含数据成员value以及有参构造函数Foo( int initValue );
在Test类中用Foo类的无参构造方法去创建一个实例化对象,发现编译出错了,原因如下:
首先我们要知道,一切类的超类是Object,而object这个类中只有无参构造方法,其他任何一个类都直接或间接继承了这个类,在创建对象
的时候,会首先调用object类的无参构造方法,所以在一个类中,要不然不写构造方法,要不然无参和有参都写上,只写有参不写无参是不行的。
2.P34进行试验
首先经过测试发现,当使用无参构造方法去实例化一个对象的时候,我们发现filed的值为200,即初始化块里面的赋值操作
但是当把赋值语句和初始化块颠倒之后,发现filed的值为100;
当使用有参构造方法去实例化对象时,这个时候filed的值为我们自己传进去的值。
总结:优先选择有参构造方法,默认值和初始化块看谁在下面,就使用谁的值。
3.P39动手动脑 运行TestStaticInitializeBlock.java
首先先执行static修饰的静态初始化块,原因如下:
使用 static 修饰符定义的初始化块,称为静态初始化块,也叫类初始化块。
普通初始化块是对 对象 初始化, 类初始化块是对类初始化。
因此静态初始化块总是比普通初始化块先执行。
分析这个案例程序:首先是爷爷类(基类)Root,然后是爸爸类(Root的子类)Mid,最后是孩子类(Mid的子类)Leaf
在主方法中,new了一个Leaf的对象,我们知道先执行静态初始化块,并且是按辈分一个一个执行。
所以执行了Root、Mid、Leaf的静态初始化块,执行完静态就执行普通的初始化块,对于同一个类对象来讲,先执行初始化块,后执行构造方法。
所以接着又执行了Root的普通初始化块、无参数构造器,接着是Mid的普通初始化块、无参数构造器。
这个时候注意了,在Leaf中调用了super,也就是Mid的有参构造方法,所以再执行Mid的带参构造器,
注意,到这里我已经执行完了所有父类的构造方法之后,再执行Leaf的构造方法,但是在执行构造方法之前,先执行了Leaf的普通初始化块,即执行完之后在执行构造方法。
最后执行Leaf的初始化块和构造器。
4.P42 一个有趣的问题
答案:可以把静态方法的参数变成类的实例化对象,或者在静态方法中定义一个实例化对象,再通过实例化对象,访问非静态成员。
public class test_01
{
public int sb = 0;
public static int sb1 = 0;
public static void method(test_01 a){
System.out.println(a.sb);
}
public static void main(String[] args)
{
test_01 sba = new test_01();
test_01.method(sba);
}
}
//一个非常非常简单的实现。