2014-02-16 3 views
0

Вопрос: Почему вы можете объявить переменную абстрактного класса, а затем установить для этой переменной значение null и затем не иметь доступа к каким-либо из методов. Какова была бы причина этой концепции абстрактных классов?Почему вы можете создать переменную абстрактного класса?

класс:

package ReadWriteFile; 
public abstract class GraphicObject { 
     int home = 100; 
     final int score = 0; 

     abstract void draw(); 
     abstract String meMethod1(); 
     abstract void meMethod2(); 

     void meMethod3() { 
      System.out.println("test");; 
     } 

     public static void main(String[] i){ 
      GraphicObject o = null; 
      o.meMethod3(); 
     } 

}

+0

[Что означает «программировать интерфейсы»?] (Http://stackoverflow.com/questions/2697783/what-does-program-to-interfaces-not-implementations-mean) –

+0

См. Мой ответ на это: http://stackoverflow.com/questions/21270862/difference-between-object-creation-syntax – ajb

ответ

5

Вы должны понимать два разных понятия, переменные и экземпляры.

Вы можете считать переменную как обладатель чего-то, поэтому вы можете создать переменную абстрактного типа GraphicObject.

Когда вы делаете:

GraphicObject myVar = null; 

вы говорите, MYVAR является держателем типа GraphicObject и он не держит ничего.

Так что, когда вы делаете:

myVar.meMethod3(); 

вы говорите'no one' делать meMethod3();

Но если вы делаете:

GraphicObject myVar = new GraphicObjectImpl(); 
myVar.meMethod3(); 

тогда вы говорите'someone' делать meMethod3();

Для делать это, вам нужно создать'non abstract', инстанциируемый класс, который наследует (или расширяет) GraphicObject, в этом случае GraphicObjectImpl:

public class GraphicObjectImpl extends GraphicObject { 
    void draw() 
    { 
    } 
    String meMethod1() 
    { 
     return null; 
    } 
    void meMethod2() 
    { 

    } 
} 

Что также требуется реализует все абстрактные методы из родительского абстрактного класса.

+0

Таким образом, на самом деле не было бы причин создавать экземпляр абстрактного класса. То есть вы должны расширить класс, как вы только что показали выше. Несмотря на то, что Java позволяет скомпилировать Temp AbstractClass; никогда не будет использоваться, потому что это не может быть потому, что это абстрактный класс и не будет компилироваться. –

+0

Идея абстрактных классов заключается в создании нескольких классов ¨child¨ с общими полями/методами без необходимости дублирования кода. –

+0

Кто-то сказал, что если вы собираетесь создавать переменную, которая реализует интерфейс, который вы должны сделать своими экземплярами переменных этого интерфейса, а не этим классом. Мне было интересно, почему это так? –

2

Вы можете позже повторно использовать "о" и установить его на какой-либо конкретной реализации GraphicObject.

+0

Я хотел бы увидеть пример этого, если вы можете? –

2

Мы можем объявить только обработчик абстрактного класса, который может использоваться для хранения объектов производных конкретных классов. Это делается для облегчения полиморфизма во время выполнения.

+0

Можете ли вы показать пример этого? –

2

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

Допустим, вы программируете симулятор зоопарка, и, поскольку вам нравится использовать хорошую структуру класса ООП, вы решили сделать несколько классов для представления ваших животных. Итак, вы делаете классы Лев, Тигр и Медведь (о мой) и понимаете, что их код достаточно одинаков. Поэтому вы решили создать класс животных , который не может быть создан. Теперь вся суть абстрактных классов является то, что вы не можете создать новый экземпляр из них, как это:

Animal animal = new Animal(); 

Вы решили, что это работает для вашего тренажера, потому что вы не хотите, чтобы добавить общие животных ваш зоопарк, вы хотите добавить конкретных животных в ваш зоопарк, и поэтому абстрактный класс - это правильная идея.Таким образом, идея абстрактных классов: абстрактные классы используются, когда вы хотите, чтобы общий класс расширялся вашими конкретными классами.

Теперь в вашем сценарии вы сделали это:

GraphicObject o = null; 

Так почему мы можем это сделать, если мы не можем создать экземпляр абстрактного класса? Потому что мы не сделали, когда вы установили o в null, вы не создаете новый объект и, следовательно, это действительный код. Наконец, на вашей линии, которая выглядит следующим образом:

o.meMethod3(); 

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

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

+0

Спасибо. Это имеет смысл. На самом деле вы бы никогда не делали переменную абстрактного класса и устанавливали ее равной нулю, даже если она будет компилироваться. Я где-то читал, что лучше создать переменную типа интерфейса, а не экземпляр класса. Но класс должен реализовать интерфейс. –

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