Эквивалентны ли дочерние классы своему классу racine с точки зрения типа объекта?

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

class Статья: mother Class

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;
    }
}

Class 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);
    }
}

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

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?


person Yassine Bakkar    schedule 21.01.2016    source источник
comment
Article является базовым классом для TV, поэтому объекты базового класса могут содержать ссылку на дочерний класс, который расширяется базовым классом.   -  person dbw    schedule 21.01.2016
comment
Почему он не должен компилироваться? Из вашего определения TV также является Article, поэтому вы можете назначить экземпляр TV в переменной, определенной как Article.   -  person SomeJavaGuy    schedule 21.01.2016


Ответы (2)


Дочерние классы обладают всеми функциями своего базового класса.

Говоря

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

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

TV tv         = (TV) art;

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

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

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

должно сработать.

person Jörn Buitink    schedule 21.01.2016
comment
Ну, я не знал, что мы можем преобразовывать объекты для получения инклюзивных методов ... представим, что у ТВ есть метод, называемый: changeModel( String model); Это: Article art = new TV (145278, "OLED TV", 1000 , 1 ,220, "LG"); не позволяет мне писать: art.changeModel (QHD); ? И еще один вопрос, что такое Артикль / ТВ-арт / Объект? . Означает ли это, что я объявил ссылку (вроде указателя) на объект, который я создал в памяти с помощью оператора new? почему я, например, не могу написать это: «EnergyDrink art = new Tv (145278, OLED TV, 1000, 1, 220, LG); `? - person Yassine Bakkar; 22.01.2016

Вам нужно подумать о строке 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.

person Sabir Khan    schedule 21.01.2016