一、什么是里氏代换原则

  里氏代换原则(Liskov Substitution Principle): 一个软件实体如果使用的是一个父类的话,那 么一定适用于其子类,而且它察觉不出父类和子 类对象的区别。也就是说,在软件里面,把父类 替换成它的子类,程序的行为没有变化。

二、反过来的代换不成立

  里氏代换原则(Liskov Substitution Principle): 一个软件实体如果使用的是一个子类的话,那 么它不能适用于其父类。

三、企鹅是鸟类吗??

四、正方形是一种长方形吗??

正方形不是长方形的子类,因此之间不存在里氏代换关系。

五、好骗的Java编译器

六、原来还有一个四边形的概念?

能够骗过Java编译器,真的符合里氏代换原则吗?答案是否定的

 public class Person {
public void display() {
System.out.println("this is person");
}
}

男人

 public class Man extends Person {

     public void display() {
System.out.println("this is man");
}
}

测试

 public class MainClass {
public static void main(String[] args) {
Person person = new Person();
// display(person); Man man = new Man();
display(man);
} public static void display(Man man) {
man.display();
}
}

=================================================================

ex2:

鸟  接口

 //鸟
public interface Bird {
public void fly();
}

老鹰

 //老鹰
public class Laoying implements Bird { public void fly() {
System.out.println("老鹰在飞");
}
}

麻雀

 //麻雀
public class Maque implements Bird { public void fly() {
System.out.println("麻雀在飞");
}
}

测试

 public class MainClass {
public static void main(String[] args) {
fly(new Laoying());
} public static void fly(Bird bird) {
bird.fly();
}
}

=============================================================

ex3:

四边形  接口

 //四边形
public interface Sibianxing {
public long getWidth();
public long getHeight();
}

长方形

 //长方形
public class ChangFX implements Sibianxing{
private long width;
private long height; public long getWidth() {
return width;
}
public void setWidth(long width) {
this.width = width;
}
public long getHeight() {
return height;
}
public void setHeight(long height) {
this.height = height;
}
}

正方形

 //正方形
public class ZhengFX implements Sibianxing{
private long side; public long getHeight() {
return this.getSide();
} public long getWidth() {
return this.getSide();
} public void setHeight(long height) {
this.setSide(height);
} public void setWidth(long width) {
this.setSide(width);
} public long getSide() {
return side;
} public void setSide(long side) {
this.side = side;
}
}

测试

 public class MainClass {
public static void main(String[] args) {
ChangFX changfx = new ChangFX();
changfx.setHeight(10);
changfx.setWidth(20);
test(changfx); ZhengFX zhengfx = new ZhengFX();
zhengfx.setHeight(10);
test(zhengfx);
} public static void test(Sibianxing sibianxing) {
System.out.println(sibianxing.getHeight());
System.out.println(sibianxing.getWidth());
} // public static void resize(Sibianxing sibianxing) {
// while(sibianxing.getHeight() <= sibianxing.getWidth()) {
// sibianxing.setHeight(sibianxing.getHeight() + 1);
// test(sibianxing);
// }
// }
}

