为什么需要使用关键字"this"来调用封闭方法或变量?

3

我有一个疑问,如果我有一个非静态嵌套类,为什么需要使用关键字“this”来调用其外部类的方法或变量? 我的理解是:如果非静态嵌套类可以访问其外部类的方法和变量,并且非静态嵌套对象实例已经与其外部对象实例相关联,那么为什么需要使用“this”? 例如,我有以下代码:

public class ClassA {

    public class ClassB {

        public void bye() {
            ClassA.this.hello();
            // Why not just ClassA.hello()?
        }
    }

    public void hello() {

    }
}

如果我想从我的封闭类的方法中调用一个非静态类的方法,我该怎么做?例如,如果我想从我的hello()方法中调用bye()方法,我应该如何输入?

1
你可以直接输入hello()。如果没有这个关键字,就会存在外部类的静态方法的歧义。 - Marcin Jedynak
1
定义在这里:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.4 - flup
3个回答

6

首先,你可以直接调用hello()

ClassA.hello()会在ClassA中查找名为hello()的静态方法。ClassA.this.hello()则是查找实例方法。


谢谢!如果我想从封闭类的一个方法调用一个非静态类的方法,应该怎么做?例如,如果我想从我的 hello() 方法中调用 bye() 方法,应该如何输入? - zer0uno
1
@antox 你需要在内部类的实例上调用它,例如 new ClassB().bye() - Paul Bellora

1

考虑这种情况,内部类和外部类都有一个具有相同签名的方法,您需要能够区分要调用哪个方法:

 public class ClassA {

    public class ClassB {

        public void hello(){
          System.out.println("Hello b!);
        }
    }

    public void hello() {
       System.out.println("Hello a!);
    }
 }

如果你从classB调用hello()会发生什么?你会得到Hello b!
如果你从classB调用this.hello()会发生什么?你会得到Hello b!
这两个是等价的。
如果你从classB调用ClassA.hello()会发生什么?你会得到一个异常,因为没有声明名为hello()的静态方法。
但是如果你从classB调用ClassA.this.hello()会发生什么?你会得到Hello a!这是获取内部类对外部类的引用的语法,如果它们都有相同签名的方法,否则使用这种语法可能会有点多余,因为内部类已经可以访问外部类的方法了。

但问题是为什么 ClassB.hello() 不足够。 - flup
那是调用静态方法的语法。但是没有声明名为hello()的静态方法。 - Zavior
在普通类中,调用名为hello()的非静态方法时,不需要键入this.hello() - flup
你是正确的。但是当你有一个内部类和一个外部类,它们都有相同签名的方法时,就会出现这种情况。这时候能够选择调用哪个方法非常重要。 - Zavior

1

ClassA.hello()如果被声明为static,则可以工作。但是因为它是一个实例方法,所以需要在实例上调用。

ClassA.this语法在JLS 15.8.4中被称为限定的this,是指引用封闭类型的this实例的唯一方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接