【问题标题】:Passing this as a parameter将此作为参数传递
【发布时间】:2012-06-29 04:42:29
【问题描述】:

我见过将关键字this 作为输入参数传递的代码。 例如:

getContainer(this);

关键字this 是什么意思?我听说它指的是类本身的一个实例(或类似的东西),但它是如何工作的?

【问题讨论】:

  • 这是一个参数,而不是一个参数。

标签: java parameters this keyword


【解决方案1】:

From 15.8.3 of the java specification:

关键字 this 只能用在实例方法的主体中, 实例初始化器或构造器,或在 类的实例变量。如果它出现在其他任何地方, 发生编译时错误。当用作主要表达式时, 关键字 this 表示一个值,它是对对象的引用 实例方法被调用(§15.12),或被调用的对象 建造。 this 的类型是关键字所在的 C 类 发生这种情况。在运行时,引用的实际对象的类 可以是 C 类或 C 的任何子类。

[...]

关键字 this 也用于特殊的显式构造函数 调用语句,可以出现在语句的开头 构造函数主体(第 8.8.7 节)。

是的,一个类可以使用 this 关键字来引用自己。当方法中的局部变量与类成员变量同名时,也需要this 关键字,以区分两者。

【讨论】:

    【解决方案2】:

    this 指的是当前实例,其方法已被调用,

    所以它将引用传递给调用该成员方法的当前实例

    class MyRunnable implements Runnable {
        Thread t;
        public MyRunnable() {
            this.t = new Thread(this); //here it passes reference to current instance of `Runnable`
        }
    
        public void run() {
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      this也可以传递调用类的实例给被调用类。 例如

      public class Caller{
              public void callerClassMethod1(){
                  new Called(this).
              }
      
              public void callerClassMethod2(){
              }
          }
      
      class Called{
          private Caller caller;
          public Called(Caller caller){
             this.caller=caller;
          }
          public void calledClassMethod1(){
              //.... Do something before
              caller.callerClassMethod2();
              //..... Do something after        
      
          }
      }
      

      这样您可以分离 2 个类的职责,同时保持它们耦合。

      【讨论】:

        【解决方案4】:

        在 java 中,我们有类并创建这些类的实例(对象)。因此,当对象需要指向或引用自身时,就会使用 this 关键字。

        【讨论】:

          猜你喜欢
          • 2017-12-12
          • 2023-03-08
          • 2012-02-07
          • 1970-01-01
          • 2013-08-09
          • 1970-01-01
          • 2019-03-26
          • 2020-09-18
          • 2015-05-24
          相关资源
          最近更新 更多