【问题标题】:Java Inner class shadowing external classJava内部类阴影外部类
【发布时间】:2013-11-28 15:48:13
【问题描述】:

我从 K&B 书籍“SCJP Sun Certified Programmer for Java 6 Study Guide”中获取了以下代码:

class A { // 1
    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 { // 2
            void m() { 
                System.out.println("inner"); 
            } 
        }

    }

    class A { // 3
        void m() { 
            System.out.println("middle"); 
        } 
    }
}

如书中所述,此代码打印“中间”。我推断标记为“3”的类声明隐藏了标记为“1”的类声明,它在 TestInners 类的外部。 如果这些类位于不同的包中,我可以通过使用包名限定其中一个来解决歧义。但在这种情况下,这些类不仅在同一个包中,而且在同一个文件中。如何获取外部类的实例?

我看到了同样的问题here,但接受的答案意味着修改代码,为整个事情添加一个封闭类。我的问题是如何使用任何类型的限定符或引用来获取实例,如果可能的话。

【问题讨论】:

  • 如果它们在 any 包中,比如“p”,您可以将“p.A”用于//1,将“p.TestInners.A”用于//3。否则,我认为不可能明确地引用它们。由于您必须违反编码标准才能达到这一点(没有包的类),但这在实践中不是问题。

标签: java class shadowing


【解决方案1】:

假设你的类在包com.test中,你需要做的就是使用

new com.test.A().m();

使用类的完全限定名。

如果您的课程在默认包中,即。没有package 声明,那么你运气不好,无法访问外部A

【讨论】:

  • 如果这些类位于不同的包中,我可以通过使用包名限定其中一个来解决歧义 OP 已经知道这一点。重新阅读问题:但在这种情况下,这些类不仅在同一个包中,而且在同一个文件中。如何获取外部类的实例?
  • @LuiggiMendoza:我认为关键是即使它们在 same 包(和文件)中,这也可以。
  • @OliCharlesworth 但他没有包裹。
  • @Domi:也许吧。但在实践中绝不应该如此。
  • @LuiggiMendoza //3 的完全限定名称是<yourpackage>.TestInners.A,因此<yourpackage>.A 应该访问外部类,而您正在进行的调用仅访问“最近”类。 (包装方式)
【解决方案2】:

在 C++ 中,您可以通过在符号前加上 :: 来显式处理全局范围,但是,Java 没有这样的东西。

因此,如果您真的想获得外部 A,则必须硬着头皮做一些其他类型的封装,例如将其包装在另一个类或包中。

编辑:Here is another reason why.

【讨论】:

    【解决方案3】:

    innner-A 的对象在定义之前无法创建。所以在go() 中定义innner-A 后使用new A().m(); 来访问内部类对象。

    void go() {
    
            class A { 
                void m() { 
                   System.out.println("inner"); 
                } 
            }
            new A().m();
        }
    

    要访问outer-A,您必须附加包名,在默认包中无法访问outer-A。

    【讨论】:

      猜你喜欢
      • 2012-09-03
      • 2012-10-06
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      相关资源
      最近更新 更多