3里氏代换原则LSP的更多相关文章

  1. 设计模式之里氏代换原则(LSP)

    里氏代换原则(Liskov Substitution Principle, LSP) 1 什么是里氏代换原则 里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的O ...

  2. 里氏代换原则(Liskov Substitution Principle,LSP)

    第一种定义: 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换为o2,程序P的行为没有发生变化,那么类型S是类型T的子类型. 第二种定义: 所有引 ...

  3. 《设计模式》-原则二:里氏代换原则(LSP)

    回顾一下上一节说的“开闭原则” 说的是 一个软件要遵循对修改关闭 对新功能扩展的原则. 这一次来说说 “里氏代换原则” 意思是说:子类型必须能代替他们的基类. 看了半天的例子 好像 是懂非懂啊...相 ...

  4. .net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串

    1.继承(1)创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间,也会为父类的所有字段开辟空间,只不过父类私有的成员访问不到(2)子类从父类继承父类所有的非私有成员,但是父类的所有字段也会创建 ...

  5. 架构师之路——里氏替换原则LSP

    定义: 如果对每一个对类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型. 内容: 里氏替换原则通 ...

  6. 设计模式原则——依赖倒转&里氏代换原则

    设计模式一共有六大原则: 单一原则.开放封闭原则.接口分离原则.里氏替换原则.最少知识原则.依赖倒置原则. 这篇博客是自己对依赖倒转&里氏代换原则的一些拙见,有何不对欢迎大家指出. 依赖倒转原 ...

  7. 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...

  8. 里氏替换原则(LSP)

    替换原则由MIT计算机科学实验室的Liskov女士在1987年的OOPSLA大会上的一篇文章中提出,主要阐述有关继承的一些原则,故称里氏替换原则. 2002年,Robert C.Martin出版了一本 ...

  9. &quot;围观&quot;设计模式(2)--里氏替换原则(LSP,Liskov Substitution Principle)

    在面向对象的程序设计中.里氏替换原则(Liskov Substitution principle)是对子类型的特别定义.它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为 ...

随机推荐

  1. Python的JAVA胶水——jpype

    Python的JAVA胶水--jpype python可以作为一门胶水语言使用,可以用其它语言的优势来弥补自身如性能方面的不足,jpype就是在Python中使用jvm的第三方库 文档在这里 安装 s ...

  2. PAT Basic 1009

    1009 说反话 (20 分) 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串.字符串由若干单词和若干空格 ...

  3. vue-cli webpack2项目打包优化

    减小文件搜索范围 配置 resolve.modules Webpack的resolve.modules配置模块库(即 node_modules)所在的位置,在 js 里出现 import 'vue' ...

  4. es6学习笔记二:生成器 Generators

    今天这篇文章让我感到非常的兴奋,接下来我们将一起领略ES6中最具魔力的特性. 为什么说是“最具魔力的”?对于初学者来说,此特性与JS之前已有的特性截然不同,可能会觉得有点晦涩难懂.但是,从某种意义上来 ...

  5. JS的document.links函数使用示例

    ? <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title&g ...

  6. 页面嵌套iframe后,点击里面的链接,然后父窗口跳转(子窗口控制父窗口的链接跳转)

    做app的时候遇到一个问题,一个页面,然后里面嵌套了一个另一个页面,想实现点击里面的链接,然后外面进行跳转,不然的话,里面的页面永远出不来, 后面想了个办法,app的页面都是打开打开,不关闭的,然后由 ...

  7. GMA Round 1 数列求和(Hard)

    传送门 数列求和(Hard) 在数列{$a_n$}中,$a_1=-\frac{1}{4}$,$\frac{1}{a_{n+1}}+\frac{1}{a_n}=\begin{cases}-3(n为偶数) ...

  8. H5传奇世界服务器架设技术及源码

    以前是传奇迷,虽然现在不玩,但当作兴趣,研究了一下H5传奇世界的架设,架设成功并分享给大家.注意,此技术只可用于个人娱乐,不可用于商业用途. 首先下载 传奇世界H5源码   450M的样子. H5传奇 ...

  9. [CentOS7]redis设置开机启动,设置密码

    简介 上篇文章介绍了如何安装redis,但每次重启服务器之后redis不会自启,这里将介绍如何进行自启设置,以及如何设置redis的密码,进行密码验证登陆. 上篇文章: Centos7安装Redis ...

  10. Avizo/Amira应用 - 如何计算面孔率

    对于在Avizo或Amira中如何计算孔隙率,这个太简单,完成孔隙和整体材料的识别,再利用Volume Fraction计算即可获得,这里说的是每一层的面孔率如何计算? 数据导入,选取一个简单的过滤处 ...