Java Внутренний класс затеняет внешний класс в том же файле.java

Рассматривать:

    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
        }
    }

Я знаю, что Inner класс "затеняет" внешний класс "Same", поэтому я получаю ошибку компиляции. Я хотел бы знать, возможно ли создать экземпляр 'external Same' в Main. Если да, то как? Благодарю.

PS Я ценю ваши ответы, но, пожалуйста, сначала попробуйте код, который вы предлагаете. Кроме того, я знаю, как изменить код, чтобы он работал, мне нужно понять текущую ситуацию без каких-либо изменений (например, хранить классы в разных файлах).

8 ответов

Решение

Вам нужно поставить префикс с именем пакета (предположим, что внешнее Same находится в тестовом пакете):

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

Это напечатает "внешний".

Переупаковка верхнего уровня 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 название для классов.

Вам нужно написать

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

Чтобы создать экземпляр класса Same, вам нужен экземпляр класса Main. Альтернативно вы можете объявить тот же класс как статический класс

static class Same {...}
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
    }
}

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

main это static метод, который вы должны создать staticclass чем вы создаете object

Ваш класс в упаковке testвсе, что вам нужно сделать, это использовать

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

Если ваши классы по умолчанию packageт.е. нет декларации пакета. Тогда вы не можете получить доступ к внешнему Same,

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

Ошибка возникает потому, что 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();
     }
}

Вы можете видеть, что вложенные классы теневого копирования работают, и что вы можете получить к ним доступ, просто используя правильный уровень вложенности.

Статический метод не может ссылаться на нестатический метод, либо вы делаете нестатический метод статическим, т.е.static class Same {...} или создать объект этого нестатического метода и вызвать из статического метода, т.е.new Main().new Same().method();,

Другие вопросы по тегам