黑马程序员技术交流社区
标题: 成员变量与局部变量? [打印本页]
作者: 陈郊 时间: 2012-9-26 19:12
标题: 成员变量与局部变量?
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
这是什么原因?求详解。谢谢
作者: 陈郊 时间: 2012-9-26 19:13
求高手解答!
非常的感谢!!
作者: 郭阳 时间: 2012-9-26 19:31
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
作者: 孙岳 时间: 2012-9-26 19:38
本帖最后由 孙岳 于 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。
}
}
作者: 王贵朝 时间: 2012-9-26 19:44
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);
}
}
作者: 李润根 时间: 2012-9-26 19:55
问题:当方法里面为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再怎样改也不会变
作者: 黄基焜 时间: 2012-9-26 20:04
本帖最后由 黄基焜 于 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
作者: 杜正华 时间: 2012-9-26 20:37
当方法中为 int age = 40时代码如下:- package com.aduvm.practice;
- class Demo1
- {
- public static void main(String[] args)
- {
- Serson p1=new Serson();
- p1.age=45 ; //访问全局变量age 所以输出45
- p1.shout(); //访问局部变量age 所以输出40
- System.out.println(p1.age);
- }
- }
- class Serson//定义一个Person类
- {
- int age;//成员变量
- String sex;
- String name;
- void shout()
- {
- int age=40;
- //age =40;
- System.out.println("Oh,mygod! my age is "+age);
-
- }
- }
复制代码 当方法中为 age = 40时代码如下:- package com.aduvm.practice;
- class Demo1
- {
- public static void main(String[] args)
- {
- Serson p1=new Serson();
- p1.age=45 ; //访问全局变量age并赋值为45
- p1.shout(); //访问全局变量age并赋值为40 所以输出40
- System.out.println(p1.age); //访问全局变量age,所以输出40
- }
- }
- class Serson//定义一个Person类
- {
- int age;//成员变量
- String sex;
- String name;
- void shout()
- {
- // int age=40;
- age =40;
- System.out.println("Oh,mygod! my age is "+age);
-
- }
- }
复制代码
作者: tianyun 时间: 2013-3-13 22:53
java参数时都是按值传递,传递的是参数的拷贝。调用person方法后,参数释放,p1.age重置为45.最后输出45.但参数变量在方法类有效,所以方法输出40.
作者: tianyun 时间: 2013-3-13 22:53
java参数时都是按值传递,传递的是参数的拷贝。调用person方法后,参数释放,p1.age重置为45.最后输出45.但参数变量在方法类有效,所以方法输出40.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |