Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从对象类型的角度来看,子类是否等同于它们的racine类?_Java_Inheritance_Superclass_Super - Fatal编程技术网

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

Java 从对象类型的角度来看,子类是否等同于它们的racine类?,java,inheritance,superclass,super,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.pri

我创建了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;
    }
}
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;
    }
}
食品类:文章的另一个孩子

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;
    }
}
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()中写入此命令时:

令人惊讶的是,我得到了零错误!!!!我不应该打::

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编译器是如何理解这一点的?

您需要考虑line
art=new TV(145278,“OLED TV”,1000,1220,“LG”)

分两个步骤

  • 使用
    new
    操作符创建类型为
    TV
    对象
  • 声明
    Article
    类型的引用类型变量
    art
    ,并将在步骤1中创建的
    TV
    对象分配给它

  • 在步骤1中,您正在调用类型为
    TV
    的有效构造函数,并且由于
    Article
    TV
    的父级,因此赋值在步骤2中也是有效的

    你需要考虑line
    Article=new TV(145278,“OLED TV”,1000,1220,“LG”)

    分两个步骤

  • 使用
    new
    操作符创建类型为
    TV
    对象
  • 声明
    Article
    类型的引用类型变量
    art
    ,并将在步骤1中创建的
    TV
    对象分配给它

  • 在步骤1中,您正在调用类型为
    TV
    的有效构造函数,并且由于
    Article
    TV
    的父级,因此赋值在步骤2中也是有效的

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

    Article art         = new TV (145278, "OLED TV", 1000 , 1 ,220, "LG");
    
    您将
    art
    声明为文章对象,这是正确的。如果不进行强制转换,您将无法访问仅限电视的功能。 无论如何,将创建一个新的TV对象。如果你投下它:

    TV tv         = (TV) art;
    
    不会有任何问题,您可以访问所有电视功能

    更一般地说,甚至

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

    将起作用。

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

    Article art         = new TV (145278, "OLED TV", 1000 , 1 ,220, "LG");
    
    您将
    art
    声明为文章对象,这是正确的。如果不进行强制转换,您将无法访问仅限电视的功能。 无论如何,将创建一个新的TV对象。如果你投下它:

    TV tv         = (TV) art;
    
    不会有任何问题,您可以访问所有电视功能

    更一般地说,甚至

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

    将起作用。

    Article
    TV
    的基类,因此基类对象可以包含对由基类扩展的子类的引用。为什么它不应该编译?根据您的定义,
    TV
    也是一个
    Article
    ,因此您可以在定义为
    Article
    Article
    的变量中分配
    TV
    的实例,Article
    TV
    的基类,因此基类对象可以包含对由基类扩展的子类的引用,为什么它不应该编译?根据您的定义,
    TV
    也是一篇
    文章
    ,因此您可以在定义为
    Article
    的变量中分配
    TV
    的实例。我不知道我们可以强制转换对象以获得包含性方法。。。让我们假设TV有一个名为:
    changeModel(字符串模型)的方法此:
    文章艺术=新电视(145278,“OLED电视”,1000,1220,“LG”)不允许我写:art.changeModel(“QHD”)?还有一个问题,什么是Article/Tv art/Object。这是否意味着我声明了一个引用(有点像指针),指向我使用new操作符在内存中创建的对象?例如,为什么我不能这样写:`EnergyDrinkArt=new Tv(145278,“OLED Tv”,1000,1220,“LG”);`?好吧,我不知道我们可以投射对象来获得包含方法。。。让我们假设TV有一个名为:
    changeModel(字符串模型)的方法此:
    文章艺术=新电视(145278,“OLED电视”,1000,1220,“LG”)不允许我写:art.changeModel(“QHD”)?还有一个问题,什么是Article/Tv art/Object。这是否意味着我声明了一个引用(有点像指针),指向我使用new操作符在内存中创建的对象?例如,为什么我不能这样写:`EnergyDrinkArt=new Tv(145278,“OLED Tv”,1000,1220,“LG”);`?