黑马程序员技术交流社区
标题:
关于对象的初始化问题
[打印本页]
作者:
我为你着迷
时间:
2014-4-5 11:20
标题:
关于对象的初始化问题
class Person
{
private String name="haha";
private int age;
private static String country ="cn";
Person(String name, int age)
{
this.name=name;
this.age=age;
}
{
System.out.println(name+".."+age);
}
public void setName(String name)
{
this.name=name;
}
public void speak()
{
System.out.println(this.name+"..."+this.age);
}
public static void showCountry()
{
System.out.println("country="+country);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p=new Person("zhangsan",20);
}
}
复制代码
大家好! 我想问下为什么打印结果是haha..0呢啊 ? 想不明白了 ! 麻烦大伙帮忙解答下! 跪谢了。
作者:
zhangbingyuan
时间:
2014-4-5 12:59
在你的程序中,13-15行是一个代码块,当建立该类对象时,这个代码块会优先执行。(注意,代码块有好几种,包括毕姥爷讲的静态代码块等,静态代码块的话是不用建立该类对象的,只要调用该类,就会执行静态代码块。这就像不用建立一个类的对象,就可以通过类名调用它的静态方法一样,都是一个道理)。
然后 ,建立Person对象时,代码块优先执行,因为你在Person类中定义并初始化了姓名为“haha”,但是你只是定义了int型的年龄变量,并未对其赋值。这里就要涉及到一个小知识点:定义的int型变量,如果没有对其初始化,那么它的值默认为0。(另外,引用型数据类型的默认初始值为null)。
这样,你就得到了这样的结果。
希望可以帮到你。
作者:
四川男人
时间:
2014-4-5 13:15
这里主要知识点是构造代码块儿的执行顺序。
构造代码块儿
{
System.out.println(name+".."+age);
}的执行顺序是优先于构造函数的:
构造代码块儿是给对象初始化的,即:只要创建一对象,首先运行的代码块儿;
构造函数是给指定对象初始化的;
所以创建Person对象的时候,先运行 System.out.println(name+".."+age); 输出haha。。0;
然后调用带参构造函数,不过只是赋值,没有具体实现,所以没有输出
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2