代码之家  ›  专栏  ›  技术社区  ›  amara

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

  •  7
  • amara  · 技术社区  · 15 年前

    所以我们大多数人都知道 怎样 从内部类访问外部类。用这些词进行搜索时,会出现大量关于该主题的回答问题。但我想知道的是为什么语法是这样的。

    例子:

    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 回复  |  直到 15 年前
        1
  •  2
  •   polygenelubricants    15 年前

    为什么这样做?真的,这只是因为它是这样的。它可以工作,有点道理,而且不需要想出花哨的语法来完成这项工作。

    当你看到这样的东西时:

    x.y.z
    

    这个 . 可能意味着很多事情:

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

    也就是说, . 超载 在Java编程语言中提供许多语法功能。这可能会导致混乱,也可能有问题,但事实就是这样。

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

    也见

        2
  •  5
  •   JesperE    15 年前

    非静态内部类总是与外部类的特定实例相关联。这个 A.this 语法只是引用这个实例的一种方法。我想不出任何其他更简单或更清楚的方法来做这件事。当我看到这个语法时,我的第一反应是“哎哟,难看”,但当我稍微考虑一下它的时候,我意识到它非常整洁。

    (是的,它看起来像是访问一个静态字段,但同样,您不能有一个静态字段 this ,所以不会模棱两可。)

        3
  •  4
  •   aioobe    15 年前

    我认为这只是一种简单的澄清方法 哪一个 this 一种方法(自 如果没有限定符,则表示内部 它是对类型为的对象的引用 B )

    自从 是保留关键字,不能与类的某些静态字段/方法混淆 A .

    我想他们可以介绍一些其他的关键词,比如 enclosing 让你通过 enclosing.this (类似于 super 关键字)。我只是不认为他们认为在这种情况下引入一个新的关键字是必要的。

    您喜欢其他语法吗?