【问题标题】:Confused about "this" operator in Java对 Java 中的“this”运算符感到困惑
【发布时间】:2011-10-02 18:13:10
【问题描述】:

虽然我试图理解为什么需要“this”,但我对它的用途感到非常困惑。例如,我编写了以下代码:

public static void main (String args[])
{
    SandboxClass1 temp = new SandboxClass1(1,2,3);  
    System.out.println(temp.getX());
    System.out.println(temp.getY());
    System.out.println(temp.getZ());

    System.out.println("----------------------------");

    SandboxClass1 temp2 = new SandboxClass1(4,5,6);
    System.out.println(temp2.getX());
    System.out.println(temp2.getY());
    System.out.println(temp2.getZ());
}

public class SandboxClass1 
{

private int x = 1;
private int y = 1;
private int z = 0;

public SandboxClass1(int x, int y, int zz)
{
    this.x = x;
    this.y = y;
    z = zz;
}

public int getX()
{
    return(this.x);
}

public int getY()
{
    return(this.y);
}

public int getZ()
{
    return(this.z);
}

}

为什么我需要编码“this.z = zz”
什么时候我也可以写“z = zz”?

【问题讨论】:

  • 对于zzz,您不需要this
  • 在不强制的地方使用它,比如在你的 getter 中,只是编码风格的问题。

标签: java this operator-keyword


【解决方案1】:

在这种情况下,你不知道。只有在必须消除歧义时才必需,例如当参数和实例变量共享名称时。

有些人更喜欢使用“this”来消除概念上的歧义,并明确声明代码引用了一个实例变量。

(顺便说一句,返回值周围的括号是不必要的,而且有点吵,IMO。)

【讨论】:

    【解决方案2】:

    在 SandboxClass1 构造函数中,有两对变量,每对变量分别称为 x 和 y。在对象本身上声明了 x 和 y(“private int x = 1”),以及作为构造函数参数的单独 x 和 y(“int x”)。

    局部(参数)变量遮蔽类变量。所以如果在构造函数中你刚刚做了

    x = x;
    

    分配没有任何效果。

    关键字this 是对调用方法/构造函数的对象的引用。在声明中

    this.x = x;
    

    您正在使用它在班级级别分配给其他 x。通过限定名称,您可以区分它们。

    没有必要在 z/zz 分配中使用 this,因为它们有不同的名称。

    在 getX/Y/Z 方法中也没有必要,因为这些方法中没有局部变量会影响相关的类变量。不过也无妨。

    【讨论】:

    • 示例中没有任何内容属于“类”级别;也就是说,示例变量都不是类变量。示例中的变量是实例变量,而不是类变量。
    【解决方案3】:

    SandboxClass1 构造函数中,两个参数(xy)隐藏了类变量,因为它们同名。如果要在代码>SandboxClass1 构造函数中将类变量 x 分配给任何值,则必须使用this.x 来告诉编译器“我要分配名为 x 的类范围变量,而不是方法范围变量名为 x"。这同样适用于 y。

    由于参数z 没有隐藏名为zz 的类作用域变量,因此您无需告诉编译器zz 变量的作用域,类作用域zz 是唯一可识别的变量,因此被分配。

    【讨论】:

      【解决方案4】:

      效果是一样的。如果存在覆盖类字段的局部变量,则需要this;那么你得到的是局部变量而不是类字段。

      您可以更好地指示变量的另一个优势。如果有this;这是一个领域;否则为局部变量。

      【讨论】:

        【解决方案5】:

        关键字 this 用于引用类中的属性。创建关键字 this 是为了区分类属性和方法参数。像这样:

        public class human
        {
            public void setName(String name)
            {
                // the first name is a reference to the class attribute name
                this.name = name;
                // the second name is a reference to the method parameter name
            }
        
            // definition of the class attribute name
            private String name;
        }
        

        当您使用关键字 this 时,它指的是类中的 name 变量,这是一个您不需要使用 this 的示例:

        public class Human
        {
            public void setName(String myName)
            {
                name = myName
            }
        
            private String name;
        }
        

        现在看到只有 1 个名为 name 的变量,并且只有一个名为 myName 的变量。在另一个示例中,有 2 个名为 name 的变量。一个是类属性,一个是方法参数。

        【讨论】:

          【解决方案6】:

          'this' 运算符只是细化属性/字段属于您正在使用的类。例如,如果您有两个具有相同名称的变量,这很有用:

          this.zz = zz;
          

          【讨论】:

            【解决方案7】:

            不像Objective-C,当方法或变量是本地的并且没有其他冲突使用相同名称时,“this”是可选的。

            不过,它在名称冲突的情况下会派上用场,例如在设置实例变量的方法中,例如 void setOnionCount(int onionCount),您希望在形式参数中使用“onionCount”但仍将“onionCount”作为实例变量的名称。在这种情况下,您可以使用 this.onionCount = onionCount; 并且每个人都很高兴(我想花生画廊中会反对这种技术的人除外)。

            当然,在您需要将对当前对象的引用传递给其他类的情况下,“this”也是绝对必要的。

            【讨论】:

              【解决方案8】:

              嘿,这是用来提供调用对象的引用。也就是说,假设你的类是盒子,那么如果你想提供它的对象,那么你可以使用 this 关键字在类盒子中提供它。

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

              在这种情况下,如果您的对象是 ob(即 Box ob = new Box(1)),那么它的引用将被传递给它本身。 注意:您不能在课程之外使用此关键字。如果您使用它,那么它将提供另一个类的参考。 有关此关键字的完整详细信息,请参阅以下链接 http://download.oracle.com/javase/tutorial/java/javaOO/thiskey.html

              【讨论】:

                猜你喜欢
                • 2011-06-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-09-21
                • 1970-01-01
                • 2015-08-04
                相关资源
                最近更新 更多