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
}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调用本类中的构造方法// name = name ; //5行 为类中的name属性赋值 // age = age ;// 6行 为类中的age属性赋值6
当一个类中 有多个构造方法时,可以利用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; } } }); }