如何在这个JOGL场景中使用NOT在java中使用“this”关键字

时间:2015-12-04 18:59:42

标签: java this jogl

1)底部的代码是JOGL简介的一部分,它只是java的openGL,我不太明白这里使用“this”。我之前使用它并在许多用途中对其进行了点对点研究,但我不明白它在这个特定背景中的使用方式,所以请不要指导我另一个“这个”解释,因为我已经读完了。

例如,下面的位是:

public S1_original() {
        super("S1");
        this.setSize(WIDTH, HEIGHT);

这里提到的“this”关键字是什么?我没有写任何其他类,那么使用“.setSize()”方法是什么呢?

2)如果我在上面的例子中没有使用“this”和“this.setSize(WIDTH,HEIGHT)那么我会把它放在那里?

3)这段代码中的“this”是什么?

canvas.addGLEventListener(this);

为什么类似的行在它之前需要“this”,但是在这里使用它作为参数。

public class S1_original extends Frame implements GLEventListener {

  private static final int WIDTH=640;
  private static final int HEIGHT=480;
  //private static final float NEAR_CLIP=0.1f;
  //private static final float FAR_CLIP=100.0f;    

  private GLCanvas canvas;
  private FPSAnimator animator;
  private double theta = 0;
  private double sinValue = 0;
  private double cosValue = 0;

  public static void main(String[] args) {
    S1 frame = new S1();
    frame.setVisible(true);
  }

  public S1_original() {
    super("S1");
    this.setSize(WIDTH, HEIGHT);

    GLProfile glp = GLProfile.getDefault();
    GLCapabilities caps = new GLCapabilities(glp);
    GLCanvas canvas = new GLCanvas(caps);

    this.add(canvas, "Center");        
    this.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    } );

    canvas.addGLEventListener(this);

    animator = new FPSAnimator(canvas, 60);

    animator.start();
  }

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

this的完全标准用法:它指的是该方法当前正在操作的对象。由于S1_original()是构造函数,因此它指的是当前正在构造的对象。那么该行的作用是在正在构造的对象上调用setSize(WIDTH, HEIGHT)。但是,从另一个成员方法或构造函数中调用成员方法时,总是可以省略this,因此该行等同于:

setSize(WIDTH, HEIGHT);

您的困惑可能源于您实际上没有在班级中创建setSize方法。但请注意,您的类扩展了Frame - 该方法继承自该类。

答案 1 :(得分:1)

  

这里提到的“this”关键字是什么?我没有写任何其他类,那么使用“.setSize()”方法是什么呢?

this关键字表示对运行该方法的对象的引用。这可能是代码出现的类的实例,也可能是子类的实例。语义与将this替换为包含对同一对象的引用的普通变量的语义相同。

  

如果我不在上面的例子中使用“this”和“this.setSize(WIDTH,HEIGHT)”,我会把它放在那里?

无。你只需要写setSize(WIDTH, HEIGHT)。这意味着完全相同的事情。

当您看到在this上调用的方法时,通常为了清晰代码,强调该方法是在对象上调用的,而不是在另一个对象上调用可用。例如,我倾向于在equals()方法中执行此操作,其中我调用两个不同对象的相同方法,其中一个this,并比较结果。

我认识那些喜欢使用this来区分super的人。没有必要这样做,当我找到它时,我会压制这种行为,因为它可能令人困惑。风险太大,以至于它将被视为“这个阶级”,而它实际上意味着“这个对象”。如果出错,可能会导致读者假设调用的方法与实际情况不同。

  

这段代码中的“this”是什么?

canvas.addGLEventListener(this);

this与其他地方的意思相同。它指的是运行包含该代码的方法的对象。如果您将该对象视为执行操作canvas.addGLEventListener(this)的actor,您可能会将效果视为将自身作为参数传递给给定方法的对象。但更正式的是,它正在将引用传递给它自己 - 它的地址,就像它一样。