Java关键字 this (this.实例成员;this()),以及Android中内部类中的中的this(*.this,ClassName.this)

来源:互联网 发布:在国外怎么淘宝 编辑:程序博客网 时间:2024/05/22 15:30

      关键字this用于指代当前的对象。

    除了被声明为Static的地方外(由于static成员是属于类,而非个别对象,所以在static成员中使用this,会是一种语意上的错误),this关键字可以出现在类中任何地方,在对象创建后为“这个对象”的参考名称。

    类内部可以使用this作为前缀引用实例成员,在构造函数参数与对象数据成员同名时,可用this加以区别。

    this()代表了调用另一个构造函数,至于调用哪个构造函数根据参数表确定。this()调用只能出现在构造函数的第一行

   *.this 代表本类的一个引用,用于指代当前的对象表示本类的引用,通常前面的*是用本类的名字表示,当然也可以省略,但是如果是在内部类中一定要加上类名当在内部类中用this时,这个this则指的是匿名类或内部类对象。如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名(外部类类名.this)。

下面举个验证例子

public class ThisTest {public void method( ) {System.out.println("TestThis.method()");}public class Inner {public ThisTest getThisTest() {return ThisTest.this;}}public Inner getInner() {return new Inner();}public static void main(String[] args) {ThisTest tt = new ThisTest();Inner in = tt.getInner();ThisTest t = in.getThisTest();System.out.println(tt == t);}}

结果为true。

       ThisTest.this;就是外部类(ThisTest)的对象的引用,这个引用就是tt。

       类名.this.方法(ClassName.this.Methode()),由于内部类中有个方法与外部类的方法重名了,如果要调用外部类中的方法就需要采用这种方式。当然了,这内部类肯定不能是静态的内部类。

下面举个应用场景例子:

public class A {int i = 1;public A() {Thread thread = new Thread() {public void run() {for (;;) {A.this.run();try {sleep(1000);} catch (InterruptedException ie) {}}}};thread.start();}public void run() {System.out.println("i = " + i);i++;}public static void main(String[] args) throws Exception {new A();}}

    在上面这个例子中, thread是一个匿名内部类对象,在它的定义中,它的run函数里用到了外部类的run方法。这时由于方法同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 方法换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的外部类类名加this(外部类类名.this)引用来说明要调用的是外部类的方法run。

       在Android中,当在内部类中使用关键字this,指的就是内部类的对象。 为了访问外层类对象,就要使用外层类名.this来访问。

下面用短息发送器的例子解释:

public class MainActivity extends Activity {    private EditText et_num;    private EditText et_sms;    private Button btn;    @Override    protected void onCreate(Bundle savedInstanceState) {    //        super.onCreate(savedInstanceState);        //获取activity_main.xml文件的引用        setContentView(R.layout.activity_main);       //根据控件id获取控件对象        et_num = (EditText) findViewById(R.id.et_num);        et_sms = (EditText) findViewById(R.id.et_sms);        btn = (Button) findViewById(R.id.btn);        /**给Button绑定点击事件         * 这里通过一个匿名内部类来创建OnclickListener对象         */        btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//获取数据 String num =  et_num.getText().toString().trim();      String sms = et_sms.getText().toString().trim();   /**对数据合法性进行校验    * 这里的要求是如果电话号码或者短信内容有一个为空则就终止代码继续往下走    * TextUthils是Android提供的一个字符串操作工具类    */    if (TextUtils.isEmpty(num)||TextUtils.isEmpty(sms)) {/**Toast是Android系统提供的工具类, * 可以再手机屏幕上弹出提示信息并会自动消失 * 第一个参数Context 上下文,MainActivity继承了Context, * 因此其本身就是上下文对象 * 第二个参数CharSequence 字符串文本内容 * 第三个参数int 显示时长,只有两个常量;应该可以自己写入 */    Toast.makeText(MainActivity.this, "电话或短信不能为空", Toast.LENGTH_SHORT).show();    return;}  /*   *  发送短信是通过API提供的短信管理器实现的   *  通过SmsManager的静态方法获取对象(源码中使用懒汉式单利模式)   */   @SuppressWarnings("deprecation")SmsManager smsManager = SmsManager.getDefault();   /*    * 短信长度超过一定的限制后需要切割成多条分批发送    * 一定要使用SmsManager对象提供divideMassage(String)方法切割    */   ArrayList<String> parts = smsManager.divideMessage(sms);   /*    * 发送短信    * 第一个参数String 目标手机电话号码    * 第二个参数String短信中心号码,建议设置为null,    * 使用sim卡提供的默认短信中心    * 第三个参数ArrayList 短信内容    * 第四个参数arraryList<PendingIntent>短信发送后如果发送成功了,    * 那么回调该参数,通过延时意图和广播才能实现,这里设置为null即可    * 第五个参数ArrayList<PendingIntent> 短信发送后如果被对方收到了,    * 那么回调该参数。    */   smsManager.sendMultipartTextMessage(num, null, parts, null, null);   //执行过发送 后 提示用户   Toast.makeText(MainActivity.this, "发送成功", Toast.LENGTH_SHORT).show();}});    }  }

官方API public static Toast makeText(Context context,CharSequencetext, int duration)

第一个参数 context =The context to use. Usually your Application or Activity object.

理解为:当前的上下文环境。可用getApplicationContext()或者getContext()或this(使用上下文,通常您的应用程序或Activity对象。)

但是此时makeText方法在匿名内部类中,如果直接使用单独的this,指代的是监听器View.OnClickListener。为了访问外层类对象,就要使用外层类名.this来访问。所以就用MainActivity.this

2 0