Java 从对象类型的角度来看,子类是否等同于它们的racine类?
我创建了3个抽象类: 班级文章:母班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
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中也是有效的 你需要考虑lineArticle=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”);`?