Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Проблема с вашим кодом заключается в том, что метод Bar::testPrivate
- private
, поэтому он не может быть переопределен дочерними классами. Во-первых, я рекомендую вам ознакомиться с видимостью в PHP - http://www.php.net/manual/en/language.oop5.visibility.php . Там вы узнаете, что только методы public
и protected
класса членов класса могут быть переопределены, private
не могут.
В качестве хорошего примера попробуйте изменить видимость метода Bar::testPrivate
либо публичным, либо защищенным, без изменения чего-либо еще в вашем примере кода. Теперь попробуйте выполнить ваши тесты. Что происходит? Это:
PHP Неустранимая ошибка: уровень доступа к Foo :: testPrivate () должен быть защищен (как в классе Bar) или слабее
blockquote>Большой вопрос вот почему?". Ну, теперь вы переопределили
Bar::testPrivate
с помощью частногоFoo:testPrivate
. Этот новый частный метод недоступен дляBar::test
, поскольку частные члены класса видны только для их текущего класса, а не родительского / дочернего классов!Поэтому, как вы можете видеть, ООП обеспечивает определенную количество инкапсуляции для членов класса, и это может быть довольно запутанным, если вы не нашли времени, чтобы понять это.
private
означает в терминах переопределения метода (что он не может быть выполнен). – Mark 9 February 2014 в 03:52