黑马程序员----JAVA基础之继承与多态&封装&接口

   

------ android培训java培训、期待与您交流! ----------


一、继承 extends

1. 继承的概念:

继承就是把两个存在关系的类,把里面共有特性提取出来,形成一个父类,

或者跟据自已的特性派生出来一个子类,然后子类通过继承拥有父类的所有属性和方法,

子类可以可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

继承分为普通继承和多重继承.

普通继承  A 继承B

多重继承 C继承B, B又继承A.  那么C中具有A和B的所有属性.----这个不是多继承,要区分开来

2. 继承的用处:

复用性强,子类通过继承就拥有了父类的所有属性和方法,子类可以直接使用这些方法,

也可对在此基础上增加新的数据或新的功能,若类B继承类A,

那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。

这种做法能减小代码和数据的冗余度,大大增加程序的重用性,使得复用以前的代码非常容易,

能够大大缩短开发周期,降低开发费用。

比如可以先定义一个类叫车,车有以下属性:

车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,

为轿车添加一个小后备箱,而为卡车添加一个大货箱。 


继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。 

通过继承可以展现多态,Java中的多态的两种最基本表现形式:重载与重写

3. 继承的用法:

子类类名后加上extends 父类名,就实现在继承

继承属性:

继承属性时,子类拥有父类除private修饰外的所有变量

通过super可以调用子类中隐藏的父类属性.

当子类有同名变量的话,

用this和super来区分子类成员和父类成员. super.变量名 super.方法名();

如果无同名变量,那么也可以用this来调用父类属性.

但一般不在父类中定义类变量,,因为类变量可以直接用类名访问,如果定义了,那么一般是对子类做一些限制

继承方法

继承方法可以对方法什么也不做,也可以对方法进行重写

重写就是让方法名一样,但里面给其在原有基础上进行扩展或重新定义新的功能.

重写时需要注意的是权限修饰符,子类不可以使用比父类更严格的权限修饰符.

也就是子类的权限只能更宽泛,不能更严格,public>protected >什么都不写>private

重写的目的,两个目的,一个是对被重写的方法进行功能性扩展, 另一个是重新建立新的功能行为.

也可以通过super来调用被隐藏的行为.同样,如果没有重写,那么也可以用this调用.

继承在构造函数中的用法

在构造函数中,默认在第一行调用super(),父类的无参构造,一旦我们指定后,super(参数),或this(),后,就不会再自动调用了.

 

4. 继承什么时候用?

如果类中的特性或行为与被继承类中的行为,特性功能相同,可以使用继承。不可以为了去使用其某个行为而继承

父类是将所有子类中共性的行为抽象出来的。

5. 继承有什么特点?

一个子类中只能有一个父类,就是只能单继承

java中支持多重继承,就是B继承A,C又继承B,那么C拥有A和B的所有成员

java中继承能继承父类的除private外所有的成员.不包括构造函数.


二:多态

1)多态的概念:

某一类事物的多种存在形态。
  **方法重载(静态多态)
  **方法重写(动态多态,对象多态)

     (2)对象多态的前提
  A:类与类(或接口)要有继承(或实现)关系。
  B:一定要有方法的重写。
  C:一定要有父类或者接口的引用指向子类的对象。

     (3)多态思想:

可以指挥同一类型的一批对象做事情。多态的出现让我们复杂的问题简单化了。
  AAnimal Cat Dog
 **method(Animal a){a.eat();}
  B:同学们吃饭
  C:士兵打仗(抬枪,瞄准,射击)

     (4)多态中成员的特点:

(我们只研究特殊的,就是说名字一样的东西)
  Fu f = new Zi();
  A:成员变量:编译和运行都看Fu
  B:非静态方法:编译看Fu,运行看Zi
  C:静态方法:编译和运行都看Fu
 
 举例: 动物的例子:
 向上转型
 Animal a = new Cat();
 a.eat();
 //a.catchMouse();


 向下转型
 Cat c = (Cat)a;
 c.eat();
 c.catchMouse();

 //向上转型
 Animal a = new Dog();
 //向下转型 转换异常
 //Cat c = (Cat)a;
 Dog d = (Dog)a;

 孔爹的例子:
 孔爹:教课(Java)
 孔子:教课(论语),看小说(),打游戏()

 孔爹 k = new 孔子();//穿上他爹衣服,就跟着去了
 k.教课(论语)
 //k.看小说();

 孔子 kz = (孔子)k;//把衣服脱了
 kz.教课(论语);
 kz.看小说();
 kz.打游戏();

