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. Возможно это и так

Получается мне действительно прийдется перекрывать эти переменные повторным объявлением для разрыва связи с предком?
  • Вопрос задан
  • 88 просмотров
Решения вопроса 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 класса, а не инстансы анонимных наследников от него.

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

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

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

Войти через центр авторизации
Похожие вопросы
Сбер Москва
от 150 000 до 320 000 ₽
Сбер Москва
от 200 000 до 260 000 ₽
Сбер Вологда
от 65 000 ₽
06 дек. 2021, в 07:47
10000 руб./за проект
06 дек. 2021, в 07:23
1000 руб./за проект
06 дек. 2021, в 07:18
1000 руб./за проект