Чтобы ответить на этот вопрос, я сначала должен убедиться, что вы знаете, что такое абстрактный класс. Вот как мне сказали подумать о концепции абстрактных классов, когда я впервые научился программировать.
Допустим, вы программируете симулятор зоопарка, и, поскольку вам нравится использовать хорошую структуру класса ООП, вы решили сделать несколько классов для представления ваших животных. Итак, вы делаете классы Лев, Тигр и Медведь (о мой) и понимаете, что их код достаточно одинаков. Поэтому вы решили создать класс животных , который не может быть создан. Теперь вся суть абстрактных классов является то, что вы не можете создать новый экземпляр из них, как это:
Animal animal = new Animal();
Вы решили, что это работает для вашего тренажера, потому что вы не хотите, чтобы добавить общие животных ваш зоопарк, вы хотите добавить конкретных животных в ваш зоопарк, и поэтому абстрактный класс - это правильная идея.Таким образом, идея абстрактных классов: абстрактные классы используются, когда вы хотите, чтобы общий класс расширялся вашими конкретными классами.
Теперь в вашем сценарии вы сделали это:
GraphicObject o = null;
Так почему мы можем это сделать, если мы не можем создать экземпляр абстрактного класса? Потому что мы не сделали, когда вы установили o
в null, вы не создаете новый объект и, следовательно, это действительный код. Наконец, на вашей линии, которая выглядит следующим образом:
o.meMethod3();
Мы можем видеть, что это правильный код, а это означает, что он компилируется нормально, но я держал пари, если вы запустите его вы получите NullPointerException
, потому что вы пытались сделать что-то переменная, которая не имеет значения.
Итак, чтобы подвести итог: причина концепции абстрактных классов заключается в том, что иногда вы хотите написать код, который будет повторно использоваться во многих других классах, но вы не хотите создавать экземпляр этот класс, потому что он должен быть общим.
[Что означает «программировать интерфейсы»?] (Http://stackoverflow.com/questions/2697783/what-does-program-to-interfaces-not-implementations-mean) –
См. Мой ответ на это: http://stackoverflow.com/questions/21270862/difference-between-object-creation-syntax – ajb