黑马程序员技术交流社区

标题: 构造代码块。。 [打印本页]

作者: 张红伟    时间: 2013-9-11 11:28
标题: 构造代码块。。
本帖最后由 杨增坤 于 2013-9-11 17: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,而为什么不是haha..20呢。是不是跟构造代码块有关?一个静态成员变量被定义后,如 private String name="haha";                                                                       后面在用这个Person p=new Person("zhangsan",20);,结果一样输出haha  而不是zhangsan,不是太明白,why?


作者: 赵凯    时间: 2013-9-11 11:38
你的Name和age都被私有了,不能进行改变,你的age没有赋值,int类型默认的是0,所以你输出的是haha和0,如果你想进行赋值的话就将Private去掉,在用创建的对象去调用方法,构造代码块每次创建对象都会执行。
作者: Michael_xpd    时间: 2013-9-11 11:55
在你写的这段代码中,你在类Person中将成员变量都声明为private型,由于被权限修饰符private修饰的成员只允许在本类中访问,故你在PersonDemo类中调用构造函数初始化对象并为对象赋值时并不能访问Person类中的私有成员。
作者: 张红伟    时间: 2013-9-11 13:10
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);
     }
  }
上面的 private String name="haha";
  private int age;
改为  String name="haha";
      int age;
   结果会怎么样呢?
作者: 李锡碧    时间: 2013-9-11 13:43
本帖最后由 李锡碧 于 2013-9-11 13:48 编辑

毕老师有详细说过哦。
对象一建立就运行,优先于构造函数执行。和构造函数区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的函数初始化构造代码块中定义的是不同对象共性的初始化内容

问题.jpg (50.85 KB, 下载次数: 47)

问题.jpg

作者: lonely_zb    时间: 2013-9-11 15:44
Person p=new Person("zhangsan",20);---

调用你的有参构造方法,你的方法里面是这样写的,this.name=name----

将你传入的方法参数的name值赋值等于成员变量person的name值,所以结果你就可想而知啦...

你的name的值是“haha”...
作者: code_geass    时间: 2013-9-11 18:39
对象一建立就运行了构造代码块,此时打印的是变量的初始值。就是haha。和0.。你虽然new了对象。但是你没有调用方法。当参数传递进去后变量值已经改变了。此时你调用speak() 打印的就是zhangsan  20了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2