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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM汪磊 高级黑马   /  2013-3-2 14:58  /  1619 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Person
{
     int age;
     String name;
    Person(String name)
        {
               this.name=name;
        }
        Person(String name,int age)
        {
               this(name);
               this.age=age;
        }
}
class  Half
{
        public static void main(String[] args)
                {
                          Person p1=new Person("lisi",20);       
                         System.out.println("name="+name+",age="+age);
                }
}


输出语句放在构造函数
Person(String name,int age)        {
               this(name);
               this.age=age;
        }

最后一句就可以正常执行,为什么按上述写法就不对呢???程序是怎么执行的?????

评分

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

查看全部评分

8 个回复

倒序浏览
本帖最后由 杨杨 于 2013-3-2 18:02 编辑

class  Half
{
        public static void main(String[] args)
                {
                          Person p1=new Person("lisi",20);        
                         System.out.println("name="+name+",age="+age);
                }
}
name 定和age没有定义
System.out.println("name="+p1.name+",age="+p1.age);

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
System.out.println("name="+name+",age="+age);
改成
System.out.println("name="+p1.name+",age="+p1.age);
回复 使用道具 举报
你最后都没说是调谁的name和age啊   加p1.name和p1.age
回复 使用道具 举报
本帖最后由 孙传磊 于 2013-3-2 16:15 编辑

如果你是想输出Person类的对象 p1 的成员变量 name 和 age 可以按下面方法改,
即“System.out.println("name="+p1.name+",age="+p1.age);” 就是说要告诉jvm 要输出的是 p1 的成员变量
如果写在构造函数中,如下:
    Person(String name,int age)
        {
               this(name);
               this.age=age;
               System.out.println("name="+name+",age="+age);
        }
那么
首先是 类 Half 创建 Person 类的对象 p1 ,之后是赋值,再之后是输出。  由于“System.out.println("name="+name+",age="+age);
” 在 p1内部 jvm 把“ System.out.println("name="+name+",age="+age);
”默认为“System.out.println("name="+this.name+",age="+this.age);” ,也就是说按上面的写法只是省去"this."  而此处暗含"this." 为jvm指明 name  和age 是 p1 的成员变量。
  从而可以正确的运行。

下面代码就可以真确运行了!
class Person
{
     int age;
     String name;
    Person(String name)
        {
               this.name=name;
        }
    Person(String name,int age)
        {
               this(name);
               this.age=age;
        }
}
class  Half
{
        public static void main(String[] args)
                {
                         Person p1=new Person("lisi",20);        
                         System.out.println("name="+p1.name+",age="+p1.age);
                }
}
回复 使用道具 举报
本帖最后由 杨玉辉 于 2013-3-2 17:50 编辑

Person p1=new Person("lisi",20);         //该语句仅仅是建立一个p1对象,并把参数lisi,20传给了与之对应的构造函数 Person(String name,int age)就完了,构造函数内部并没有对这两个参数进行操作
System.out.println("name="+name+",age="+age); //这条语句相当于“System.out.println("name="+this.name+",age="+this.age);”
在Half这个类中你上下文并没有定义 int age; String name;
所以就没有具体内容,也就没有具体输出内容。

而输出语句放在构造函数内
Person(String name,int age)        {
                this(name);
                this.age=age;
                System.out.println("name="+name+",age="+age);//为了方便说而已,才这么写的
}
很明显,就可以输出,就是你通过Person p1=new Person("lisi",20);       传进来的参数嘛。 当然可以输出咯

建议你这么写:
class Person
{
     int age;
     String name;  //最好用private 关键字私有处理下  防止类外直接调用
     Person(String name)
         {
                this.name=name;
         }
         Person(String name,int age)
         {
                this(name);
                this.age=age;                 
         }
         public void method()
         {
           System.out.println("name="+name+",age="+age);
          }
}
class  Half
{
         public static void main(String[] args)
                {
                           Person p1=new Person("lisi",20);        
                           p1.method();     //  p1. mothod();      构造函数调用 本类中的method()方法 可以提高代码复用性 再用到的时候,直接调用就可以了
                 }
}

个人见解,多指教

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
错在主函数的输出语句
  Person p1=new Person("lisi",20);        
                        System.out.println("name="+name+",age="+age);//错误在于name和age应该改为p1.name,p1.age要明确name和age的所属关系。
回复 使用道具 举报
当把次输出语句放入构造函数中时,
Person(String name,int age)
{
      this.name=name;
      this.age=age;
     System.out.println("name"+name+",age"+age);//这里的name和age是随和对象一起加载的。
}
主函数中new Person("lisi",20)就已经执行了打印语句
回复 使用道具 举报
        其实这个问题要归结到面向对象刚刚开始讲的地方,java是面向对象语言,那么就要从对象角度出发.对象拥有属性方法。调用属性或方法:对象.属性对象.方法。案例中定义了一个Person类,且重载,age和name分别是Person类的属性,那么要想调用该属性的时候,就要用对象.属性
        案例中 javac编译到打印name和age时,由于未指定name和age是哪个类的属性,换句话说就是编译器不知道他们两个是什么东西,所以报错!
        修正为 P1.name 和P1.age 编译器就知道那两个东西是什么了,然后你就happy了
望对你有帮助 共同学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马