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;
}
}
});
}