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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔宝东 中级黑马   /  2013-4-18 09:57  /  1495 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 崔宝东 于 2013-4-18 10:11 编辑

public class F_PersonDemo4 {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Person3 p = new Person3("zhangshan",30);
                Person3 p1 = new Person3("lisi",36);
        }

}
class Person3
{
        private String name ;
        private int age;
        Person3 ()
        {
                System.out.println("person3 run");
        }
        Person3(String name, int age )
        {
//                这里并没有用this.name= name.  this.age = age进行给本类的成员变量赋值;
//                为什么打印的结果不是null和0呢?而是带有传递值的结果呢?
                System.out.println("name="+name+"                age="+age);
        }
}

5 个回复

倒序浏览
本帖最后由 张金铎 于 2013-4-18 10:13 编辑

当你new新对象的时候调用了构造函数Person3(),虽然你没有写this.name=name。所以你打印出来的就是形参里面的值。对象的私有变量,应该还是null和0。你在类里面加上下面两个方法,然后在main()里面打印出来看看就知道了。
        public int getAge(){
                return age;
        }
        public String name(){
                return name;
        }
回复 使用道具 举报
  1. public class F_PersonDemo4 {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 Person3 p = new Person3("zhangshan",30);
  5.                 Person3 p1 = new Person3("lisi",36);
  6.                
  7.         }

  8. }
  9. class Person3
  10. {
  11.         private String name ;
  12.         private int age;
  13.         Person3 ()
  14.         {
  15.                 System.out.println("person3 run");
  16.         }
  17.         Person3(String name, int age )
  18.         {
  19. //                这里并没有用this.name= name.  this.age = age进行给本类的成员变量赋值;
  20. //                为什么打印的结果不是null和0呢?而是带有传递值的结果呢?
  21. //在前面加上this.即可,如不加,则代表打印的是 Person3(String name, int age )中的name和age;
  22.                
  23.               System.out.println("name="+this.name+"                age="+this.age);
  24.         }
  25. }
复制代码
回复 使用道具 举报
本帖最后由 403383221 于 2013-4-18 10:15 编辑

这里是局部变量跟成员变量方面的知识,当你把参数name和age传进去时,相当于Ponson3方法中有了这两个变量
String name = "zhangshan",int age  = 30,当局部变量有值时,调用局部变量得值
因此输出值是name = zhangshan   age  = 30
如果把 Person3(String name, int age )改为 Person3(String nam, int ag )
就会输出你要的值了。(个人理解,哪里不对了见谅啊)
回复 使用道具 举报
你这里有问题,输出的是局部变量。成员变量实际上还是null和0的。增加了一段代码这样可以清楚的展示,
  1. public class F_PersonDemo4 {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 Person3 p = new Person3("zhangshan",30);
  5.                 Person3 p1 = new Person3("lisi",36);
  6.         }

  7. }
  8. class Person3
  9. {
  10.         private String name ;
  11.         private int age;
  12.         Person3 ()
  13.         {
  14.                 System.out.println("person3 run");
  15.         }
  16.         Person3(String name, int age )
  17.         {
  18.                 //    这里并没有用this.name= name.  this.age = age进行给本类的成员变量赋值;
  19.                 //    为什么打印的结果不是null和0呢?而是带有传递值的结果呢?
  20.                 //  这里输出的问题,输出的是局部变量。成员变量实际上还是null和0的。增加了一段代码这样可以清楚的展示,
  21.                 System.out.println("name="+name+"                age="+age);
  22.                 System.out.println("this.name="+this.name+"               this.age="+this.age);
  23.         }

  24. }
复制代码
回复 使用道具 举报
本帖最后由 Just_Only 于 2013-4-18 11:08 编辑

我也来说说我的理解,这实际上是成员变量和局部变量的区别,还有this关键字的使用,由于成员变量和局部变量重名,所以使用this标明,用this.name指的是对象中的变量,但当你像你那样写的时候,即其实在堆内存中的对象的name和age的值仍然是null和0;
而你person3构造函数中打印的其实是局部变量的值,因为重名,所以当打印的时候,程序会找先看自己有没有如果有那么就打印自己有的,如果没有那么就找对象中的,那么此时name前面就会默认的加上this.;(也就是说如果你你把person3构造函数中的参数的名称改下,例如person3(String nam,int ag)),那么你在打印的时候就会得到null和0了。所以当成员变量和局部变量重名的时候你指明你打印的是那个成员变量还是局部的变量(当然是在能打印的权限的范围内),
改成下面的代码也可以实现你想要的
  1. public class PersonDemo4 {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 Person3 p = new Person3("zhangshan",30);
  5.                 Person3 p1 = new Person3("lisi",36);
  6.         }

  7. }
  8. class Person3
  9. {
  10.         private String name ;
  11.         private int age;
  12.         Person3 ()
  13.         {
  14.                 System.out.println("person3 run");
  15.         }
  16.         Person3(String nam, int ag )
  17.         {
  18. //                这里并没有用this.name= name.  this.age = age进行给本类的成员变量赋值;
  19. //                为什么打印的结果不是null和0呢?而是带有传递值的结果呢?
  20.                 System.out.println("name="+name+"                age="+age);//如果你没有加this.此时java内部会默认的加上this.
  21.         }
  22. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马