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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我为你着迷 金牌黑马   /  2014-4-5 11:20  /  946 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Person
  2. {
  3.                         private String name="haha";
  4.                         private int age;
  5.                         private static String country ="cn";
  6.                         Person(String name, int age)
  7.                         {
  8.                                         this.name=name;
  9.                                         this.age=age;
  10.                                        
  11.                         }
  12.       
  13.       {
  14.                       System.out.println(name+".."+age);       
  15.       }
  16.       
  17.       public void setName(String name)
  18.       {
  19.                this.name=name;
  20.                
  21.       }
  22.      
  23.      public void speak()
  24.      {
  25.         System.out.println(this.name+"..."+this.age);
  26.      }

  27.      public static void showCountry()
  28.      {
  29.                      System.out.println("country="+country);
  30.      }
  31. }


  32. class  PersonDemo
  33. {
  34.                         public static void main(String[] args)
  35.                         {
  36.                                                 Person p=new Person("zhangsan",20);
  37.                         }
  38. }
复制代码
大家好! 我想问下为什么打印结果是haha..0呢啊 ? 想不明白了 !   麻烦大伙帮忙解答下! 跪谢了。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

2 个回复

倒序浏览
在你的程序中,13-15行是一个代码块,当建立该类对象时,这个代码块会优先执行。(注意,代码块有好几种,包括毕姥爷讲的静态代码块等,静态代码块的话是不用建立该类对象的,只要调用该类,就会执行静态代码块。这就像不用建立一个类的对象,就可以通过类名调用它的静态方法一样,都是一个道理)。
然后 ,建立Person对象时,代码块优先执行,因为你在Person类中定义并初始化了姓名为“haha”,但是你只是定义了int型的年龄变量,并未对其赋值。这里就要涉及到一个小知识点:定义的int型变量,如果没有对其初始化,那么它的值默认为0。(另外,引用型数据类型的默认初始值为null)。
这样,你就得到了这样的结果。
希望可以帮到你。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
这里主要知识点是构造代码块儿的执行顺序。
构造代码块儿
{
                     System.out.println(name+".."+age);        
}的执行顺序是优先于构造函数的:
                                                  构造代码块儿是给对象初始化的,即:只要创建一对象,首先运行的代码块儿;
                                                  构造函数是给指定对象初始化的;
所以创建Person对象的时候,先运行 System.out.println(name+".."+age); 输出haha。。0;
然后调用带参构造函数,不过只是赋值,没有具体实现,所以没有输出

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马