从对象的角度来看,子类是否等同于他们的racine类?

时间:2016-01-21 07:05:59

标签: java inheritance superclass super

我创建了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);
    }
}

所以我的混乱开始发生了!在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编译器如何理解这一点?

2 个答案:

答案 0 :(得分:2)

您需要考虑行Article art = new TV (145278, "OLED TV", 1000 , 1 ,220, "LG");

分两个步骤,

  1. 使用Object运算符
  2. 创建TV类型new
  3. 声明类型为art的引用类型变量Article,并将步骤#1中创建的TV对象分配给它
  4. 您正在步骤1中调用TV类型的有效构造函数,因为ArticleTV的父级,因此在步骤2中分配也是有效的。

答案 1 :(得分: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");

会起作用。