“返回名称”有什么区别?并“返回this.name”

时间:2017-07-21 20:31:43

标签: java junit jacoco

我正在尝试Jacco测试,并且我能够从名为getStudentId的类中测试Student,该类具有:

public String getStudentId() {
    return studentId;
}

当我尝试测试名为Product的其他类时,我收到错误 - 两者之间的唯一区别在于getX方法。 getName的{​​{1}}方法是:

Product

并显示错误消息:

  

构造函数类Product中的产品不能应用于给定类型

3 个答案:

答案 0 :(得分:2)

关键字this引用您当前所在的对象的实例。想象一下这样的课程:

public class A {
    private String property;

    public void changeProperty(String property) {
        this.property = property
    }
}

在方法之外,变量名称属性不明确,并引用类A的成员变量。但是方法changeProperty中的含糊不清是因为还有名为 property 的参数。

Java 如何解决此冲突?如果只键入property,则始终引用具有较小范围的对象,因此方法的参数而不是成员变量。通过使用this.property,您可以再次引用成员变量。

如果您的对象中没有此类冲突(例如您的示例),那么您不需要语句,而this.namename相同。< / p>

然而,作为一个非常讨厌的错误的预防,在引用成员变量时总是可以使用this,这也是一种很好的做法。想象一下,你将来会创建一个具有这种名称冲突的方法而忘记成员变量,哎呀你很容易创建一个难以调试的bug。

一些程序员甚至更进一步,总是给成员变量以外的名字而不是参数,以防止这种名称冲突。例如,成员变量通常命名为:

  • mProperty
  • _property

请注意,方法 this(...)引用自己对象的构造函数。它可以在构造函数中用于将任务传递给另一个构造函数,如:

public class A {
    public A(String fileName) {
        this(new File(fileName), true);
    }

    public A(File file) {
        this(file, true);
    }

    public A(File file, boolean doSomething) {
        // Code ...
    }
}

类似地,还有引用父类的关键字super。例如:

public class A {
    protected String property;
}

public class B extends A {
    private String property;

    public void foo() {
        // Property of B
        System.out.println(property);
        // The same
        System.out.println(this.property);

        // Property of A
        System.out.println(super.property);
    }
}

此关键字也可用于引用 parent-constructor 或父类的其他方法。

总而言之,只是解决此类名称冲突

现在我们知道,很容易看到您发布的代码不包含错误

答案 1 :(得分:1)

使用this.name时,您使用的是属性名称中定义的属性。但是,当您仅使用名称时,它可以是代码中所谓的任何变量,甚至是属性。例如:

   public String getName(){
    String name = "Mery";
    this.name = "Jacob";
    return name;
   }

此方法返回值“Mery”。如果你输回this.name然后你返回值“雅各布”。

答案 2 :(得分:0)

您有可能将studentID设置为公共变量。无论何时你使用this.whatever从getX函数返回一个变量,这个。暗示它是一个私有变量。更有可能学生ID是公开的,这就是为什么你没有'这个'。在它面前。