Java LSP(Liskov替代原理)是如何工作的

Java LSP(Liskov替代原理)是如何工作的,java,object,parent,substitution,Java,Object,Parent,Substitution,LSP Liskov替代原则规定: 该原则定义了一个超类的对象可以被其子类的对象替换,而不会破坏应用程序 例如: 上述语句如何工作,在内存级别如何工作? 该类汽车是为了满足汽车所具有但普通汽车所缺乏的特定行为而创建的 BMW的对象如何被引用到车辆类别中?简单地说,LSP与您使用的变量和引用的可替换性有关。一个常见的示例是collections api: ArrayList<String> someList = new ArrayList<>(); 现在我们可以传递参数了

LSP Liskov替代原则规定: 该原则定义了一个超类的对象可以被其子类的对象替换,而不会破坏应用程序

例如:

上述语句如何工作,在内存级别如何工作? 该类汽车是为了满足汽车所具有但普通汽车所缺乏的特定行为而创建的


BMW的对象如何被引用到车辆类别中?

简单地说,LSP与您使用的变量和引用的可替换性有关。一个常见的示例是collections api:

ArrayList<String> someList = new ArrayList<>();
现在我们可以传递参数了,因为我们没有不必要地绑定到不需要其功能的子类型

就内存级别而言,这些对象在堆内存中仍然是相同的对象,您只需将它们称为它们的超类型,事实上,如果您知道它们的类型,您可以将它们降级

因此,使用您的示例,您可能会遇到一种情况,即现有的任何车辆都有一种颜色。所以我们有方法:

public class Vehicle {

    public Color getColor() { ... }
    public void setColor(Color color) { ... }

}
在这样做的过程中,车辆的任何子类都会有颜色方法,但不会有与宝马或汽车相关的更具体的方法。然而,这与继承比LSP更相关。

LSP说,当我们扩展一个类时,子类和超类之间的关系必须是a。在您的示例中,Car是一个载体。所以,当汽车等级扩展到汽车时,就不会违反LSP


在内存级别,将创建一个由车辆引用的汽车对象。BMW reference将能够访问车辆的所有公共和受保护的方法、实例变量

它不是BMW对象,它是一个名为BMW的车辆变量。一辆车可以是一辆车,但一辆车不一定是一辆车,例如,它可能是一辆卡车。当用简单的英语说汽车是一辆汽车时,这没关系,感觉很自然。很明显。你能解释一下实例化一个车辆类变量但使用一个汽车类构造函数的现象吗;但是,使用汽车背后的含义是什么;首先,非常感谢您提供了如此详细的答案。其次,我对学习oop>还不熟悉,我对类和对象的理解是这样的。类与对象的关系就像数据类型与变量的关系一样。非常简单,但是我们创建了一个子类来增强行为,并且对某些事情更加具体。我无法理解的是,如果我们使用父类作为引用是可以的,因为它很自然,但为什么我们要使用子类的构造函数进行初始化。最后一个问题是:一个LSP的应用程序是,假设我们有一个从媒体类扩展的音频和视频对象列表,我们可以从中检索对象列表使用媒体类引用,但首先,媒体类中会缺少一些属性或某些特定实例变量,我们将如何处理这些属性或变量。简单地说,举个例子:列表是一个抽象类型,不能实例化,将其视为一个不完整的类,想想像blueprints这样描述对象的类,对象就是实际的实例。在本例中,我们为它提供了一个具体的类型ArrayList、LinkedList等,它实现了任何缺少的行为。由于这个特定的原因,新列表是无效的java。对于媒体示例,您可以使用instanceof操作符来确定正在使用的变量的类型。ArrayList的someList实例将返回true,这与比较列表相同,但不返回LinkedList。一旦用instanceof确定了类型,就可以简单地强制转换变量,并将其当作子类ArrayList someList.set0,test处理
public void printList(LinkedList<String> printedList) { ... }
List<String> someList = new ArrayList<>(); //still an arraylist!

public void printList(List<String> printedList) { ... } //any list type
public class Vehicle {

    public Color getColor() { ... }
    public void setColor(Color color) { ... }

}