【问题标题】:Java Inner class shadowing external class in the same .java fileJava 内部类在同一个 .java 文件中隐藏外部类
【发布时间】:2013-12-18 10:20:19
【问题描述】:

考虑:

    package test;
    class Same {
        void method() {
            System.out.println("outer");
        }
    }

    public class Main {
        class Same {
            void method() {
                System.out.println("middle");
            }
        }

    public static void main(String[] args) {
            new Same().method(); // Compile time Exception: No enclosing instance of type Main is accessible
        }
    }

我知道内部类“遮蔽”了外部类“相同”,因此会出现编译错误。我想知道是否可以在 Main 中创建一个“外部相同”的实例。如果是,如何?谢谢。

附言感谢您的回答,但是,请先尝试您建议的代码。另外,我知道如何更改代码以使其工作,我需要了解当前情况而不进行任何更改(例如将类保存在不同的文件中)。

【问题讨论】:

    标签: java inner-classes shadowing


    【解决方案1】:

    需要在包名前加上前缀(假设外层Same在测试包中):

    public static void main(String[] args) {
        new test.Same().method(); 
    }
    

    这将打印“外部”。

    【讨论】:

      【解决方案2】:

      你需要写

      new Main().new Same().method();
      

      为了实例化 Same 类,您需要 Main 类的实例。或者,您可以声明与静态类相同的类

      static class Same {...}
      

      【讨论】:

        【解决方案3】:

        重新打包顶层Same

        package outer;
        
        
         public class Same {
                public void method() {
                    System.out.println("outer");
                }
            }
        

        然后使用完全限定名称创建一个实例:

        public class Main {
            class Same {
                void method() {
                    System.out.println("middle");
                }
            }
        
            public static void main(String[] args) {
                new outer.Same().method();
            }
        }
        

        或者正如其他人提到的那样,避免在类中使用 same 名称。

        【讨论】:

          【解决方案4】:

          静态方法不能引用非静态方法,要么将非静态方法设为静态,即static class Same {...},要么创建该非静态方法的对象并从静态方法调用,即new Main().new Same().method();

          【讨论】:

            【解决方案5】:
            package somePackage;
            
            public class SO1 {
            
                class Same{
            
                }
            
                public static void main(String[] args) {
                    new somePackage.Same(); //use qualified name
                }
            }
            
            class Same{
            
            }
            

            使用外部Same 的完全限定名称,即somePackage.Same,这将允许您引用外部Same

            【讨论】:

            • @Matthias - 内部“相同”。这不是我的问题的答案。
            • 我已经给出了答案,看看吧。
            • @Narendra Pathai - 是的...编辑后的版本可以使用。
            【解决方案6】:

            错误是因为main 方法是静态的,您要么需要将Same 设为静态,要么创建一个new Main() 以在其中包含Same()

            要回答其余问题,请参阅以下示例:

            class Test {
            
                class Same {
                    void inner() {
            
                    }
                }
            
                class Nested {
                    class Same {
                        void veryInner() {
            
                        }
                    }
            
                    void doTest() {
                        new Same().veryInner();
                        new Test.Same().inner();
                    }
                }
            
                 void doTest() {
                     new Nested().new Same().veryInner();
                     new Same().inner();
                 }
            }
            

            您可以看到嵌套的阴影类确实有效,并且您只需使用正确的嵌套级别即可访问它们。

            【讨论】:

            • 正是我要写的+1。或者将 Same 放在一个名为 Same.java 的单独文件中,我知道重点是要有一个内部类,但我还是想提一下。
            • 我认为在非静态方法中它不会起作用。 'public void main1() {new Same().method();}'。这里的Same也是内在的Same。
            • 我添加了一个示例来展示您可以从两个嵌套级别访问 Same 的两个级别。
            【解决方案7】:
            class Same {
                void method() {
                    System.out.println("outer");
                }
            }
            
            public class Main {
                static class Same {
                    void method() {
                        System.out.println("middle");
                    }
                }
            
            public static void main(String[] args) {
                    new Same().method(); // Compile time Exception: No enclosing instance of type Main is accessible
                }
            }
            

            ================================================

            mainstatic 方法 你必须创建 static class 而不是创建 object

            【讨论】:

              【解决方案8】:

              你的课程在包test中,你需要做的就是使用

              new com.test.Same().method(); 
              

              如果你的类是默认的package,即。没有包声明。那你就不能访问外层的Same了。

              【讨论】:

                猜你喜欢
                • 2023-01-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多