如题,在java核心技术上提到,在类的方法中定义和数据域的同名变量会有屏蔽作用,如图
class test
{
public void setName(String name)
{
name = "setname";
}
public test(String name)
{
name = "test";
}
public void Show()
{
System.out.println(name);
}
private String name;
}
在这里输出的name都是null.
然而在数据块中却不能定义同名变量,请问这是为什么呢?
无比蛋疼中....
------解决思路----------------------
很简单啊,简单的讲就是当一个方法(普通方法、静态方法、构造方法等)的方法参数变量名出现和类成员变量(普通变量、静态变量)同名时,则你在方法如果不做"特殊处理",默认用的都是方法参数的变量,如果想要用对象自身的属性,则需要用this.(普通变量)、或者类名.(静态变量)。
以楼主你的代码为例:
public test(String name)
{
name = "test";
}
由于构造方法参数变量名称为name,和类的成员变量同名了,name = "test"实际是给方法参数的那个变量赋值,而不是类的成员变量。所以成员变量中的那个name的值会一直为null。
如果要给成员变量赋值,则需要修改为:
public test(String name)
{
this.name = "test";
}
如果类的成员变量name是用static修饰的话,则不能用this.来调用 ,要用类名.来调用
------解决思路----------------------
“如果类的成员变量name是用static修饰的话,则不能用this.来调用 ,要用类名.来调用”说得不严谨,静态变量可以用this调用,但如果是在static中才用不了,通常不建议使用this或者对象名来调用,建议用类名来调用。
------解决思路----------------------
简单的一句话,局部变量覆盖全局变量。setName方法中的name的作用域是在该方法中,而成员变量name的作用域是整个类,局部覆盖全局,也就是说setName方法中,name是方法中定义的name,而不是成员变量中的name.