所以我们大多数人都知道如何从内部类访问外部类。使用这些单词进行搜索可以提供有关该主题的大量回答问题。但我想知道的是为什么语法就是这样。
示例:
public class A
{
private class B
{
public void c()
{A.this.d();}
public void d()
{System.out.println("You called the d() in the B class! Oh noes!");}
}
public void d()
{System.out.println("You've called d()! Go, you!");}
}
为什么A.this.d()
?看起来this
是A类的静态字段,但是...... *很困惑*
如果这是重复,请原谅我;就像我说的那样,用这些词搜索会给出答案。
答案 0 :(得分:5)
非静态内部类始终与外部类的特定实例相关联。 A.this
语法只是引用此实例的一种方法。我想不出任何其他更简单或更清晰的方法。当我看到这种语法时,我的第一反应是“哎哟,丑陋”,但是当我稍微谈论它时,我意识到它非常整洁。
(是的,它看起来像访问一个静态字段,但是再次,你不能有一个静态字段this
,所以它不含糊。)
答案 1 :(得分:4)
我认为这只是澄清哪个 this
一个简单方法(因为this
,没有限定符,指的是内部this
对B
)类型的对象的引用。
由于this
是保留关键字,因此不能与类A
的某些静态字段/方法混淆。
我认为他们可以推出一些其他关键字enclosing
,让您浏览enclosing.this
(类似于super
关键字)。我不认为他们认为在这种情况下引入新关键字是必要的。
您更喜欢其他语法吗?
答案 2 :(得分:2)
为什么这样做?真的,这只是因为它的方式。它的工作原理很有意义,并且没有必要提出花哨的语法来完成这项工作。
当你看到这样的事情时:
x.y.z
.
可能意味着很多事情:
换句话说,.
重载以在Java编程语言中提供许多语法功能。它可能导致混淆,并且可能会有问题,但这就是它的方式。
遵循命名约定很有帮助,但某些事情看起来仍然含糊不清和/或令人困惑。