为什么我需要使用关键字“this”来调用我的封闭方法或变量

时间:2013-06-08 21:38:08

标签: java nested-class

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

public class ClassA {

    public class ClassB {

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

    public void hello() {

    }
}

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

3 个答案:

答案 0 :(得分:6)

首先,您只需致电hello()

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

答案 1 :(得分: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()的 static 方法。

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

答案 2 :(得分:1)

如果ClassA.hello()被声明为hello(),则

static会有效。但是因为它是实例方法,所以需要在实例上调用它。

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