Java 为什么我需要使用关键字“quot;这";调用我的封闭方法或变量

Java 为什么我需要使用关键字“quot;这";调用我的封闭方法或变量,java,nested-class,Java,Nested Class,我怀疑我是否有一个非静态嵌套类,为什么我需要使用关键字“this”来调用封闭类的方法或变量? 我的想法是:如果一个非静态嵌套类可以访问其封闭类的方法和变量,并且一个非静态嵌套对象实例已经与其封闭对象实例关联,那么为什么我需要使用“this”? 例如,我有以下代码: public class ClassA { public class ClassB { public void bye() { ClassA.this.hello();

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

public class ClassA {

    public class ClassB {

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

    public void hello() {

    }
}

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

首先,您只需调用
hello()


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

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

 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()?你得到了一个问候!这是从内部类获取外部类引用的语法,如果它们都有一个具有相同签名的方法,否则使用这种语法会有点多余,因为内部类已经可以访问外部类方法

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


ClassA。此
语法在中称为限定的
this
,是引用封闭类型的
this
实例的唯一方法。

您只需键入hello()。如果没有这个关键字,外部类的静态方法就会产生歧义。定义如下:谢谢!如果从封闭类的方法调用非静态类的方法,我应该怎么做?例如,如果从方法hello()调用bye(),我应该怎么键入?@antox您需要在内部类的实例上调用它,例如
new ClassB().bye()
。但问题是为什么
ClassB.hello()
不够这是调用静态方法的语法。但是没有称为hello()declared的静态方法,您不需要键入
this.hello()
来调用普通类中称为
hello()
的非静态方法。您是正确的。但是,当您有一个内部类和一个外部类都有具有相同签名的方法时,就会出现这种情况。在这一点上,能够选择呼叫哪一个是很重要的。