2

考虑:

    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 中创建一个“外部相同”的实例。如果是,如何?谢谢。

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

4

8 回答 8

4

您需要以包名作为前缀(假设外部 Same 在测试包中):

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

这将打印“外部”。

于 2013-12-18T10:28:43.307 回答
1

你需要写

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

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

static class Same {...}
于 2013-12-18T10:25:06.937 回答
1

重新包装顶层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类的名称。

于 2013-12-18T10:30:29.117 回答
0

错误的出现是因为该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();
     }
}

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

于 2013-12-18T10:21:07.197 回答
0
package somePackage;

public class SO1 {

    class Same{

    }

    public static void main(String[] args) {
        new somePackage.Same(); //use qualified name
    }
}

class Same{

}

对 external 使用完全限定的名称Same,这somePackage.Same将允许您引用 externalSame

于 2013-12-18T10:24:04.883 回答
0

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

于 2013-12-18T10:24:11.367 回答
0
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

于 2013-12-18T10:28:16.040 回答
0

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

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

如果您的课程是默认的package,即。没有包声明。然后您无法访问外部Same.

于 2013-12-18T10:35:52.880 回答