此代码示例中的关键字引用了什么?

时间:2014-07-14 16:30:18

标签: java android

public class NewPlanet extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add);

    ImageView marsImage = (ImageView) findViewById(R.id.imageMars);
    marsImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            WorldGen mars = new WorldGen("Mars", 642, 3.7);
            mars.setPlanetColonies(1);
            Toast.makeText(NewPlanet.this, "Mars Created", Toast.LENGTH_SHORT).show();
        }
    });
 }
}

NewPlanet.this引用什么上下文?为什么类makeText中的Toast需要此上下文?我理解在引用类时使用关键字this并使用点表示法来访问this.field中的字段和构造函数,但是this关键字何时出现在类引用之后呢?

3 个答案:

答案 0 :(得分:3)

实例NewPlanet.this表示作为外部类的NewPlanet的对象。如果您仅使用this,则它将代表匿名类OnClickListener的实例。

编译后你会得到这样的东西:

marsImage.setOnClickListener$1(new OnClickListener$1(this));

 static class OnClickListener$1 implements OnClickListener {
        private final NewPlanet ref;
        OnClickListener$1(NewPlanet ref) {
           this.ref= ref;
        }

        @Override
        public void onClick(View v) {
            WorldGen mars = new WorldGen("Mars", 642, 3.7);
            mars.setPlanetColonies(1);
            Toast.makeText(ref, "Mars Created", Toast.LENGTH_SHORT).show();
        }
    }

答案 1 :(得分:2)

NewPlanet.this是对外类this的引用。事实上,你是从匿名的内部阶级中使用它。

答案 2 :(得分:0)

它是对NewPlanet的引用,即调用onCreate()方法