java - 静态和动态类型

标签 java inheritance

我正在准备java考试。请看下面的两个练习。(我有解决方案,但解决方案没有解释)所以如果有人可以检查我的解释,我将不胜感激。

1)

public interface Sale{}
public abstract class Clothing{}
public class Jacket extends Clothing implements Sale{}
public class LeatherJacket extends Jacket{}

以下哪些是可能的:

Sale var1 = new LeatherJacket();

有可能吗,因为 LeatherJacket 是 Jacket 的子类,并且 Jacket 实现了销售? (我只是在这里猜测)。

Sale var2 = new Sale();

不可能。您无法创建接口(interface)类型的对象。

Clothing var3 = new Clothing();

不可能。您无法创建抽象类的对象。

Clothing var4 = new LeatherJacket();

可能,但为什么呢?

Jacket var5 = new LeatherJacket();

可能,但到底为什么?

LeatherJacket var6  = new Object();

不可能,但为什么不呢?

最佳答案

Clothing var4 = new LeatherJacket();

possible, but why?

这是允许的,因为 LeatherJacketClothing 的派生类。它通过抽象类Clothing实例化。它写的是 new LeatherJacket() 而不是 new Clothing()

<小时/>
Jacket var5 = new LeatherJacket();

possible, but why exactly?

这是允许的,因为所有皮夹克都是夹克。但反之则不然。就好像所有的狮子都是动物,那么你可以写成:

Animal lion = new Lion();  //where Lion extends Animal

但是你不能把它写成:

Lion lion = new Animal();  //not all animals are lions
<小时/>
LeatherJacket var6  = new Object();

not possible, but why not?

原因与前面的解释相同。 Object在Java中处于最高层次,每个类都是Object类的子类。因此,由于处于层次结构的顶部,这是不允许的。但是,这是允许的:

Object var6 = new LeatherJacket();  //allowed (all leather jackets are objects)
LeatherJacket var 6 = new Object(); //not allowed (not all objects are leather jackets)

关于java - 静态和动态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41165201/

相关文章:

java - 单元测试功能接口(interface)

java - 如何在矩阵中找到从一点到另一点的逃生路线?

c++ - 在两个子类中使用基本乘法运算符

c++ - 什么是正确的设计方法?

PHP:如何在子构造中调用父构造的私有(private)值?

java - 正则表达式在 Java 中得到错误的输出

java - 如何根据数组中的项目填充矩形?

javascript - 检查原型(prototype)的继承,而不是实例

JavaScript - 使用Assign从多个原型(prototype)继承函数?

java - JavaBean、POJO和普通类的区别?