7
回答
java中的this
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

学习了java中的this,书上说的似是而非的。而且没列子。

public class Demo06{
	public static void main(String[] args){
	Girl secondgirl = new Girl("Anna", 21);
	//secondgirl.showMessage();
	secondgirl.func2();
	}
}

class Girl{
	private String name = null;
	private int age = 0;
	
	public void setName(String n){
		name = n;
	}
	public String getName(){
		return name;
	}
	public void setAge(int a){
		age = a;
	}
	public int getAge(){
		return age;
	}
	public void showMessage(){
		System.out.println(name + "'s" + "age is " + age);
	}
	public Girl(String name, int age){
		this.name = name;
		this.age = age;
	}
	public void func2(){
		Girl firstgirl = new Girl("Lily", 20);
		firstgirl.showMessage();
		this.showMessage();
	}
	
}

请问这里的this怎么理解呢?如果注释this.showMessage();只显示了一个人的信息,而加上之后,会显示两个人的信息。为什么会这样呢?

public void setName(String n){
		name = n;
	}
	public String getName(){
		return name;
	}
	public void setAge(int a){
		age = a;
	}
	public int getAge(){
		return age;
	}

改成如下:

public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}

其中这里的this又如何解释呢?

举报
书生_Maple
发帖于5年前 7回/1K+阅
共有7个答案 最后回答: 3年前

强烈建议阅读《在爪哇里思考》这本神作。

this就是指我自己(事实上PHP里就有this和self两个关键字,使用场景不一样)。

public void func2(){
        Girl firstgirl = new Girl("Lily", 20); // 创建一个Girl
        firstgirl.showMessage(); // 调用这个girl的showMessage方法
        this.showMessage(); // 再调用我自己的showMessagefangfa
}

你说是不是应该打印两遍呢?

 

在上面所示代码中 , name是参数也是成员变量,故:

public void setName(String name){//name是参数
	this.name = name;//参数名与成员变量名重复,范围小者优先,故name值为参数。
        //那么如何调用成员变量name呢,使用“对象.成员变量”来实现,而在对象内部,用this来代表自己。故this.name表示成员变量
        //此行代码意思是 将参数name的值 赋给 成员变量name
}

在初学时 可能会有些困或用啥要getter/setter方法呢?  原因是private是只允许对象内部自己访问,get方法相当于实现了只读,set方法里实现只读。 

class Girl{
	private int age = 0;//成员变量
	
        /** 只写的age属性*/
	public void setAge(int a){
		age = a;
	}
        /** 只读的age属性*/
	public int getAge(){
		return age;
	}
}

为了加深理解,我将代码改动如下:

class Girl{
	private int age = 0;//成员变量
	
        /** 只写的age属性*/
	public void setAge(int age){
                if(age>0 && age<100){//限制年龄只能在0-100岁,显然在这里是合理的,反之如果直接公开其成员变量,其age不排除为负数或其它情况
            		this.age = age;
                 }
	}
        /** 只读的age属性*/
	public int getAge(){
		return age;
	}
}

 附,以上代码只是我曾遇到过的,夸张列出

--- 共有 1 条评论 ---
书生_Maple谢谢你的回答,很详细啊。也容易理解。 5年前 回复
顶部