如何正确使用此关键字

时间:2015-12-23 20:33:50

标签: java

我在使用this关键字时感到有点困惑。我知道通常我们使用它们来在构造函数中设置参数,或者如果我们有多个构造函数,但是,下面哪种方法是正确的?

public class ResultsPage {

    private WebDriver driver;
    private JavascriptExecutor jsx;    
    private Selector selector;
    private WaitFor waitFor;
    private WebElementUtilities webElementUtilities;

    public ResultsPage(WebDriver driver) {
        this.driver = driver;
        this.webElementUtilities = new WebElementUtilities(driver);
        this.selector = new ReactSearchResultsPageSelector();
        this.waitFor = new WaitFor();            
        this.jsx = (JavascriptExecutor) driver;
    }

}

public class ResultsPage {

    private WebDriver driver;
    private JavascriptExecutor jsx;    
    private Selector selector;
    private WaitFor waitFor;
    private WebElementUtilities webElementUtilities;

    public ResultsPage(WebDriver driver) {
        // I used this here since the parameter has the same name.
        this.driver = driver;

        // I did not use this here but should I?
        webElementUtilities = new WebElementUtilities(driver);
        selector = new ReactSearchResultsPageSelector();
        waitFor = new WaitFor();            
        jsx = (JavascriptExecutor) driver;
    }

}

5 个答案:

答案 0 :(得分:2)

如果您的某个参数与其中一个成员的名称相同,则只需使用this

public class ResultsPage {

    private WebDriver driver;
    private int passenger;

    public ResultsPage(WebDriver driver) {
        // need "this" when we access driver so we are talking about the
        // member and not the parameter. Note the same line uses driver
        // without this to reference the parameter.
        //
        this.driver = driver; 

        // passenger doesn't need this because there is no confusion
        // since there is no parameter or local variable with the
        // name.
        passenger = 10;

        // but you can do it anyway of you think it is clearer...
        this.passenger *= 10; 
    }

有些人使用&#39;这个&#39;所有的时间都可以更容易地告诉意图(javac说xyz不存在,但代码是this.xyz所以我知道它应该是一个memeer而不是参数)< / p>

这是一个好主意是完全基于意见。

答案 1 :(得分:1)

this关键字是一个上下文。你基本上是在说#34;这个&#34;对象,有&#34;这个&#34;属性,具有x值。

来自Java docs

  

在实例方法或构造函数中,这是对当前对象的引用 - 正在调用其方法或构造函数的对象。您可以使用此方法在实例方法或构造函数中引用当前对象的任何成员。

但要回答你的问题:第一个例子是最常见,最一致的用法,但要么两个都可以,因为你的变量都是实例变量。

答案 2 :(得分:1)

在这种情况下,每个人都做同样的事情。但是,如果你有一个构造函数,其参数与你的类成员变量同名,那么如果你不使用&#34;这个&#34;那么你会遇到问题。关键词。 Java会影响&#34;影子&#34;变量名称意味着你的类中的变量不会被设置,你只需将传入的变量赋值给自己,你的类变量将保持为null。

请看下面的代码。在第一个构造函数中,类变量不会被赋值,因为传入的变量名是相同的,并且类变量被称为被这些名称遮蔽。要告诉Java您要将值分配给类变量而不是传入的变量,您必须指定它。

public class ResultsPage {

    private WebDriver driver;
    private JavascriptExecutor jsx;    
    private Selector selector;
    private WaitFor waitFor;
    private WebElementUtilities webElementUtilities;

    //Wrong way!!!
    public ResultsPage(WebElementUtilities webElementUtilities, Selector selector, WaitFor waitFor, JavascriptExecutor jsx) {
        webElementUtilities = webElementUtilities;
        selector = selector;
        waitFor = waitFor;
        jsx = jsx;
    }

    //Right way!!!
    public ResultsPage(WebElementUtilities webElementUtilities, Selector selector, WaitFor waitFor, JavascriptExecutor jsx) {
        this.webElementUtilities = webElementUtilities;
        this.selector = selector;
        this.waitFor = waitFor;
        this.jsx = jsx;
    }
}

答案 3 :(得分:1)

this关键字是对当前对象的引用。

Java文档:

  

在实例方法或构造函数中,这是对它的引用   当前对象 - 其方法或构造函数所在的对象   调用。您可以从内部引用当前对象的任何成员   使用它的实例方法或构造函数。

示例:

public class Foo {
    private int bar;

    public Foo(int bar) {
        // the "this" keyword allows you to specify that
        // you mean "this type" and reference the members
        // of this type - in this instance it is allowing
        // you to disambiguate between the private member
        // "bar" and the parameter "bar" passed into the
        // constructor
        this.bar = bar;
    }
}

检查:

This Keyword Question

答案 4 :(得分:0)

你的两个构造函数都是正确的。它最基于偏好。