2015-07-29 3 views
1

При расширении класса в Java я могу дать методы, которые я переопределяю более высокие или равные модификаторы доступа, но не более низкие. Ниже не будет разрешено, так как метод foo в ClassB должен быть public:Есть ли наследование модификатора доступа для конструкторов в Java?

public class ClassA { 
    public void foo() {} 
} 
public class ClassB extends ClassA { 
    @Override 
    protected void foo() {} 
} 

Кажется, что это не относится к конструкторам. Я могу сделать следующее:

public class ClassA { 
    public ClassA() {} 
} 
public class ClassB extends ClassA { 
    protected ClassB() {} 
} 

Почему это так? Существуют ли другие правила, которые также применяются к конструкторам, но не к методам?

ответ

6

Поскольку конструктор ClassB не override конструктор ClassA. Это совершенно другой метод, который вызывает (явно или неявно) конструктор класса А. Таким образом, видимость также может быть снижена.

Другой вопрос о том, что конструктор по умолчанию ClassA будет вызываться, если вы не вызывали много конструкторов класса A самостоятельно. Если ClassA не имеет одного и вы не вызываете другого в конструкторе ClassB, компилятор будет недоволен.

// This WILL call super() implicitly, without you actually having to write it 
protected ClassB() {} 

Я предполагаю, что вы уже знаете, что конструктор по умолчанию будет добавлен автоматически, если вы не пишете любой конструктор для класса вообще. (Этот конструктор по умолчанию снова просто вызовет super(), см. Выше).