4

我已经阅读了数百个关于 java 中“this”的解释,但我真的很难理解它。我正在同时学习 android 和 java,我知道这样会更难,但我很享受。我被杀死的一件事是“这个”......我正在粘贴下面的教程中的代码,该教程曾经使用过“这个”。我打算只放一段代码,但希望尽可能提供帮助。

我正在寻找可以添加到我的笔记中的“这个”的一个很好的解释。任何和所有的帮助表示赞赏。提前致谢。

示例代码从下面开始:

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import android.view.View;
import android.content.DialogInterface;
import android.app.Dialog;
import android.app.AlertDialog;

public class DialogActivity extends Activity {
    CharSequence[] items = { "Google", "Apple", "Microsoft" };
    boolean[] itemsChecked = new boolean [items.length];

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void onClick(View v) {
        showDialog(0);
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case 0:
            return new AlertDialog.Builder(this)
            .setIcon(R.drawable.ic_launcher)
            .setTitle("This is a dialog with some simple text...")

            .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton)
                    {
                        Toast.makeText(getBaseContext(),
                                "OK Clicked!", Toast.LENGTH_SHORT).show();
                    }
                }
            )
            .setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton)
                    {
                        Toast.makeText(getBaseContext(),
                                "Cancel clicked!", Toast.LENGTH_SHORT).show();
                    }
                }
            )
            .setMultiChoiceItems(items, itemsChecked,
                    new DialogInterface.OnMultiChoiceClickListener() {
                        public void onClick(DialogInterface dialog,
                                int which, boolean isChecked) {
                                    Toast.makeText(getBaseContext(),
                                        items[which] + (isChecked ? " checked!":" unchecked!"),
                                        Toast.LENGTH_SHORT).show();
                    }
                }
            ).create();
        }
        return null;
    }
}
4

6 回答 6

17

this指当前Object的参考。

阅读此内容以获得更多理解

从链接中举一个例子:

public class Point {
    public int x = 0;
    public int y = 0;

    //constructor
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

在这里,为了区分参数xPointx,您需要告诉编译器区别。您可以使用this. 意思是,当我写的时候,this.x它的意思是,特定的x属于当前Object的,在这种情况下是Point

以您提供的代码为例:

AlertDialog.Builder(this)

AlertDialog.Builder()将 aContext作为其构造函数中的参数。但是在这里,您不这样做Context someContext = new Context();并将其作为参数传递,因为您只需要传递您的 current Activity's Context。所以你只需使用this.

于 2012-06-21T03:25:15.413 回答
2

把它想象this成“它自己”。如果您传递this给一个方法,那么您只是将对象的一个​​实例传递给该方法。

ie:Student是一个对象,就像Classroom. 如果我想在 中添加一个StudentClassroom我可能会告诉Student自己添加到教室(教室找不到学生,可以吗?)。所以,我会说student.addToClassroom(new Classroom(), this);

于 2012-06-21T03:29:42.387 回答
2

就像其他人所说的那样,关键字this只是对当前对象的引用。这通常是隐含的,例如,如果您有这样的类:

class ThisExample{
    int x;
    public ThisExample(int x){
        this.x = x;
        someMethod();
        this.someMethod();
    }

    void someMethod()
    {
    ...
    }
}

使用this.x = x有助于区分类拥有的成员变量和传递给构造函数的变量。此外,调用this.someMethod()andsomeMethod()做同样的事情,因为this隐含了。

在 Android 中,有时您会看到一个带有 this 的方法,例如someMethod(this). 这里发生的this是指的是当前的 Activity Context,这只是一堆解释有关 Activity 的一切的信息。

于 2012-06-21T03:48:55.230 回答
1

好的,我会看看我怎么走:P

将 Java 对象(类)视为一个单独的实体,它具有定义它是什么的properties某些事物()和它可以做的某些事物(methods

例如,取一个(非常抽象的)类,名为Machine

class Machine {
    Piston piston1;
    ArrayList<Gear> gears;

    public void addSomeNewGears(ArrayList<Gear> gears)
    {
        for(int i = 0; i < gears.size(); i++)
        {
            this.gears.Add(gears[i]);
        }    
    }
}

在方法addSomeNewGears中,我们实际上可以访问两个名为 gears 的列表:

  • 机器对象的当前齿轮,
  • 我们要添加的新的。

因为它们都被调用gears,所以对于我们想要访问哪一个可能是模棱两可的,但是新的 List 将具有优先权,因为它是在方法中本地声明的。

要访问机器的齿轮,我们需要使用this关键字,它告诉编译器我们正在寻找class' 齿轮,而不是method's

希望这可以帮助!

于 2012-06-21T03:49:50.743 回答
0

类的实例方法(那些未声明static的)只能通过引用该类的某个实例来执行。例如:

class Foo {
    public void doSomething() {
        // "this" refers to the current object
        . . .
    }
    . . .
}

// then later:
Foo aFoo = new Foo();
aFoo.doSomething(); // "this" will be equal to "aFoo" for this call

// The following is illegal:
doSomething();

// so is this:
Foo.doSomething();

在 method 内部doSomething(),变量this指的Foo是用于调用该方法的特定实例(在此示例中,由 引用的当前对象aFoo)。

于 2012-06-21T03:28:44.600 回答
0

这就是当前对象的引用。这对于识别成员属于当前类非常有用。例如,类样本{ int a; 样本(int a){ this.a=a; } } "this" 将区分当前类变量和其他变量

于 2012-06-21T03:40:28.140 回答