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
метод, который вы должны создать static
class
чем вы создаете 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();
,