繁体   English   中英

Java外部和内部类的方法名称相同:非静态方法静态上下文错误

[英]Java outer and inner classes have method with the same name: non-static method static context error

我有公共类A和内部类B。A和B的方法具有相同的名称change但具有不同的签名和返回类型。 要从B的change调用A的方法change ,我需要打印A.this.change(i, w)

为什么? 为什么我不能只打印A.change(i, w) 解决名称冲突问题还不够吗? 如果我离开A.change(i, w)而不是A.this.change(i, w)它给了我一个Non-static method 'change(int, java.lang.String)不能从静态上下文中引用`错误。

public class A  {
     private int x;
     private String y;

     A()  {
        x=5;
        y="Default";
     }

     A(int x, String y)  {
        this.x=x;
        this.y=y;
     }

     int change(int n, Strin w)  {
        x+=n;
        y+=w;
        return x;
     }

     class B  {
          private int i;

          B()  {
             i=2;
          }

          void change(String w)  {
                A.this.change(i, w);
          }
    }

要回答您的问题,包括评论:

  1. Classname.methodname是您调用static方法的方式, A#change(int, String)不表示此方法,因此编译器会为此通知您。
  2. 实例方法是在当前范围内执行的,如果您的A.this.change将是B范围,则该方法在当前范围内执行。 由于B没有方法change(int, String)您需要将java引导到要在其中执行的范围,即A#change(int, String) 为了解决这个问题,您正在编写A.this.change(intVal, stringVal) A告诉Java,您尝试执行的方法将是AA一部分。 this是区分static调用和instance调用所必需的。
  3. 为什么我们仍然不能只写A.change(intVal, stringVal )? 因为B被定义为not static所以它将显然绑定到A实例, this感觉有点多余(问题的主要部分)? 但是问问自己,区别inner-outer classes什么好处? 您可以忽略this ,但另一方面,这会降低可读性,因为您将需要检查内部类是否为static ,以便注意A.change(intVal, stringVal)是否为是否在static上下文中执行。 最终,这可以实现,但是这样做的.this是,离开.this不会超过在读取和编写内部classwa代码时需要更加谨慎的缺点。 就像我要说的那样,每个Classname.methodname应该正确地视为static调用,而不是针对此处的特定情况实现特殊情况。

我希望这个“答案”足以回答您的问题。

由于签名是不同的,因此命名上没有冲突。 无论如何, public void x(String str){}public void(int in){}被认为是不同的方法。 如果调用A.change() ,则必须将更改方法声明为静态。 进行A.this.change就像:

A a= new A();
a.change();

区别在于A.change(...)调用类A的静态方法,而A.this.change(...)调用类A的实例的方法。

试试这个例子:

public class A {
    public static void staticMethod() {
        System.out.println("-> A's static method");
    }
    public void nonStaticMethod() {
        System.out.println("-> A's non static method");
    }
    class B {
        public void test() {
            A.staticMethod();
            A.this.nonStaticMethod();
        }
    }

    public static void main(String[] args) {
        A a = new A();
        A.B b = a.new B();
        b.test();
    }
}

输出为:

-> A's static method
-> A's non static method

所以A.this引用了外部类的当前实例,而A只是外部类本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM