Модификатор доступа конструктора абстрактного класса

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

26
задан Joshua Taylor 31 July 2013 в 20:27
поделиться

4 ответа

, так как абстрактный тип, кажется, указывает, что технически общедоступный конструктор будет действовать очень защищенный

, Это не корректно. Абстрактный класс не может быть непосредственно instatiated путем вызова его конструктора, однако, любая конкретная реализация наследует методы и видимость абстрактного класса

, Таким образом, абстрактный класс сможет, конечно, иметь общедоступных конструкторов.

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

public class Scratch
{
    public static abstract class A
    {
        public A( int i ) {}
    }

    public static class B extends A
    {
        private B() { super(0); };
    }
}
24
ответ дан Jordan Stewart 28 November 2019 в 07:42
поделиться

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

7
ответ дан IAmCodeMonkey 28 November 2019 в 07:42
поделиться

, так как абстрактный тип, кажется, указывает, что технически общедоступный конструктор будет действовать очень защищенный

Umm... для абстрактных классов этот объем конструктора [общественность или защищенный] не имеет большого различия, так как инстанцирование не разрешено [даже если общественность]. Так как это предназначено, чтобы быть вызванным подклассом, это может вызвать или общедоступного или защищенного конструктора беспрепятственно.

полностью на выборе, что использовать. Я обычно предпочитаю общественность, как это находится в большинстве случаев.

1
ответ дан Nrj 28 November 2019 в 07:42
поделиться

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

Другая опция состоит в том, чтобы сделать конструктора частным. Это - только хорошая идея хотя, если все реализации класса являются частными внутренними классами. Редкий, но полезный пример.

1
ответ дан JaredPar 28 November 2019 в 07:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: