【问题标题】:this.method() is referring to?this.method() 指的是什么?
【发布时间】:2013-11-04 13:13:21
【问题描述】:

我对@9​​87654321@ 声明有疑问。 假设我在这里有这段代码(非常愚蠢和无用,但传达了信息):

class Calculate{
int x,y;
final int g = 5;

   //Constructor
   public Calculate(int a, int b) {
      x = a; y = b;
   }

   public int sumAddG() {
     return (x+y+g);
   }

   //comparing method
   public boolean same(Calculate in) {
     if(this.sumAddG() == in.sumAddG()) { // <-- This is what I am curious about
       return true;
     } else {
       return false;
   }
}

那么我的代码对吗?当我使用this.SumAddG() 时 - 我是指使用 this 类实例的 instance variables 方法 SumAddG() 的结果吗?

【问题讨论】:

  • 您不能在静态上下文中使用 this 关键字。这会产生编译错误。
  • 好的,去掉静态的^^现在?
  • 只有一个参数的静态比较方法没有多大意义...
  • 啊啊啊啊! >.
  • 我还将 same 更改为以下内容:public boolean same (Calculate in) { return this.sumAddG() == in.sumAddG(); }

标签: java this


【解决方案1】:

this 指的是其same() 方法已被调用的实际实例。例如。取以下代码:

Calculate a = new Calculate(0, 3);
Calculate b = new Calculate(0, 4);
boolean calcFlag = a.same(b);

在这种情况下,same() 方法中的this 将引用a,而in 将引用b

此行的更新: if(this.sumAddG() == in.sumAddG()) { //

你有一个布尔方法。在if 中,您正在评估一个布尔表达式,如果表达式本身为真,则返回一个布尔真值。这可以通过简单地编写来简化

return this.sumAddG() == in.sumAddG();

这将直接返回对两个实例相等性的评估。通常,在布尔方法的情况下,在返回行中评估表达式被认为是一种很好的做法,同时在一个

if (<*any boolean expression*>) {
  return true;
} else {
  return false;
}

结构被认为是不好的做法。

【讨论】:

  • 所以如果我说想引用这个类的当前实例中使用变量的计算方法就是简单的写 if(Calculate.sumAddG() == in.sumAddG()) {然后}...?
  • Calculate是类名,其中a是一个实例,b是另一个实例。由于sumAddG() 不是静态的,因此您不能调用Calculate.sumAddG(),只能调用a.sumAddG()b.sumAddG()(或分别为this.sumAddG()in.sumAddG(),如果您在same() 的方法主体内。考虑不同的实例作为不同intertiae的起源。如果您调用a.same(b),则a.same()内部this指的是ain指的是b。但是,如果您调用b.same(a)b将由this 引用,a 将由in 引用。
  • 所以给定上面的代码,如果我输入:a.same(b);我将 A 与 B 进行比较,其中 b.same(a) 我将 B 与 A 进行比较,(实际上相同但在幕后发生的事情不同。实现对吗?)
  • 是的,没错。通常,这就是为什么 Objectequals() 方法被覆盖,以声明两个对象在语义上相等的时间。
  • 噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢! ^^
【解决方案2】:

代码中有多个问题:

  1. 您在静态方法中使用this.this. 指的是您的类的当前实例(您所在的计算实例),静态方法属于该类,而不是实例
  2. 您将 sumAddG() 称为属性成员 (in.SumAddG),这是错误的,因为 SumAddG 是一个方法。

在您的示例中,如果您希望在自己的类实例中调用该方法,则可以使用this.,但如果您希望在另一个实例in 上调用它,则可以将其称为in.sumAddG()

在静态方法中,不能使用this,因为静态成员不属于实例,属于类,因此无法识别this,因为当前实例不存在。

但是,如果您在同一个类中有一个方法,并且您想从静态方法调用它,那么另一个方法也必须是静态的,您可以将其调用为:Calculate.MyStaticMethod()

如果您的方法不是静态的,那么 this.sumAddG() == in.sumAddG() 实际上会比较在您的实例中调用 sumAddG() 和在 in 实例上调用 sumAddG() 的返回值。

【讨论】:

    【解决方案3】:

    您的代码的当前状态(您的编辑很难遵循)按您的预期工作。

    this 指的是你所在的类的实例,所以this.sumAddG() 的结果使用了上述字段的当前值。 in.sumAddG() 使用实例in 的字段,指定为方法same() 的参数。

    远程相关:

    仅供参考,这里不需要使用this,因为它是普通调用sumAddG() 的默认行为。这意味着您的 if 语句可能是:

    if (sumAddG() == in.sumAddG()) { ... }
    

    【讨论】:

      【解决方案4】:

      this 关键字是指您当前所在的班级。 因此,在您编写的示例类中,如果您声明一个实例变量,请计算。然后在 IF 语句条件中,您可以通过将 this 关键字放在它前面来引用它,例如:this.in 并通过调用来引用方法的参数: 在

      【讨论】:

        【解决方案5】:

        this 关键字是指您在其中使用它的类的实例。

        在您展示的示例中,this.sumAddG() 指的是Calculate 类实例的方法。由于您指的是 类实例,因此您不能在静态上下文中使用 this

        【讨论】:

        • 所以如果我说想引用这个类的当前实例中使用变量的计算方法就是简单的写 if(Calculate.sumAddG() == in.sumAddG()) {然后}...?
        • 使用 Calculate.sumAddG() 将不起作用,除非类计算是静态的。如果您想从类外部调用该方法,您可以做的是创建该类的实例。从我所见,没有静态方法的更新代码应该可以工作,但我还没有测试过。此外,您可以删除“this”,它应该可以正常工作。
        【解决方案6】:

        this 始终指代类实例this.method() 与返回值无关。某些方法没有要返回的值。

        意思是:请编译器调用这个类的实例成员方法 我。

        【讨论】:

          猜你喜欢
          • 2011-09-26
          • 2018-03-11
          • 2011-05-19
          • 2018-09-24
          • 2015-01-16
          • 1970-01-01
          相关资源
          最近更新 更多