从内部类访问外部类:为什么这样做?

时间:2010-05-08 06:16:20

标签: java syntax

所以我们大多数人都知道如何从内部类访问外部类。使用这些单词进行搜索可以提供有关该主题的大量回答问题。但我想知道的是为什么语法就是这样。

示例:

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类的静态字段,但是...... *很困惑*

如果这是重复,请原谅我;就像我说的那样,用这些词搜索会给出答案。

3 个答案:

答案 0 :(得分:5)

非静态内部类始终与外部类的特定实例相关联。 A.this语法只是引用此实例的一种方法。我想不出任何其他更简单或更清晰的方法。当我看到这种语法时,我的第一反应是“哎哟,丑陋”,但是当我稍微谈论它时,我意识到它非常整洁。

(是的,它看起来像访问一个静态字段,但是再次,你不能有一个静态字段this,所以它不含糊。)

答案 1 :(得分:4)

我认为这只是澄清哪个 this一个简单方法(因为this,没有限定符,指的是内部thisB)类型的对象的引用。

由于this是保留关键字,因此不能与类A的某些静态字段/方法混淆。

我认为他们可以推出一些其他关键字enclosing,让您浏览enclosing.this(类似于super关键字)。我不认为他们认为在这种情况下引入新关键字是必要的。

您更喜欢其他语法吗?

答案 2 :(得分:2)

为什么这样做?真的,这只是因为它的方式。它的工作原理很有意义,并且没有必要提出花哨的语法来完成这项工作。

当你看到这样的事情时:

x.y.z

.可能意味着很多事情:

  • 子包装分隔符
  • 会员字段访问
  • 嵌套类型分隔符

换句话说,. 重载以在Java编程语言中提供许多语法功能。它可能导致混淆,并且可能会有问题,但这就是它的方式。

遵循命名约定很有帮助,但某些事情看起来仍然含糊不清和/或令人困惑。

另见