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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张红伟 中级黑马   /  2013-9-11 11:28  /  1467 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 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?

评分

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

查看全部评分

6 个回复

倒序浏览
你的Name和age都被私有了,不能进行改变,你的age没有赋值,int类型默认的是0,所以你输出的是haha和0,如果你想进行赋值的话就将Private去掉,在用创建的对象去调用方法,构造代码块每次创建对象都会执行。

评分

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

查看全部评分

回复 使用道具 举报
在你写的这段代码中,你在类Person中将成员变量都声明为private型,由于被权限修饰符private修饰的成员只允许在本类中访问,故你在PersonDemo类中调用构造函数初始化对象并为对象赋值时并不能访问Person类中的私有成员。
回复 使用道具 举报
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:48 编辑

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

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

问题.jpg

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
Person p=new Person("zhangsan",20);---

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

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

你的name的值是“haha”...

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
对象一建立就运行了构造代码块,此时打印的是变量的初始值。就是haha。和0.。你虽然new了对象。但是你没有调用方法。当参数传递进去后变量值已经改变了。此时你调用speak() 打印的就是zhangsan  20了
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马