我知道这this
是指当前的对象.但我不知道什么时候才能真正使用它.例如,如果我使用x
而不是this.x
在某些方法中,会有什么区别吗?可能x
会引用一个考虑方法的局部变量?我的意思是仅在此方法中看到的变量.
怎么样this.method()
?我可以用吗?我应该用它吗?如果我只是使用method()
,默认情况下它不会应用于当前对象吗?
Wil*_*del 325
该this
关键字主要用于三种情况.第一个也是最常见的是在setter方法中消除变量引用的歧义.第二种是当需要将当前类实例作为参数传递给另一个对象的方法时.第三种方法是从构造函数中调用备用构造函数.
案例1:使用this
来消除歧义变量引用.在Java setter方法中,我们通常传入一个与我们试图设置的私有成员变量同名的参数.然后我们将参数赋值x
给this.x
.这清楚地表明您将参数"name"的值赋给实例变量"name".
public class Foo
{
private String name;
public void setName(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
情况2:使用this
作为参数传递给另一个对象.
public class Foo
{
public String useBarMethod() {
Bar theBar = new Bar();
return theBar.barMethod(this);
}
public String getName() {
return "Foo";
}
}
public class Bar
{
public void barMethod(Foo obj) {
obj.getName();
}
}
Run Code Online (Sandbox Code Playgroud)
案例3:使用this
调用备用构造.在评论中,trinithis正确地指出了另一种常见用法this
.如果在单个类中有多个构造函数,则可以使用它this(arg0, arg1, ...)
来调用您选择的另一个构造函数,前提是您在构造函数的第一行中执行此操作.
class Foo
{
public Foo() {
this("Some default value for bar");
//optional other lines
}
public Foo(String bar) {
// Do something with bar
}
}
Run Code Online (Sandbox Code Playgroud)
我还看到this
过去曾经强调过引用一个实例变量这一事实(不需要消除歧义),但在我看来这是一种罕见的情况.
Chr*_*bek 68
第二个重要用途this
(除了隐藏了一个局部变量,就像许多答案已经说过的那样)是从嵌套的非静态类访问外部实例时:
public class Outer {
protected int a;
public class Inner {
protected int a;
public int foo(){
return Outer.this.a;
}
public Outer getOuter(){
return Outer.this;
}
}
}
Run Code Online (Sandbox Code Playgroud)
fro*_*die 45
当只有this
一个具有相同名称的重叠局部变量时,您只需要使用- 并且大多数人只使用它.(例如,Setter方法.)
当然,使用的另一个好理由this
是它会导致在IDE中弹出intellisense :)
Ada*_*son 23
唯一需要使用this.
限定符的是当前作用域中的另一个变量共享同一个名称并且您想要引用实例成员(如William描述).除此之外,x
和之间的行为没有区别this.x
.
小智 15
从另一个构造函数调用时,"this"也很有用:
public class MyClass {
public MyClass(String foo) {
this(foo, null);
}
public MyClass(String foo, String bar) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
Kie*_*xon 11
this
在构建器模式中很有用.
public class User {
private String firstName;
private String surname;
public User(Builder builder){
firstName = builder.firstName;
surname = builder.surname;
}
public String getFirstName(){
return firstName;
}
public String getSurname(){
return surname;
}
public static class Builder {
private String firstName;
private String surname;
public Builder setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public Builder setSurname(String surname) {
this.surname = surname;
return this;
}
public User build(){
return new User(this);
}
}
public static void main(String[] args) {
User.Builder builder = new User.Builder();
User user = builder.setFirstName("John").setSurname("Doe").build();
}
}
Run Code Online (Sandbox Code Playgroud)
除非你有重叠的变量名称,否则当你阅读代码时,它只是为了清晰起见.
有很多好的答案,但还有另一个非常小的理由可以放在this
任何地方.如果您尝试从普通文本编辑器(例如记事本等)打开源代码,使用this
将使阅读更加清晰.
想象一下:
public class Hello {
private String foo;
// Some 10k lines of codes
private String getStringFromSomewhere() {
// ....
}
// More codes
public class World {
private String bar;
// Another 10k lines of codes
public void doSomething() {
// More codes
foo = "FOO";
// More codes
String s = getStringFromSomewhere();
// More codes
bar = s;
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用任何现代IDE都可以清楚地看到这一点,但这将是用常规文本编辑器阅读的完全噩梦.
在foo
使用编辑器的"查找"功能之前,您将很难找到驻留的位置.然后你会getStringFromSomewhere()
因同样的原因尖叫.最后,在你忘记了什么之后s
,那bar = s
会给你最后的打击.
比较一下:
public void doSomething() {
// More codes
Hello.this.foo = "FOO";
// More codes
String s = Hello.this.getStringFromSomewhere();
// More codes
this.bar = s;
}
Run Code Online (Sandbox Code Playgroud)
foo
是在外部类中声明的变量Hello
.getStringFromSomewhere()
也是在外部类中声明的方法.bar
属于World
class,并且s
是在该方法中声明的局部变量.当然,无论何时设计某些东西,都可以创建规则.所以在设计你的API或项目,如果你的规则包括"如果有人打开所有这些源代码中有一个记事本,他或她应该拍他/她的头,"那么你是完全罚款不去做这个.
归档时间: |
|
查看次数: |
186486 次 |
最近记录: |