Java设计原则 - 里氏替换原则

Java设计模式(03) -- 里氏替换原则 六大设计原则 单一职责原则定义:约定一个类应该有且仅有一个改变类的原因; 开闭原则定义:规定软件中的对象、类、模块和函数对扩展应该是开放的,但对于修改是封闭的,核心思想也可以理解为面向抽象编程。 里氏替换原则定义:继承必须确保超类所拥有的性质在子类中仍然成立。 里氏替换原则概述:如果S是T的子类型,那么所有T类型的对象都可以在不破坏程序的情况下被S类型的对象替换。简单来说,子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:当子类继承父类时,除添加新的方法且完成新增功能外,尽量不要重写父类的 阅读详情

六大设计原则

定义

如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

看不懂,没关系,还有一种定义

所有引用基类的地方必须透明的使用其子类的对象

还是看不懂,没关系。

简单的来说,T1是一个基类,T2是T1的子类,所有使用T1的地方,都代替为T2之后,程序行为没有发生改变。这下应该懂了吧。

里氏替换原则其实就是为“良好的继承”制定一些规范。

规范

1. 子类要完全实现父类的抽象方法,但尽量不要覆盖父类的非抽象方法

这一点很容易理解,如果子类覆盖了父类的非抽象方法,当使用子类代替父类时,程序行为可能会有所改变。

举个例子:
父类

public class Calculator {
    public int add(int num1, int num2) {
        return num1 + num2;
    }
}
public class Client {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.add(10, 5);
        // 结果为15
    }
}

子类

public class MiniCalculator extends Calculator {
    public int add(int num1, int num2) {
        return num1 - num2;
    }
}
public class Client {
    public static void main(String[] args) {
        // 子类代替父类
        // Calculator calculator = new Calculator();
        MiniCalculator calculator = new MiniCalculator();
        calculator.add(10, 5);
        // 结果为5
    }
}

例子中,由于子类MiniCalculator重写了父类Calculator的add方法,当子类MiniCalculator代替父类Calculator时,导致计算结果有误,也就是程序的行为发生了变化。所以对父类的非抽象方法,尽量不要覆盖重写。

2.子类中可以增加自己特有的方法

子类一般都会有自己特有的属性或方法,这点是肯定的。

3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数要更抽象化。

当我们要覆盖重载父类非抽象方法时,为了确保父类的方法能被正确执行,方法的形参应该更抽象化。

举个例子:
父类

public class Father{
    public Collection doSomething(HashMap map){
        System.out.println("父类被执行");
        return map.values();
    }
}

子类

public class Son extends Father{
    public Collection doSomething(Map map){
        System.out.println("子类被执行");
        return map.values();
    }
}

调用父类执行:

public class Client {
    public static void main(String[] args) {
        Father father = new Father();
        HashMap map = new HashMap();
        father.doSomething(map);
        // 结果是父类被执行
    }
}

当我们用子类代替父类时:

public class Client {
    public static void main(String[] args) {
        // 子类代替父类
        // Father father = new Father();
        Son son = new Son();
        HashMap map = new HashMap();
        son.doSomething(map);
        // 结果是还父类被执行
    }
}

结果是一样的,由于传入的是一个HashMap类型,所以由父类去执行,子类重写等于没写,不知道这样的重写有啥意义。

4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更具体化

父类的一个方法的返回值是一个类型T,子类的相同方法的返回值为S,那么里氏替换原则就要求S必须小于等于T。

小结

其实上面的规范,一般人(除了不小心)都不会违反,因为那样做没有意义!!所以说了等于白说!

但是告诉了我们一个想法,如果我们遵守了里氏替换原则,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。这样的话,在一定程度上增强程序的健壮性。

java设计模式3,里氏替换原则 里氏替换原则的内容可以描述为: “派生类(子类)对象可以在程序中代替其基类(超类)对象。” 阅读详情

相关推荐

树莓派4B之OpenCV人脸识别实战:从Haar Cascade到实时检测(保姆级教程)

