我有公共类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);
}
}
答案 0 :(得分:2)
回答您的问题,包括评论:
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
的一部分。 this
是区分static
和instance
来电所必需的。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
调用,而不是在这里为特定情况实现特殊情况。我希望这个“回答”足以回答你的问题。
答案 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
只是外部类本身。