2013-06-19 2 views
2

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

// Класс 1

public class parent { 
static { 
     System.out.println("Parent"); 
} 
} 

// Class2

public class derived extends parent{ 
     static { 
      System.out.println("derived"); 
     } 

     public static void main(String [] args) { 

     } 
} 

В принципе у меня есть какой-то метод в родительском классе, который я хочу, чтобы наследовать, но не хотят обработку, которая происходит в родительском блоке статического произойдет, когда производный класс создается. .Есть ли способ сделать это, или мне придется дублировать код?

+2

«Нет» - это ответ. Теперь, вопрос: зачем вы хотите это сделать? – fge

+0

Похоже, плохая конструкция. Можно ли реорганизовать статический код родителя в его конструктор? – Supericy

+1

Вы действительно не хотите, чтобы статические inintialisers делали что-либо, кроме настройки констант. –

ответ

10

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

В соответствии с JLS 12.4.1:

При инициализации происходит класс или тип интерфейса Т будет немедленно инициализируется до первого вхождения любого одного из следующих действий:

• T является классом и экземпляр T создается.

• T - класс, и статический метод, объявленный T, вызывается.

• Статическое поле, объявленное T, назначается.

• Статическое поле, объявленное T, используется, и поле не является постоянной переменной (§4.12.4).

• T - класс верхнего уровня (§7.6), и выполняется утверждение (§14.10), лексически вложенное в T (§8.1.3).

+0

aka "Statics are evil". – vikingsteve

1

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

Смежные вопросы