本教程详细介绍了如何在树莓派4B上部署OpenCV,并利用Haar Cascade算法实现实时人脸识别。内容涵盖从系统环境搭建、算法原理解析到代码逐行讲解与实战调优,为嵌入式AI和计算机视觉初学者提供了一份完整的保姆级实践指南。

p8q9r0的博客 402

Java学习笔记-设计模式:里氏替换原则

定义一: 如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得在使用了T1类型的程序P中,将所有的T1类型对象o1替换成T2类型对象o2后,程序P的行为(功能)没有发生任何变化,那么类型T2就是类型T1的子类型.定义二: 所有引用基类的地方,必须能够透明的引用其子类对象.子类就是一个父类,父类能够出现的地方子类一定能够出现。父类能够完成的功能子类也能够完成.

hongxiancheng的博客 1967

别再手动算LLC了!用Mathcad 15分钟搞定谐振参数与增益曲线(附已验证产品案例)

本文详细介绍了如何利用Mathcad在15分钟内高效完成LLC谐振变换器的参数计算与增益曲线绘制。通过对比传统工具,突出Mathcad在自然数学表达、实时单位换算和动态参数关联方面的独特优势,帮助电源工程师大幅提升设计效率。文章还提供了已验证的产品案例和实用模板,助力工程师快速掌握谐振参数优化技巧。

weixin_42548888的博客 546

里氏替换原则:Java面向对象设计的基石

里氏替换原则是面向对象设计中的一个重要原则,它确保了子类能够正确替换父类而不破坏程序的行为。通过遵循里氏替换原则,我们可以增强程序的健壮性、可维护性和可扩展性,同时降低需求变更时引入的风险。在实践中,我们需要确保子类完全实现父类的方法,并且不增加父类不具备的行为。同时,我们还需要注意子类方法的前置条件和后置条件,以确保它们与父类方法保持一致。

huaqianzkh的专栏 1526

CA(载波聚合)

文章目录CA基本概念1. CA分类2. Pcell、Scell以及Serving CellPcell(Primary Cell)Scell(Secondary Cell)3. Pcell、Scell部署场景场景1场景2场景3场景44. CA的协议控制4.1 Camping/Connetion Establishment:4.2 CC Management/SCell Addition/Release:4.3 Handover/Measurements:4.4 SCell激活 CA基本概念 CA也就是我们中文

你又来看我了,一起学习吧 4万+

LWIP协议栈在STM32H7上的内存优化实战:如何用32KB RAM实现稳定千兆以太网通信

本文深入探讨了在STM32H7微控制器上,如何通过内存优化策略,在仅32KB的D2 SRAM中稳定运行LWIP协议栈以实现千兆以太网通信。文章详细分析了STM32H7的内存架构、LWIP的内存消耗瓶颈,并提供了从描述符表与PBUF池精确分配、链接脚本修改到MPU区域划分的一整套实战优化方案,旨在解决大数据量传输卡死等常见配置问题。

gg901的博客 603

Java设计模式-里氏替换原则

里氏替换原则【Liskov Substitution Principle】

码农日常的博客 9338

内存预取黑科技:__builtin_prefetch在数据库和游戏开发中的高阶用法

本文深入探讨了GCC内置函数`__builtin_prefetch`在数据库和游戏开发中的高阶应用。通过LevelDB的SSTable文件读取优化和UE5引擎场景数据流式加载的实战案例,详细解析了预取参数调优的艺术,并借助perf工具量化分析了不同策略的性能提升效果。文章还介绍了与`__builtin_expect`等内置函数的协同优化技巧,帮助开发者最大化缓存命中率。

weixin_29019241的博客 415

