对象实例化:具有相同名称的内部类和外部类(Java)

Han*_*Goc 1 java inner-classes

代码描述和输出

在以下代码中.我们有一个类TestInners,一个内部类 A,一个方法局部内部类A和一个外A级.

  1. 当我们实例化一个对象时,就像new A().m();输出 中间一样.
  2. 为了让程序输出内部,我们必须在go方法中的方法本地内部类A之后实例化对象.
  3. 如果我们评论内部类,程序将输出外部.

在代码中.为什么输出中间?首先是对内部类的偏好吗?那么外类呢?我很困惑.


源代码

   class A { void m() { System.out.println("outer"); } }

    public class TestInners {
        public static void main(String[] args) {
            new TestInners().go();
        }
        void go() {
            new A().m();
            class A { void m() { System.out.println("inner"); } }

        }
        class A { void m() { System.out.println("middle"); } }
    }
Run Code Online (Sandbox Code Playgroud)

Thi*_*ilo 5

是的,如果您使用更多本地定义影子符号,则选择的本地符号越.最常见的是方法参数与实例字段,导致着名的this.name = name习语.

在您的情况下,您可以使用完全限定的类名来访问外部类.

但是不要那样命名类.无缘无故太混乱了.

  • 我甚至会说"避免在完全不同的包装中使用相同名称的类".像`java.util.List`,`java.awt.List`,`com.mypackage.List`之类的东西只会扰乱自动完成并使事情更难阅读(必须挖掘导入以查看正在使用的内容) ).我认为我们在Stackoverflow上遇到了由List/List(或Data/sql.Date)引起的一些问题. (3认同)
  • 或者说另一种方式:只有在你故意试图[混淆](https://en.wikipedia.org/wiki/Obfuscation_(软件))代码时才这样做. (2认同)
  • 甚至不要考虑命名类与`java.lang`中的东西相同.`com.mypackage.String` :-( (2认同)
  • @javaguy:关于名称解析的语言规范:http://stackoverflow.com/questions/12931146/using-an-inner-class-name-and-an-object-name-same-in-java?rq = 1 (2认同)
  • @javaguy JVM与名称阴影无关.然而,JLS(Java语言规范)将定义这样的规则.如果你打开[JLS](https://docs.oracle.com/javase/specs/jls/se8/html/index.html)和**搜索**for shadow`,你会很快找到相关的规范(§6.4).这被称为*研究*,是所有程序员都应该学习的非常有价值的技术. (2认同)