记住:        在多态中只有非静态成员函数,编译看左边,运行看右边 (等于号)  其他情况,编译看左边,运行看左边.


三、封装 

(1)封装简述

封装就是隐藏实现细节,提供公共的访问方式,

开发中常用的是用private饰类的成员,让其只在本类是有效,再提供公共的方法让外部访问被private修饰的成员属性.

(2)封装的用处

提高类成员安全性,使用方便,复用性高,可以控制其变化

(3)封装的用法

在变量类型前和方法的返回值类型前加上private,就可以私有化这个变量或方法.

然后再提供getName方法获得变量的值,用setName方法给变量赋值.

private修饰的方法放于开放的方法中,这样才能让外部访问

(4)什么时候用封装?

私有的使用。

当我们要对一个成员变量或方法进行改变和调用控制时,我们就用private私有.

(5) 封装的特点:

封装可以修饰类的成员属性和方法,当一个成员被私有化后,只能在类中使用,不能够直接通过创建对象调用,而要通过其它公共访问方法,让外部去访问.


四:接口(interface)

(1)接口的由来:

当一个类中的方法都是抽象的时候,

你没必要定义为抽象类, 定义为接口就可以了。

(2)接口的用处

解决了java中只能单继承的问题。(对多继承进行了优化)

A:类与类:只能是单继承。

B:接口与接口:可以是单继承,也可以是多继承。

C:类与接口:可以是单实现,也可以是多实现。

(3)接口成员特点:

A:只有成员变量和成员方法。

B:成员变量 默认修饰符 public static final

**int x = 20;

**其实是这样的 public static final int x = 20;

C:成员方法 默认修饰符 public abstract

**void show();

**其实是这样的 public abstract void show();

建议:自己手动加上修饰符。

(4)接口的思想:

A:接口是对外暴露的规则

B:接口是功能的扩展

C:接口降低了程序的耦合性。

**内聚(自己实现功能的能力) 

**高内聚,低耦合。

举例:主板和CPU,USB接口,电源插座。

D:扩展说了下接口的理解

**狭义的理解就是java中的接口。

**广义的理解就是:任何定义的规范都是接口。

(5)接口和抽象类的区别:

A:抽象类只能被单继承;接口可以被多实现。

B:抽象类中的成员:成员变量:可以是常量,也可以是变量。

   成员方法:可以是抽象的,也可以是非抽象的。

   构造方法:虽然不可以创建对象,但是可以给子类实例化用。

   接口中的成员:成员变量:只能是常量。默认修饰符 public static final

 成员方法:只能是抽象的。默认修饰符 public abstract

C:抽象类中定义的是体系结构中的共性的内容。

   接口中定义的是对象的扩展功能。

D:抽象类被继承表示的是:"is a"的关系。xx是yy中的一种。

   接口被实现表示的是: "like a"的关系。xx像yy中的一种。

(6)举例  学生的例子

A:属性:学号,姓名,年龄 

B:方法:学习(study),吃饭(抽象eat),抽烟或者不抽烟?(合适吗)

发现:在学生中定义抽烟的方法不合适。所以呢,我们另外用一个类来定义抽烟的方法。

      但是发现,如果用一个类描述抽烟的功能后,SmokeStudent是不能继承多个类的。

      这个时候,我们又得重写思考了。发现,抽烟的学生像一个抽烟的机器,所以,

      我们定义一个接口来放抽烟这个功能。

         interface Smoking

 {

public abstract void smoking();

 }

   描述的是抽烟的学生:SmokeStudent extends Student implements Smoking

SmokeStudent ss = new SmokeStudent();

ss.eat();

ss.study();

ss.smoking();

  老师:Teacher

A:属性 教师编号,姓名,年龄

B:方法 教书(teach),吃饭(吃饭eat),抽烟或者不抽烟?(合适吗)

发现:在老师中定义抽烟的方法不合适。所以呢,我们另外用一个类来定义抽烟的方法。

      但是发现,如果用一个类描述抽烟的功能后,SmokeTeacher是不能继承多个类的。

      这个时候,我们又得重写思考了。发现,抽烟的老师像一个抽烟的机器,所以,

      我们定义一个接口来放抽烟这个功能。

         interface Smoking

 {

public abstract void smoking();

 }

  描述的是抽烟的老师:SmokeTeacher extends Teacher implements Smoking

