代码之家  ›  专栏  ›  技术社区  ›  Yassine Bakkar

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

  •  0
  • Yassine Bakkar  · 技术社区  · 8 年前

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

    职业电工:文章的孩子

    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 回复  |  直到 5 年前
        1
  •  2
  •   Jörn Buitink    8 年前

    子类具有其基类的所有功能。

    通过说

    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");
    

    将起作用。

        2
  •  2
  •   Sabir Khan    8 年前

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

    在两个单独的步骤中,

    1. 创建 Object 类型的 TV 使用 new 操作人员
    2. 声明引用类型变量 art 类型的 Article 和分配 电视 在步骤#1中创建的对象

    您正在调用类型为的有效构造函数 电视 在步骤1中 文章 是的父级 电视 因此在步骤2中赋值也是有效的。