2016-01-21 3 views
0

Ну, я знаю, что мой вопрос не так ясен. Горе со мной на минуту.Являются ли дочерние классы эквивалентными классу расинов с точки зрения объекта?

Я создал 3 абстрактные классы:

класса Статья: мать класса

public abstract class Article{ 
    //myPrivate Var Declarations 
    public Article(long reference, String title, float price, int quantity){ 
     this.reference = reference; 
     this.title  = title; 
     this.price  = price; 
     this.quantity = quantity; 
    } 
} 

класс Electromenager: ребенок статьи

public abstract class Electromenager extends Article{ 
    //myVar declarations 
    public Electromenager(long reference, String title, float price, int quantity, int power, String model) { 
     super(reference, title, price, quantity); 
     this.power = power; 
     this.model = model; 
    } 
} 

Класс Alimentaire: другой ребенок статьи

public abstract class Alimentaire extends Article{ 
    private int expire; 
    public Alimentaire(long reference, String title, float price, int quantity,int expire){ 
     super(reference, title, price, quantity); 
     this.expire = expire; 
    } 
} 

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

class TV extends Electromenager { 
    public TV(long reference, String title, float price, int quantity, int power, String model){ 
     super(reference,title,price,quantity,power,model); 
    } 
} 
class EnergyDrink extends alimentaire { 
    public EnergyDrink(long reference, String title, float price, int quantity,int expire){ 
     super(reference,title,price,quantity,expire); 
    } 
} 

Так здесь, где начинается мое замешательство! при написании этого в основном():

Article art   = new TV (145278, "OLED TV", 1000 , 1 ,220, "LG"); 
EnergyDrink art2 = new EnergyDrink (155278 , "Eau Miniral" , 6 , 10, 2020); 

Удивительно, но я получаю нулевую ошибку !!!! не следует вводить::

TV art   = new TV (145278, "OLED TV", 1000 , 1 ,220, "LG"); 
//instead of 
Article art  = new TV (145278, "OLED TV", 1000 , 1 ,220, "LG"); 

Почему оба письма правильные? и как компилятор java понимает это? Спасибо за помощь !

+1

«Статья» - это базовый класс для 'TV', поэтому объекты базового класса могут содержать ссылку на дочерний класс, которые расширены базовым классом – dbw

+0

Почему он не должен компилироваться? Из вашего определения «TV» также является «статьей», поэтому вы можете назначить экземпляр «TV» в переменной, определенной как «Статья». – SomeJavaGuy

ответ

2

классы по уходу за детьми имеют все функциональные возможности своего базового класса.

Говоря

Article art   = new TV (145278, "OLED TV", 1000 , 1 ,220, "LG"); 

вы объявитьart как статья объекта, который не является неправильным. Вы не сможете получить доступ к функциям только для телевизора без кастинга. В любом случае новый телевизионный объект создан. Если вы его произнесли:

TV tv   = (TV) art; 

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

Чтобы быть более общим, даже

Object object = new TV (145278, "OLED TV", 1000 , 1 ,220, "LG"); 

будет работать.

+0

Ну, я не знаю, что мы можем бросить объекты, чтобы получить инклюзивные методы ... давайте представим, что телевизор имеет метод: 'changeModel (модель String);' Это: 'Статья искусство = новый телевизор (145278, «OLED TV», 1000, 1, 220, «LG»); ' не позволит мне написать: art.changeModel (« QHD »); ? и еще один вопрос, что такое статья art/Tv art/Object object? , означает ли это, что я объявил ссылку (вроде как указатель) объекту, который я создал в памяти, используя новый оператор? Почему я не могу, например, написать это: 'EnergyDrink art = новое телевидение (145278,« OLED TV », 1000, 1, 220,« LG »); '? –

2

Вы должны думать о линии Article art = new TV (145278, "OLED TV", 1000 , 1 ,220, "LG");

в два отдельных этапа,

  1. Создание списка Object типа TV с использованием new оператора
  2. Декларирование ссылочный тип переменной art типа Article и назначение TV объект, созданный на этапе №1 к нему

Вы вызываете действительный конструктор типа TV на шаге 1, и так как Article является родителем TV так присваивание допустимо также на шаге 2.

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