SmokeTeacher st = new SmokeTeacher();

st.eat();

st.teach();

st.smoking();

  最后,我们发现,这个代码还是存在着重复,比如说学生类和教师类中的属性姓名,年龄及方法吃饭。

  所以,我们进一步向上抽取。来了一个Person类

  Person:属性:姓名,年龄

          行为:吃饭(抽象eat)




------ android培训java培训、期待与您交流! ----------



内容概要:本文围绕“考虑电能交互的冷热电区域多微网系统双层多场景协同优化配置”的Matlab代码实现展开,提出一种结合电能交互机制的双层优化模型,用于解决冷、热、电多能耦合背景下多微网系统的协同规划运行问题。研究采用多场景分析方法应对可再生能源出力负荷需求的不确定性,通过上层规划设备容量配置下层优化多时段运行策略的联动,提升系统在复杂环境下的经济性、鲁棒性能源利用效率。所提供的Matlab代码集成了建模、求解(如YALMIP+CPLEX)结果可视化全流程,涵盖场景生成削减、双层优化结构设计及多能流协同调度等关键技术环节,为综合能源系统优化提供了完整的算法实现技术参考。; 适合人群:具备电力系统、综合能源系统或优化建模背景,熟悉Matlab编程数学规划方法,正在从事相关领域科研或工程设计工作的研究生、高校研究人员及能源行业技术人员。; 使用场景及目标:①开展冷热电联供(CCHP)多微网系统的容量规划运行优化研究;②支撑含分布式能源、储能及多能转换设备的综合能源系统多目标、多场景优化建模;③学习复现双层优化、分布鲁棒优化及场景分析等先进优化方法在能源系统中的实际应用。; 阅读建议:建议结合配套文献代码同步研读,重点理解双层模型的构建逻辑、变量耦合关系求解技巧,关注场景生成方法YALMIP调用细节,通过调整参数、修改目标函数等方式进行仿真实验,以深化对系统优化机理的掌握。
内容概要:本文系统研究了单相逆变器闭环控制下的PWM调制模型,基于Simulink平台构建完整的逆变电路仿真系统,涵盖主电路拓扑、闭环控制器设计、脉宽调制信号生成及输出滤波等关键环节。通过引入比例积分(PI)反馈控制策略,实现对输出电压幅值波形的精确调节,有效抑制负载扰动带来的影响,提升系统的动态响应能力稳态精度。仿真过程详细展示了系统建模、参数整定及性能验证的全流程,重点分析了闭环控制在改善输出正弦波质量、降低谐波畸变率方面的优势,为电力电子逆变装置的研发优化提供了可靠的理论支撑实践参考。; 适合人群:具备电力电子技术、自动控制原理基础知识及相关仿真经验的高校研究生、科研人员,以及从事新能源发电、不间断电源(UPS)、微电网、电动汽车等领域的工程技术人员。; 使用场景及目标:①掌握单相逆变器闭环控制系统的设计建模方法;②深入理解PWM技术反馈控制在逆变系统中的协同工作机制;③通过Simulink仿真平台完成系统搭建参数调试,服务于课程设计、毕业课题、科研项目或工业产品开发中的逆变器控制算法验证。; 阅读建议:建议结合经典控制理论电力电子变换技术同步学习,动手复现仿真模型并尝试调整PI控制器参数、载波频率等关键变量,观察其对系统稳定性输出性能的影响,从而深化对控制机理的理解,并为进一步研究并网逆变、多电平逆变等复杂系统打下坚实基础
代码转载自:https://pan.quark.cn/s/36f2a379e44e 所讨论的核心内容涉及运用Keras所训练的`.h5`模型对实例进行检测,此任务在深度学习领域内十分普遍。`.h5`作为Keras库保存模型构造权重的文件类型,使得训练后的模型能够被储存,并在必要时被载入以执行预测操作。在开始前,务必确认已配置好Python 3.6的环境,并安装了opencv及Keras相关库。本案例中选用的数据集是MNIST,它是一个常用于手写数字识别的标准数据集。MNIST中的图像均为28x28像素的灰度图,因此在测试个人图像时,也需将其调整为相同的图像规格。若手写数字的背景并非黑色,比如呈现白底黑字的情况,可能会对模型的识别能力产生影响,因为模型在训练阶段所适应的是黑底白字的图像。因此,在测试阶段,必须保证图像被转换为黑底白字的格式。测试代码的主要步骤包括:首先,运用`load_model`函数载入`.h5`模型文件,例如使用`model = load_model(fm_cnn_BN.h5)`进行操作。其次,通过`cv2.imread`函数读取图像,再借助`cv2.cvtColor`函数将图像从RGB色彩空间转换为灰度色彩空间。同时,要确保图像的尺寸训练模型时的输入尺寸相匹配,一般设定为28x28像素。接着,利用`reshape`方法将图像数据调整至模型所要求的维度。对于MNIST数据集而言,这通常意味着将图像转化为一个一维数组,其形状为`(1, 1, 28, 28)`,其中1代表批次大小,其余部分则分别表示图像的通道数、宽度和高度。然后,对数据进行标准化处理,将像素值缩放到0到1的范围内,这通常通过除以255来实现。最后,运用`predict_cl...
内容概要:本文系统阐述了基于数据驱动的模型预测控制(MPC)方法在电力系统机组组合优化中的应用,并以IEEE24节点系统为案例进行了Matlab代码实现。该方法融合实际运行数据,充分发挥MPC滚动优化反馈校正的优势,对发电机组的启停计划出力进行多时段动态优化,旨在实现电力系统运行的经济性、安全性可靠性的协同提升。研究内容涵盖优化模型的数学构建、系统约束(如功率平衡、机组爬坡率、最小启停时间等)的处理、多目标函数(如燃料成本、启停成本)的设计,以及在MPC框架下的高效求解流程,充分体现了数据驱动方法先进控制理论在复杂电力系统调度决策中的深度集成优越性。; 适合人群:具备电力系统分析、优化理论基础及一定Matlab编程能力的研究生、高校科研人员以及从事电力系统调度、能源管理等领域的工程技术人员。; 使用场景及目标:①应用于电力系统日前或实时调度中的机组组合问题,为调度员提供科学决策支持;②研究在风电、光伏等新能源出力具有强不确定性的背景下,数据驱动的MPC策略如何提升调度方案的适应性鲁棒性;③为电力系统优化算法的研究、开发仿真验证提供一个结构清晰、可复现的技术范例和代码参考。; 阅读建议:建议读者结合所提供的完整Matlab代码IEEE24节点标准系统的详细参数,分模块调试运行程序,深入理解从数据预处理、模型构建到MPC滚动求解的全过程。在掌握核心逻辑后,可进一步尝试引入更复杂的实际约束条件,或将其拓展应用至其他节点系统或不同的不确定性建模场景中,以深化对方法的理解创新能力。
内容概要:本文提出了一种考虑阶梯式碳交易供需灵活双响应的综合能源系统优化调度模型,并通过Matlab代码实现。该模型深度融合了阶梯式碳交易机制电力系统中需求侧及供给侧的灵活响应能力,构建了一个涵盖电、热、气等多种能源形式耦合的综合能源系统框架。通过引入阶梯碳价机制,有效激励系统低碳运行,同时结合需求响应供给调整的协同优化策略,显著提升了系统运行的经济性环保性。研究采用先进的数学优化方法对模型进行求解,实现了对系统内各能源单元出力、储能设备调度、负荷转移等关键变量的全局最优配置,为实现能源高效利用碳排放最小化的双重目标提供了科学支撑。; 适合人群:具备电力系统、能源系统建模或优化调度等相关背景的科研人员工程技术人员,特别适合从事综合能源系统规划、低碳调度策略、碳交易机制设计等方向研究的研究生及高校教师。; 使用场景及目标:①深入研究阶梯式碳交易机制在综合能源系统中的建模方法应用效果;②实现供需双侧灵活互动下的系统经济性低碳化协同优化调度;③为区域能源系统的低碳转型提供量化分析工具决策支持依据;④作为Matlab平台下能源系统优化建模的教学案例或科研复现参考。; 阅读建议:建议读者结合提供的Matlab代码逐行解析模型构建过程,重点掌握目标函数约束条件的数学建模逻辑及其程序实现方式。在学习过程中应积极尝试调整碳价阶梯参数、改变负荷响应场景以观察系统优化结果的变化,从而深化对模型机理的理解。同时,可将本模型单一碳价或其他需求响应模型进行对比分析,进一步拓展研究视野创新思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值