对象实例化:内部class和外部class同名(Java)
Object instantiation: Inner class and outer class with the same name (Java)
代码描述和输出
在下面的代码中。我们有一个classTestInners,一个innerclass一个,一个方法local innerclassA和一个外层classA.
- 当我们像
new A().m();
那样实例化一个对象时,输出是
中间.
- 为了让程序输出inner我们必须在go[=39中的local inner classA方法之后实例化对象=]方法。
- 如果我们注释内部 class 程序将输出 outer.
问题
按原样在代码中。为什么它输出中间?是否优先考虑内部 classes?那么外面的 classes 呢?我一头雾水。
源代码
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"); } }
}
是的,如果您使用更多本地定义隐藏符号,the more local one is chosen。这最常发生在方法参数与实例字段之间,导致著名的 this.name = name
习语。
对于您的情况,您可以使用完全限定的 class 名称访问外部 class。
但不要这样命名 class。无缘无故的太多了。
代码描述和输出
在下面的代码中。我们有一个classTestInners,一个innerclass一个,一个方法local innerclassA和一个外层classA.
- 当我们像
new A().m();
那样实例化一个对象时,输出是 中间. - 为了让程序输出inner我们必须在go[=39中的local inner classA方法之后实例化对象=]方法。
- 如果我们注释内部 class 程序将输出 outer.
问题
按原样在代码中。为什么它输出中间?是否优先考虑内部 classes?那么外面的 classes 呢?我一头雾水。
源代码
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"); } }
}
是的,如果您使用更多本地定义隐藏符号,the more local one is chosen。这最常发生在方法参数与实例字段之间,导致著名的 this.name = name
习语。
对于您的情况,您可以使用完全限定的 class 名称访问外部 class。
但不要这样命名 class。无缘无故的太多了。