Trame2771
@Trame2771

Static члены не копируют своих данных даже в наследниках?

class A {
	public static int i = 10;
	public static void printI() {
		System.out.println(i);
	}
}

class B extends A {
	public static void changeI() {
		i++;
	}
}

public class Main {
	public static void main(String[] args) {
		A a = new A();
		B b = new B();
		
		a.printI();
		b.printI();
		
		b.changeI();
		
		a.printI();
		b.printI();
	}
}


Вывод:
10
10
11
11

Просто я думал, зачем же нужен в enum valueOf(). Разобрался. Предположил, что метод хранит в себе строковое представление констант, а затем сравнивает вводные данные с ними. Но так как я знаю, что константы в enum это анонимные классы, то мне показалось неоптимизированным, что в них тоже доступен это метод (наследуется). Я по началу думал, что наследование неявных методов подконтрольно java. Возможно это и так

Получается мне действительно прийдется перекрывать эти переменные повторным объявлением для разрыва связи с предком?
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
Vamp
@Vamp
Static члены не наследуются, верно. Так как это бессмысленно.

Просто я думал, зачем же нужен в enum valueOf(). Разобрался. Предположил, что метод хранит в себе строковое представление констант, а затем сравнивает вводные данные с ними.

Метод valueOf() ничего не хранит и компилятор подставляет одинаковую реализацию valueOf() во всех enum'ах:

public enum Hello {
    FIZZ, BUZZ;

    // Данный метод автоматически генерируется компилятором.
    // Для любого enum'а.
    public static Hello valueOf(String name) {
        return Enum.valueOf(Hello.class, name);
    }
}


А внутри Enum.valueOf обычный HashMap<String, Hello>, где ключом является имя константы, а значением соответствующий инстанс класса Hello. Не могу согласиться, что этот вариант плох с точки зрения оптимизации.

Но так как я знаю, что константы в enum это анонимные классы

Это не так. Константы - это конкретные инстансы вашего enum класса, а не инстансы анонимных наследников от него.

Получается мне действительно прийдется перекрывать эти переменные повторным объявлением для разрыва связи с предком?

Не очень понял суть вопроса. Чтобы разорвать связь с предком нужно просто удалить наследование от него.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы