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

时间:2017-03-08 10:47:58

标签: java oop

我有公共类A和内部类B.A和B有一个名称为change但具有不同签名和返回类型的方法。要从B&#39 {s} change调用方法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);
          }
    }

3 个答案:

答案 0 :(得分:2)

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

  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您尝试执行的方法将成为类A的一部分。 this是区分staticinstance来电所必需的。
  3. 为什么我们还不能写A.change(intVal, stringVal)? 好的B定义为not static,它显然会绑定到A个实例,this感觉有点多余(问题的主要部分)?但问问自己,区分inner-outer classes有什么好处?你可以省略this是的,但另一方面你会降低可读性,因为你需要检查内部类是否为static以便注意A.change(intVal, stringVal)是否static 1}}将在.this上下文中执行。最后这可以实现,但是这样做的好处就是离开Classname.methodname时不会超越在阅读和编写内部classwa代码时需要更加小心的缺点。并且好像我会说每个static应该被正确地视为df %>% inner_join(df, by="ID") %>% group_by(Name.x, Institute.x) %>% summarise(UniqueCount = n_distinct(Name.y, Institute.y)) # Source: local data frame [5 x 3] # Groups: Name.x [?] # # Name.x Institute.x UniqueCount # <fctr> <fctr> <int> # 1 Nicholas K Foster AXB 3 # 2 Sean F Williamson PSDZ 2 # 3 Steven D Debauche BSC 1 # 4 Tom D Frost ASA 4 # 5 William J Hardy BSC 3 调用,而不是在这里为特定情况实现特殊情况。
  4. 我希望这个“回答”足以回答你的问题。

答案 1 :(得分:1)

由于签名不同,命名方面没有冲突。无论如何,public void x(String str){}public void(int in){}被视为不同的方法。如果您致电A.change(),则必须将更改方法声明为静态。执行A.this.change就像:

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

答案 2 :(得分:1)

区别在于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只是外部类本身。