A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张盼 中级黑马   /  2014-5-18 13:49  /  1370 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

class Person
{
private String name;     
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);
  p.setName("lisi");
}
}
这段程序的运行顺序是什么,毕老师讲的听着晕,不太明白。

5 个回复

倒序浏览
先执行的方法块,当你传入参数lisi时,没有打印,所以只有一次输出为 null...0
回复 使用道具 举报
就是说类里面这个构造代码块是在调用构造函数之前执行的。。。当然了之前就初始化了里面的常量,所以构造代码块出来的就是null。。。要是有静态代码块的话,就是在类被加载的时候首先执行。。。。。就是这个意思啦
回复 使用道具 举报
当主函数new一个Person时,就会找到Person.class文件,加载Person类,静态方法随着类的加载而加载,所以,先执行public static void showCountry()方法,然后开辟堆内存空间,分配内存地址,并在堆内存中初始化private变量特有属性,再执行构造代码块,执行构造函数,将内存地址赋给类变量p,大体上是这个顺序,如果又不懂的还问我!
回复 使用道具 举报
雨落千木的时节 发表于 2014-5-18 16:13
当主函数new一个Person时,就会找到Person.class文件,加载Person类,静态方法随着类的加载而加载,所以, ...

我有几个问题想问你:
1.在创建一个类的实例对象时,要先把类加载进内存。那么在加载类的时候仅仅是把,这个类的静态方法加载进内存,还是把他所有的方法不管是否静态都加载进内存?
2.上面提到的内存指的是内存中的“方法区”吗?如果是的话,是不是要先为这个类在方法区中开辟一个空间,然后再把这些方法加载进这片空间中?
3.在加载类的时候,还要为其所有的静态成员进行初始化,还要执行静态代码块(如果有),那么这一步骤与加载这个类的方法这个动作的先后顺序是什么?先初始化静态成员,还是先加载类的方法?

先问这些吧。
回复 使用道具 举报
1.加载类的时候,只是把代码Person.class文件加载到内存中的堆区域,此时还没有执行代码
2.上面提到的内存是堆内存
3.这个是顺序:
对象的初始化过程:
Person p = new Person("张三",20);
这句话都做了什么事情?
因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中
执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
在堆内存中开辟空间,分配内存地址。
在堆内存中建立对象的特有属性,并进行默认初始化。
对属性进行显示初始化
对对象进行构造代码块初始化
对对象进行对应的构造函数初始化
将内存地址赋给栈内存中p变量

仔细看看面向对象视频中的对象初始化过程这一讲。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马