热闹热闹,给大家送分:
凡进者均有分,直到分分完。
思考下例(请不要用工具运行后再回答):
public class TestInitial {
private int x=1;//数据成员初始化
{//对象初始化块
x=2;
}
public TestInitial()//这是构造器
{
this(x);//若你认为:先做对象初始化块,再做构造器。那么问:此处的实参x的值是什么?
}
public TestInitial(int y)
{}
}若你认为:先做对象初始化块,再做构造器。那么问:上述的实参x的值是什么?
选择:
A:x值是2
B:x值是1
C:x值是0
D: 根本不行,编译出错。你选哪一个?
凡进者均有分,直到分分完。
思考下例(请不要用工具运行后再回答):
public class TestInitial {
private int x=1;//数据成员初始化
{//对象初始化块
x=2;
}
public TestInitial()//这是构造器
{
this(x);//若你认为:先做对象初始化块,再做构造器。那么问:此处的实参x的值是什么?
}
public TestInitial(int y)
{}
}若你认为:先做对象初始化块,再做构造器。那么问:上述的实参x的值是什么?
选择:
A:x值是2
B:x值是1
C:x值是0
D: 根本不行,编译出错。你选哪一个?
this(x);//因为this(...)这么调用其他的构造方法的这个代码,必须出现在构造方法的第一行,书上是有的!有这样的说话,最后执行构造方法内部代码,但是
public TestInitial()//实例化的时候首先进来这里,之后第一行有this(..)代码,就会执行这代码,假如没有,从块代码和成员变量实例化.假如没有这this(..)代码就会直接执行块代码和成员变量实例化!都这写结束了,回到构造方法的第一行代码之处(假如没有this(..)代码)或者第二行代码之处,继续执行期于的操作! {
this(x);//所以说,初始化的时候不是不进来这个方法块,而是说近来之后先判断有没有this(..)这个代码!
} 纯属个人理解!
//写的很清楚了
public class TestInitial {
static private int x=1; //第四步
{
x=2; //第五步
}
public TestInitial() //第二步
{
this(x);//第三步
System.out.println("TestInitial()");//第七步
}
public TestInitial(int y) //第三步
{
System.out.println("TestInitial(int y)");//第六步
}
public static void main(String[] args) {
new TestInitial();//第一步
}
}
//有重复的编号了...不好意思public class TestInitial {
static private int x=1; //第五步
{
x=2; //第六步
}
public TestInitial() //第二步
{
this(x);//第三步
System.out.println("TestInitial()");//第八步
}
public TestInitial(int y) //第四步
{
System.out.println("TestInitial(int y)");//第七步
}
public static void main(String[] args) {
new TestInitial();//第一步
}
}
http://topic.csdn.net/u/20080509/11/ad3f755d-9813-4a0c-9271-d4a9006e8476.html
害我又回去复习了一遍
除非你的初始化也是static的,才会在加载该class时就执行.
如果是楼主那样的,答案是D
如果x前加上static,答案是B
如果初始化前面也加上static,答案是A.
{//对象初始化块
x=2;
} ,此时传递的参数X=1会保留下来,执行上面这一段初始化代码,之后再执行this(XX),由于之前参数X=1已经保留下来了 只有在第一个构造函数执行之前,才会去初始化非静态初始化,如果这第一个构造函数有参数,这个参数会放在栈中,之后的修改不会影响栈中的内容。
Cannot refer to an instance field x while explicitly invoking a constructor
public TestInitial()//这是构造器
{
this(x);//若你认为:先做对象初始化块,再做构造器。那么问:此处的实参x的值是什么?
} x并非类变量(非static)不能直接调用。
最先执行的是{}里的语句,且在new 一个新对象的时候都会执行一次
本题main得有static 与题意不符
应该将private的x指定为static的,那样才能在调用构造器之前得到初始化,构造器中的参数才有值,否则就会报错...