Java七大设计原则 - 里氏替换原则 (Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。- 任何基类出现的地方、子类一定可以出现- 在程序中尽量使用基类的类型来 定义对象、在运行时确认子类子类,用子类对象替换父类对象实现“开-闭”原则的关键步骤就是抽象化。

651

面试问题总结——关于YOLO系列(一)

自从刚开始接到的第一个面试开始,到现在为止,陆陆续续也参加了许多场,我像是一个刚从新手村出来的小白,一路的打怪升级刷经验,期间遇到了很多不会的,我都会及时记录总结。 到现在仍然清晰记得,第一次去面试的时候,当时被怼的多惨。。。 说明:本人是非科班出身,本科是机械电子工程专业,硕士期间的研究方向是机器学习和深度学习,因为我的简历上有关于YOLO的项目,所以我着重准备了YOLO系列的面试可能遇到的问题。 决定开启这个面试问题总结的系列,包括YOLO、C++的内容、OpenCV的内容和深度学习方面被提问的问题

boss-dog 1万+

[数学建模][2012年A国赛模拟] 3. 葡萄酒的评价

暑期学校数学建模培训第三次模拟:2012年国赛A题,一道完全统计方面的题目。据老师反映当年有位老师所带领小组取得“全国10佳优秀论文奖”,我们大组搞统计的老师建模能力不行,但其统计理论非常扎实,在此期间给予我们非常大的帮助,十分感谢老师的倾囊相授。我们小组的定位也不在统计方向,主攻物理建模及优化模型,故本次模拟就用SPSS软件简单做了下,还是学到了多元统计的许多知识,达到了本次训练的目的。 ...

Y-puyu 的博客 3万+

java solid设计原则_六大设计原则之里氏替换原则(LSP)

一、SOLID设计模式的六大原则有:Single Responsibility Principle:单一职责原则Open Closed Principle:开闭原则Liskov Substitution Principle:里氏替换原则Law of Demeter:迪米特法则Interface Segregation Principle:接口隔离原则Dependence Inversion Pri...

weixin_39815456的博客 196

SPI协议详解(图文并茂+超详细)

先说串口 因为之前写过一篇UART,通用串行异步通讯协议,UART的相关资料 因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。 如果要解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步; 双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。 传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示; 如果您注意到

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 33万+

Java设计模式之设计原则-里氏替换原则 (LSP)

附链 你也可以在这些平台阅读本文: 语雀 个人博客 定义 任何基类可以出现的地方,子类一定可以出现。 里氏替换原则是继承复用的基石,只有当子类可以替换掉基类且软件单位的功能不受到影响的时候,基类才能真正被复用,而子类也能够在基类的基础上去增加新的行为。 里氏替换原则通俗点来说就是:子类可以扩展父类的功能,但不能改变父类原有的功能。 通过以上这句话,可以引申出以下几点含义: **含义一:*...

Horace's Blog 626

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Java 设计模式】设计原则之里氏替换原则

里氏替换原则是由计算机科学家芭芭拉·利斯科夫(Barbara Liskov)于1987年提出的。该原则定义如下:如果对每一个类型为S的对象O1,都有类型为T的对象O2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。换句话说,里氏替换原则要求子类型必须能够替换掉它们的父类型,而程序在使用父类型和子类型时不应该产生意外的行为。里氏替换原则是面向对象设计中一个基本而重要的原则,它有助于创建灵活、可维护、可扩展的代码。

好久不见的流星 1195

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java设计原则—里氏替换原则(转)

里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题。 继承的优点: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性; 提高代码的重用性; 子类可以形似父类,但又异于父类; 提高代码的可扩展性; 提高产品或项目的开放性。 继承的缺点: 继承是侵入性的,只要继承就必须拥有父类的所有属性和方法; 降低...

anhe1364的博客 75

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JAVA 编程中的SOLID设计原则:SRP,单一职责原则 OCP,开闭原则 LSP,里氏替换原则 ISP,接口隔离原则 DIP,依赖倒置原则

SRP,单一职责原则 OCP,开闭原则 LSP,里氏替换原则 ISP,接口隔离原则 DIP,依赖倒置原则SRP,单一职责原则 OCP,开闭原则 LSP,里氏替换原则 ISP,接口隔离原则 DIP,依赖倒置原则SRP,单一职责原则 OCP,开闭原则 LSP,里氏替换原则 ISP,接口隔离原则 DIP,依赖倒置原则SRP,单一职责原则 OCP,开闭原则 LSP,里氏替换原则 ISP,接口隔离原则 DIP,依赖倒置原则SRP,单一职责原则 OCP,开闭原则 LSP,里氏替换原则 ISP,接口隔离原则 DIP,依赖

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 838

Java设计原则——里氏替换原则

OO(面向对象)中的继承性的思考和说明:基本介绍:以下示例就是继承父类,然后重新代码之后,不轻易间就会导致程序出现各种问题。 2、示例二 解决方法:这个示例就是利用组合关系来代替,这个Base基类是没放东西的,其含义是,将这两个类共用的放到这里面,这只是个例子,所以没写东西。...

怪咖@的博客 833

Java面向对象设计原则2——里氏替换原则

在我们学习面向对象编程的时候,总会出现一些问题,好比以前刚刚写好的代码,上线测试可以、正常运行,突然有一天说要加一个功能,改完之后,发现以前正常运行的功能不能用了,类似这样的问题有好多好多,为了避免类似的事件发生,程序员一定要根据这些原则去开发程序。 我们一个一个来学习,今天来学习7大面向对象设计原则之一,,里氏替换原则。 里氏替换原则: 里氏替换原则(Liskov Substitution...

胖子胖子大胖子的博客 1271

java设计原则--里氏替换原则

JAVA设计原则–里氏替换原则(LSP原则) 为什么要用里氏替换原则?: 为了优化继承所带来的缺点,使得继承的优点发挥到最大,而同时减少缺点带来的麻烦。 继承的优缺点: 优点: 1. 代码共享,减少创建类的工作量,每个子类都拥有父类的属性和方法 2. 提高代码的重用性(子类可以使用父类的属性和方法) 3. 子类可以在父类的基础上进行拓展(重写父类的方法,实现自己的逻辑)(很多...

海的那边见 757

Java设计原则之里氏替换原则

里氏替换原则是指父类能出现的地方,其子类也可以出现,并且使用子类替换掉父类的话,程序不会报错,反之,有子类的地方不一定能用父类替换。该原则要求我们尽可能的使用父类定义对象,具体运行的时候再决定子类对象类型。接下来,我们以人吃汉堡为例,介绍里氏替换原则: 首先,定义一个抽象父类Dishes public abstract class Dishes { public abstract Str...

qq_36986015的博客 389

架构中的设计原则之里氏替换原则(LSP) - 《java开发技术-在架构中体验设计模式和算法之美》...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34185320的博客 132

Java设计原则(六)里氏替换原则

里氏替换原则 定义 如果对每一个类型T1的对象o1,都有类型为T2的对象o2, 使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的 行为没有发生变化,那么类型T2是类型T1的子类型。 定义扩展 一个软件实体如果都使用一个父类的话,那一个定使用其子类, 所有引用父类的地方必须能透明地使用其子类的对象,子类对象能 替换父类对象,而程序逻辑不变。 引申意义 子类可以扩展父类的功能,但不能改变父类的原有功能。 含义1 子类可以实现父类的抽象方法,但不能覆盖分类的非抽象方法。 含义

baidu_41934937的博客 265

java中七大设计原则之里氏替换原则详解

里氏替换原则 这里对java中的里氏替换原则做一个简单的介绍! 里氏替换原则基本介绍: 1. 所有引用基类的地方必须能透明地使用其子类的对象。 2. 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。 3. 里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖 来解决问题。 案例引入: public class LiShi { public static void main(String[] args) { //调用代码 A a = new

qq_49529322的博客 752

JAVA设计原则之里氏替换原则

LSP:里氏替换原则 子类对象必须能够替换掉所有父类对象, 父类出现的地方子类也能够出现。 继承是一种 IS-A 关系,子类需要能够当成父类来使用,并且需要比父类更特殊。 如果不满足这个原则,那么各个子类的行为上就会有很大差异,增加继承体系的复杂度。 代码: 1.枪,抽象类,定义开枪方法。 public abstract class Gun { abstract void shoot()...

a85093541的博客 362

java设计模式之里氏替换原则(LSP)

里氏替换原则 If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged where o1 is substituted for o2 then S is a su...

weixin_33939843的博客 99
上一篇: Java设计原则 - 单一职责原则
下一篇: Java设计原则 - 依赖倒置原则
JohanMan
博客等级 码龄10年 72粉丝 131原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值