this关键字

this的作用有:

1、强调本类中的方法 2、表示类中的属性3、可以使用this调用本类中的构造方法 4、this表示当前对象(核心)


第一、表示类中的属性:

用笔写字的例子,桌边的笔和10米外的笔,你选择哪一个。

第5,6行没有加this的话,则在实例化对象时,则return的只是构造方法中没有赋值的name 和 age属性,和类中的属性无关。因为一个类 被实例化 也就是被new的时候 最先执行的是构造函数。

在大部分操作时,属性最好使用this.属性的形式表示。

class Person{		// 定义Person类
	private String name ;		// 姓名
	private int age ;			// 年龄
	public Person(String name,int age){	// 通过构造方法赋值
		this.name = name ; //5行          为类中的name属性赋值
		this.age = age ;// 6行            为类中的age属性赋值6
//		name = name ; //5行          为类中的name属性赋值
//		age = age ;// 6行            为类中的age属性赋值6
}public String getInfo(){ // 取得信息的方法return "姓名:" + name + ",年龄:" + age ;}};public class ThisDemo02{public static void main(String args[]){Person per1 = new Person("张三",33) ; // 调用构造实例化对象System.out.println(per1.getInfo()) ; // 取得信息}};


第二、可以使用this调用本类中的构造方法

当一个类中 有多个构造方法时,可以利用this关键字互相调用【this.(若干参数)的形式完成《?》】

但是在调用时有几点限制:

①this()调用的构造方法语句只能放在构造方法的首行 ②在使用this调用本类中其他构造的时候,至少有一个构造方法是不用this调用的【注意:不可以产生递归调用】

class Person{		// 定义Person类
	private String name ;		// 姓名
	private int age ;			// 年龄
	public Person(){	// 无参构造
		this("LXH",30) ;	// 调用有两个参数的构造方法
		System.out.println("新对象实例化") ;
	}
	public Person(String name){
		this() ;// 调用本类中的无参构造方法
		this.name = name ;
	}
	public Person(String name,int age){	// 通过构造方法赋值
		this(name) ;// 调用有一个参数的构造方法
		this.age = age ;// 为类中的age属性赋值
	}
	public String getInfo(){	// 取得信息的方法
		return "姓名:" + name + ",年龄:" + age ;
	}
};
public class ThisDemo05{
	public static void main(String args[]){
		Person per1 = new Person("张三",33) ;	// 调用构造实例化对象
		System.out.println(per1.getInfo()) ;	// 取得信息
	}
};

第三、使用this表示当前对象【当前对象:当前正在调用方法的对象】

class Person{		// 定义Person类
	private String name ;	// 姓名
	private int age ;		// 年龄
	public Person(String name,int age){
		this.setName(name) ;
		this.setAge(age) ;
	}
	public boolean compare(Person per){
		// 调用此方法时里面存在两个对象:当前对象、传入的对象
		Person p1 = this ;	// 当前的对象,就表示per1    这个就是当前对象,当前对象要和传入的对象进行比较!    
		Person p2 = per ;	// 传递进来的对象,就表示per2
		if(p1==p2){	// 判断是不是同一个对象,用地址比较
			return true ;
		}
		// 之后分别判断每一个属性是否相等
		if(p1.name.equals(p2.name)&&p1.age==p2.age){
			return true ;	// 两个对象相等
		}else{
			return false ;	// 两个对象不相等
		}
	}
	public void setName(String name){	// 设置姓名
		this.name = name ;
	}
	public void setAge(int age){		// 设置年龄
		this.age = age ;
	}
	public String getName(){
		return this.name ;
	}
	public int getAge(){
		return this.age ;
	}
};
public class ThisDemo08{
	public static void main(String args[]){
		Person per1 = new Person("张三",30) ;	// 声明两个对象,内容完全相等
		Person per2 = new Person("张三",30) ;	// 声明两个对象,内容完全相等
		// 直接在主方法中依次取得各个属性进行比较
		if(per1.compare(per2)){
			System.out.println("两个对象相等!") ;
		}else{
			System.out.println("两个对象不相等!") ;
		}
	}
};

【注意】

当遇到匿名内部类时,可能需要     使用类名.this


import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

	private EditText et_number;// 全局变量方便其他方法调用

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 加载一个布局activity_main
		setContentView(R.layout.activity_main);
		et_number = (EditText) findViewById(R.id.editText1);
		// (2)找到按钮
		Button btn_call = (Button) findViewById(R.id.button1);
		// (3)给button按钮设置一个点击事件
		// 匿名内部类实现OnClickListener()接口或者通过定义类来实现接口,再返回对象
		btn_call.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				// (4)获取edittext的内容
				String number = et_number.getText().toString().trim();
				if (number.equals(null)) {
					/**
					 * context :上下文内容 MainActivity其实就已经继承了context类,但是直接写this、
					 * 会报错,应为会调用匿名内部类,而不是MainActivity类,故使用类名.this的方式调用
					 * 
					 * text: 答应出文本内容 duration:长时间显示还是短时间显示
					 * */
					Toast ts = Toast
							.makeText(MainActivity.this, "老铁,电话不能为空", 1);
					ts.show();
					return;
				}

			}
		});
	}



上一篇:java的堆栈内存解释—数组


下一篇:java接口基本概念及实现