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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈郊 中级黑马   /  2012-9-26 19:12  /  2518 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo1
{
         public static void main(String[] args)
         {
                   Person p1=new Person();
                   p1.age=45 ;
                   p1.shout();
                   System.out.println(p1.age);
         }
}
class Person//定义一个Person
{
         int age;//成员变量
         String sex;
         String name;
         void shout()
         {
                    int age=40;
                    age =40;
                   System.out.println("Oh,mygod! my age is "+age);
                  
         }
}
问题:当方法里面为int age=40时,输出结果是Oh,my god! my age is 40    45
      当方法里面为 age=40,输出结果是Oh,my god! my age is 40   40
      这是什么原因?求详解。谢谢

评分

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

查看全部评分

9 个回复

倒序浏览
求高手解答!
非常的感谢!!
回复 使用道具 举报

回帖奖励 +5

person里有一个成员变量age
person里的成员方法里如果还有age的话,那么要明确这个age是this .age(也就是person.age)还是方法内的局部变量。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题:当方法里面为int age=40时,输出结果是Oh,my god! my age is 40    45
      当方法里面为 age=40时,输出结果是Oh,my god! my age is 40   40
      这是什么原因?求详解。谢谢
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

首先你的主函数中建立的person对象,并赋值给person的age45.

当你在方法里又一次声明int age的时候,这个age就是局部变量,并赋值40。那么调用方法的时候是打印age,就是这个局部变量即40,,如果你在shout方法中打印this.age,那么就是45。而成员变量没有被你修改,所以p1.age是45

如果方法内写的是age=40的时候,方法内没有找到你声明过age,于是他就是this.age,也就是说age=40实际上是给成员变量赋值了。不管你方法内调用age还是直接打印p1.age都是40

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 孙岳 于 2012-9-26 19:41 编辑

class Demo1
{
         public static void main(String[] args)
         {
                   Person p1=new Person();
                   p1.age=45 ;
                   p1.shout();
                   System.out.println(p1.age);//这个age是Person类成员变量。上面赋值是多少就输出多少。      
         }
}
class Person//定义一个Person类
{
         int age;//成员变量
         String sex;
         String name;
         void shout()
         {
                    int age=40;//这是给局部变量赋值,也就是方法内的变量。                  
                    age =40;//这也是给局部变量赋值,重新赋值,跟上面的age是同一个变量。                  
                    System.out.println("Oh,mygod! my age is "+age);//这里输出的是局部变量age,上一句赋值多少,就输出多少。如果想输出类成员变量,需要用 this.age。
                  
      
   }
}

评分

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

查看全部评分

回复 使用道具 举报
class Demo1
{
         public static void main(String[] args)
         {
                   Person p1=new Person();
                   p1.age=45 ;
                   p1.shout();
                   System.out.println(p1.age);
         }
}
class Person//定义一个Person类
{
         int age;//成员变量
         String sex;
         String name;
         void shout()
         {
                    int age=40;这里重新定义了一个age并且于前面定义的实例变量相同,此时就出现了隐藏,所以在在方法中打印age=40,而在main中打印的其实是person的实例变量
                    age =40;
                   System.out.println("Oh,mygod! my age is "+age);
                  
         }
}

评分

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

查看全部评分

回复 使用道具 举报
问题:当方法里面为int age=40时,输出结果是Oh,my god! my age is 40    45
      当方法里面为 age=40时,输出结果是Oh,my god! my age is 40   40
      这是什么原因?求详解。谢谢

int age=40 是shout()定义的局部变量,第二行age=40,也只是对局部变量age重新赋值
你再怎样改System.out.println(p1.age)输出都是45,除非你把age=40改成this.age=40,那样的话你上面的p1.age再怎样改也不会变

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 黄基焜 于 2012-9-26 20:07 编辑

方法shout里面,
当int age=40时,是声明一个方法里面的局部变量为40,和对象的成员变量age无关
所以("Oh,mygod! my age is "+age)的age是40,然后对象重新对成员变量赋值45,所有 System.out.println(p1.age);打印的是45
当是age=40时,没有int age=40,这里是隐藏了一个修饰符this,完整是this.age=40;这里的age就是成员变量。
所以就算你在对象那里来了p1.age=45 ;这句给成员变量重新赋了值为45,但是你调用方法的时候age=40会再次运行给对象的成员变量赋值为40,
所以你System.out.println(p1.age)这句输出的还是40

评分

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

查看全部评分

回复 使用道具 举报
当方法中为 int age = 40时代码如下:
  1. package com.aduvm.practice;

  2. class Demo1
  3. {
  4.          public static void main(String[] args)
  5.          {
  6.                    Serson p1=new Serson();
  7.                    p1.age=45 ;  //访问全局变量age  所以输出45
  8.                    p1.shout();  //访问局部变量age 所以输出40
  9.                    System.out.println(p1.age);
  10.          }
  11. }
  12. class Serson//定义一个Person类
  13. {
  14.          int age;//成员变量
  15.          String sex;
  16.          String name;
  17.          void shout()
  18.          {
  19.                     int age=40;
  20.                     //age =40;
  21.                    System.out.println("Oh,mygod! my age is "+age);
  22.                   
  23.          }
  24. }
复制代码
当方法中为 age = 40时代码如下:
  1. package com.aduvm.practice;

  2. class Demo1
  3. {
  4.          public static void main(String[] args)
  5.          {
  6.                    Serson p1=new Serson();
  7.                    p1.age=45 ;  //访问全局变量age并赋值为45
  8.                    p1.shout();  //访问全局变量age并赋值为40 所以输出40
  9.                    System.out.println(p1.age); //访问全局变量age,所以输出40
  10.          }
  11. }
  12. class Serson//定义一个Person类
  13. {
  14.          int age;//成员变量
  15.          String sex;
  16.          String name;
  17.          void shout()
  18.          {
  19.                    // int age=40;
  20.                     age =40;
  21.                    System.out.println("Oh,mygod! my age is "+age);
  22.                   
  23.          }
  24. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
java参数时都是按值传递,传递的是参数的拷贝。调用person方法后,参数释放,p1.age重置为45.最后输出45.但参数变量在方法类有效,所以方法输出40.
回复 使用道具 举报
java参数时都是按值传递,传递的是参数的拷贝。调用person方法后,参数释放,p1.age重置为45.最后输出45.但参数变量在方法类有效,所以方法输出40.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马