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() 我应该如何输入?

4

3 回答 3

6

首先,您可以简单地调用hello().

ClassA.hello()将寻找hello()在 ClassA 中命名的静态方法。ClassA.this.hello()寻找实例方法。

于 2013-06-08T21:41:53.730 回答
1

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

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

于 2013-06-08T21:47:03.350 回答
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()会发生什么?你得到你好b!

如果你从 classB 调用this.hello()会发生什么?你得到你好b!

这两个是等价的。

从 classB调用ClassA.hello()怎么样?你得到一个异常,没有声明名为 hello()的静态方法。

但是如果你从 classB调用ClassA.this.hello()呢?你得到你好!这是从内部类获取对外部类的引用的语法,如果它们都具有具有相同签名的方法,否则使用这种语法会有点多余,因为内部类已经可以访问外部类的方法。

于 2013-06-08T21:43:17.533 回答