[英]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);
}
}
要回答您的问题,包括评论:
Classname.methodname
是您调用static
方法的方式, A#change(int, String)
不表示此方法,因此编译器会为此通知您。 A.this.change
将是B
范围,则该方法在当前范围内执行。 由于B
没有方法change(int, String)
您需要将java引导到要在其中执行的范围,即A#change(int, String)
。 为了解决这个问题,您正在编写A.this.change(intVal, stringVal)
。 A
告诉Java,您尝试执行的方法将是A
类A
一部分。 this
是区分static
调用和instance
调用所必需的。 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.