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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘渝灵 中级黑马   /  2013-2-25 11:03  /  1863 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘渝灵 于 2013-2-25 11:22 编辑

一个类的成分有这样一些:属性(静态和非静态的),static代码块,构造代码块,构造方法,其他方法(静态和非静态的)。当new一个这个类的对象时,基本顺序我已经了解。但是比如有这样一个类:
  1. public class Demo {
  2. private Person pp = new Person();//Person类是和Demo无关的另外一个类,在声明pp变量时即创建一个Person类型变量并赋给它是自然的并且容易理解。
  3. private Demo p = new Demo();//这里比较特别,p是本类类型的变量。单例模式中出现过这种写法。
  4.                                                 //运行程序会抛出“Exception in thread "main" java.lang.StackOverflowError”,但在属性前加上static后则不会
  5.                                                 //static属性不是先于对象而存在的吗?也就是说此时并没有Demo对象,这个赋值是怎么进行的?static属性和非静态的有什么区别?
  6.                                                 //如果此时创建了一个Demo对象,那在new的时候还会再创建吗?
  7.         {
  8.                 System.out.println("p: "+p);
  9.         }

  10.         public static void main(String[] args) {
  11.                 Demo d = new Demo();

  12.         }

  13. }
复制代码

5 个回复

倒序浏览
你想问什么呢?
回复 使用道具 举报
这就是一个空参数的构造函数,用于对类的初始化
回复 使用道具 举报
没怎么发过帖子,格式什么的不大会,我已经修改过,希望大家能看明白我帖子所表达的意思
回复 使用道具 举报
当把private  Demo p = new Demo();改成private static Demo p = new Demo();时运行结果:p: null
p: Demo@18a992f;因为类的成员变量在所有方法调用之前 就已经初始化,当你把它改成静态后自动初始化为null.所以不会报错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马