谈谈Java中的继承与组合

Java继承与组合 我们举例写的类是现实事物的抽象. 而我们真正开发所遇到的项目往往业务比较复杂, 可能会涉及到一系列复杂的概念, 都需要我们使用代码来表示, 所以真实项目中所写的类也会有很多. 类之间的关系也会更加复杂.即使如此, 我们并不希望类之间的继承层次太复杂. 一般我们不希望出现超过三层的继承关系. 如果继承层次太多, 就需要考虑对代码进行重构了.继承(inheritance)机制:面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类的特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。 阅读详情
1.继承和组合的概念
在新类里简单地创建原有类的对象。我们把这种方法叫作“组合”,因为新类由现有类的对象合并而成。我们只是简单地重复利用代码的功能,而不是采用它的形式。
第二种方法是创建一个新类,将其作为现有类的一个“类型”。我们可以原样采取现有类的形式,并在其中加入新代码,同时不会对现有的类产生影响。这种魔术般的行为叫作“继承”(Inheritance),涉及的大多数工作都是由编译器完成的。对于面向对象的程序设计,“继承”是最重要的基础概念之一。对于组合和继承这两种方法,大多数语法和行为都是类似的(因为它们都要根据现有的类型生成新类型)。
2.组合也就是一个类的对象是另外一个类的成员,一般的程序都有组合的意味,只不过是基本数据类型是成员变量,下面请看具体的例子
class Head
{
       Head(){
      System.out.println(" head ");
      }
}
class Body
{
      Body(){
      System.out.println(" body ");
      }
}
class Person()
{
      Head h=null;
      Body b=null;
     Person()                                //人是由头和身体组成的,Head和Body的对象是Person的一部分
    {
      h=new Head();
      b =new Body();
    }
 
}
 
3.继承作为面向对象的三个重要特性的一个方面,在面向对象的领域有着及其重要的作用,好像没听说哪个面向对象的语言不支持继承
 class Person
{
 private String name=null;
 private int age=0;
 public Person(String n,int a)
 {
  name=n;
  age=a; 
 }
 int getAge()
 { 
  return age;
 }
 String getName()
 { 
  return name;
 }
 void getDescription()
 { 
  System.out.println("name: "+name+"/t"+"age: "+age);
 }
}
class Student extends Person
{ 
 private String studno=null;
 public Student(String n,String no,int a)
 { 
  super(n,a);
  studno=no;
 }
}
说明:Student类中有三个成员变量name,age,studno和一个方法getDescription();
注意:子类继承了父类的所有变量和函数,只是子类不能访问父类的private类型的变量和函数,其实privae类型的变量还是继承到子类中的
 
4.
无论还是继承,都允许我们将子对象置于自己的新类中。大家或许会奇怪两者间的差异,以及到底该如何选择。
如果想利用新类内部一个现有类的特性,而不想使用它的接口,通常应选择组合。也就是说,我们可嵌入一个对象,使自己能用它实现新类的特性。但新类的用户会看到我们已定义的接口,而不是来自嵌入对象的接口。考虑到这种效果,我们需在新类里嵌入现有类的private对象。
有些时候,我们想让类用户直接访问新类的组合。也就是说,需要将成员对象的属性变为public。成员对象会将自身隐藏起来,所以这是一种安全的做法。而且在用户知道我们准备合成一系列组件时,接口就更容易理解。car(汽车)对象便是一个很好的例子:
class Engine {
  public void start() {}
  public void rev() {}
  public void stop() {}
}

class Wheel {
  public void inflate(int psi) {}
}

class Window {
  public void rollup() {}
  public void rolldown() {}
}

class Door {
  public Window window = new Window();
  public void open() {}
  public void close() {}
}

public class Car {
  public Engine engine = new Engine();
  public Wheel[] wheel = new Wheel[4];
  public Door left = new Door(),
       right = new Door(); // 2-door
  Car() {
    for(int i = 0; i < 4; i++)
      wheel[i] = new Wheel();
  }
  public static void main(String[] args) {
    Car car = new Car();
    car.left.window.rollup();
    car.wheel[0].inflate(72);
  }
} ///:~

由于汽车的装配是故障分析时需要考虑的一项因素(并非只是基础设计简单的一部分),所以有助于客户程序员理解如何使用类,而且类创建者的编程复杂程度也会大幅度降低。
如选择继承,就需要取得一个现成的类,并制作它的一个特殊版本。通常,这意味着我们准备使用一个常规用途的类,并根据特定的需求对其进行定制。只需稍加想象,就知道自己不能用一个车辆对象来组合一辆汽车——汽车并不“包含”车辆;相反,它“属于”车辆的一种类别。“属于”关系是用继承来表达的,而“包含”关系是用组合来表达的。

5. protected
现在我们已理解了继承的概念,protected这个关键字最后终于有了意义。在理想情况下,private成员随时都是“私有”的,任何人不得访问。但在实际应用中,经常想把某些东西深深地藏起来,但同时允许访问衍生类的成员。protected关键字可帮助我们做到这一点。它的意思是“它本身是私有的,但可由从这个类继承的任何东西或者同一个包内的其他任何东西访问”。也就是说,Java中的protected会成为进入“友好”状态。
我们采取的最好的做法是保持成员的private状态——无论如何都应保留对基 础的实施细节进行修改的权利。在这一前提下,可通过protected方法允许类的继承者进行受到控制的访问:
import java.util.*;

class Villain {
  private int i;
  protected int read() { return i; }
  protected void set(int ii) { i = ii; }
  public Villain(int ii) { i = ii; }
  public int value(int m) { return m*i; }
}

public class Orc extends Villain {
  private int j;
  public Orc(int jj) { super(jj); j = jj; }
  public void change(int x) { set(x); }
} ///:~

可以看到,change()拥有对set()的访问权限,因为它的属性是protected(受到保护的)。
 
6. 再论合成与继承
在面向对象的程序设计中,创建和使用代码最可能采取的一种做法是:将数据和方法统一封装到一个类里,并且使用那个类的对象。有些时候,需通过“组合”技术用现成的类来构造新类。而继承是最少见的一种做法。因此,尽管继承在学习OOP的过程中得到了大量的强调,但并不意味着应该尽可能地到处使用它。相反,使用它时要特别慎重。只有在清楚知道继承在所有方法中最有效的前提下,才可考虑它。为判断自己到底应该选用组合还是继承,一个最简单的办法就是考虑是否需要从新类上溯造型回基础类。若必须上溯,就需要继承。但如果不需要上溯造型,就应提醒自己防止继承的滥用。但只要记住经常问自己“我真的需要上溯造型吗”,对于组合还是继承的选择就不应该是个太大的问题
5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go) 5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go) 阅读详情

相关推荐

DeepSpeed Zero3 Offload实战:从GCC版本检查到环境配置的完整避坑指南

本文是一份针对DeepSpeed Zero3 Offload部署的完整避坑指南。针对训练中常见的`AttributeError: ‘DeepSpeedCPUAdam‘ object has no attribute ‘ds_opt_adam`报错,文章深入剖析了其根源在于GCC编译器版本过低。指南提供了从系统GCC版本深度探查、安全启用高版本GCC环境,到DeepSpeed一致性安装验证的全链路实战方案,旨在帮助用户构建稳定的大模型训练环境。

weixin_29070721的博客 473

Java- 继承 和 实现 、组合

Java- 继承 和 实现 、组合

人生在手 2385

双臂复合机器人眼在手外标定实战:从原理到D435标定流程详解

本文详细解析了双臂复合机器人中眼在手外标定的核心原理与实战流程。通过阐述坐标系转换与AX=XB方程,重点介绍了使用Intel RealSense D435相机进行标定的完整步骤,包括环境搭建、数据采集、计算与验证,并提供了关键的避坑指南,帮助工程师实现相机与机械臂基座间的精确坐标对齐。

weixin_29100927的博客 447

继承与组合(Java详解)

继承,super,组合,重写,转型

m0_61359105的博客 2093

保姆级教程:用Docker Compose一键部署WVP-PRO+ZLM+录像服务(含Nginx反代)

本文提供了一套完整的容器化GB28181视频平台部署方案,通过Docker Compose实现WVP-PRO、ZLMediaKit(ZLM)和录像服务的一键式部署。详细介绍了环境准备、架构设计、容器化部署实战以及高级配置优化,帮助用户快速搭建高性能视频监控管理平台,适用于安防行业和物联网设备管理场景。

weixin_30415113的博客 861

【高清照片】深圳光博会看PCIe Over Fibre 实现方案

本文分析了PCIe over Fibre技术及其在数据中心的应用前景。该技术通过光纤延伸PCIe总线,解决了传统铜缆距离限制问题,支持跨机架资源池化。目前主要有两种实现方式:CDFP混合光缆方案和Retimer转接卡方案,各有优缺点。文章还探讨了CDFP接口的现状、低速信号传输解决方案,以及PCIe速率与光通信发展的对应关系。最后对比了PCIe光缆与以太网光缆的关键差异,指出PCIe光互连在协议透明度和边带信号处理上的特殊要求。随着标准推进,PCIe over Fibre将成为数据中心扩展高带宽、低时延互连

Saniffer的博客 1385

从0到1,Java基础(9)——继承与组合

子类对父类进行扩展,从一般到特殊的关系,父类-共性,子类-特性继承表达的是一种“是(is-a)”的关系代表当前对象的父类对象。

学习小屋 338

告别专业软件!用QGIS+GDAL免费搞定S-57电子海图,附全套符号库和样式文件

本文详细介绍了如何利用免费开源工具QGIS和GDAL处理S-57电子海图,包括数据转换、符号库配置和专业可视化方案。通过实战指南,用户无需依赖昂贵的商业软件,即可实现从S-57到SHP的转换及专业级海图制作,特别适合预算有限的个人和小型机构。

weixin_33701294的博客 391

谈谈Java中的继承和多态

1.在类的加载阶段,执行静态代码块,并且只执行一次,且静态代码块是最先执行的.2.在实例化对象的过程中,才会执行实例代码块,执行完成后,才会执行构造方法.

m0_63562631的博客 562

Autosar EcuM配置-初始化及下电执行函数-基于ETAS软件

Autosar EcuM学习笔记-上电初始化执行函数及下电前执行函数,本文介绍在EcuM中的配置及使用。

赞的博客 849

视觉Transformer实战 | Token-to-Token Vision Transformer(T2T-ViT)详解与实现

Vision Transformer (ViT) 在计算机视觉领域取得了巨大成功,但标准的 ViT 存在一些局限性,如需要大规模预训练数据、对局部结构建模不足等。Token-to-Token ViT (T2T-ViT) 通过引入渐进式分词过程改进了原始 ViT,使其能够在中小型数据集上取得更好的性能。本节将详细介绍 T2T-ViT 的技术原理,并使用 PyTorch 从零开始实现 T2T-ViT。

盼小辉丶的博客 4万+

谈谈组合与继承的区别以及两者的使用场景

1.组合(has-a)关系可以显式地获得被包含类(继承中称为父类)的对象,而继承(is-a)则是隐式地获得父类的对象,被包含类和父类对应,而组合外部类和子类对应。 2.组合关系在运行期决定,而继承关系在编译期就已经决定了。 3.组合是在组合类和被包含类之间的一种松耦合关系,而继承则是父类和子类之间的一种紧耦合关系。 4.当选择使用组合关系时,在组合类中包含了外部类的对象,组合类可以调用外部类必须的方法,而使用继承关系时,父类的所有方法和变量都被子类无条件继承,子类不能选择。 5.最重要的一点,使用继承关系时

m0_51719566的博客 2233

Qt —— QWebEngineView加载谷歌离线地图(包含离线地图瓦片下载制作、附谷歌地图开发文档)

  关注 微信公众号搜索"Qt_io_"或"Qt开发者中心"了解更多关于Qt、C++开发知识.。 笔者 - jxd

1万+

为什么C++中的继承比Java设计的要复杂,原因竟出在这儿?

我们知道面向对象的三大特性有封装、继承和多态。可能有铁子会误以为面向对象只有这三大特性,其实不然,还有其他的特性,比如反射、抽象等。那今天我们就好好来说说C++是如何设计继承的,为什么说比Java的继承要复杂呢?下面我们看到Person类是父类,也叫基类;Student类是子类,也叫派生类。1、我们都说C++语法复杂,其实多继承就是一个体现。有了多继承,就会存在菱形继承,有了菱形继承就会有菱形虚拟继承,它们的底层实现相当复杂。...

安然无虞的博客 2316

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java 组合优与继承_Java中为什么老鸟要告诉你优先使用组合而不是继承?

新的一周,新的干货分享大家知道,面向对象有三个特征:继承、封装和多态。现在,我们谈谈关于继承的一些问题。了解一下继承的优点、缺点,以及继承缺点的解决方案。继承的起源,来自于多个类中相同特征和行为的抽象。子类可以通过继承父类,那么可以调用父类中定义的方法和属性,从而达到代码重用的目的。另外,子类除了重用父类的代码以外,还可以扩展自身的属性和方法,来描述子类特有的特征和行为。例如:人类和马类这两个类,...

weixin_42522009的博客 407

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复用-组合、继承、代理区别和用法

复用-组合、继承、代理区别和用法 继承主要有两个作用: 1.为导出类提供方法,这个特性在代码复用有比较多的应用 2.表现导出类与基类之间的关系。这个特性在多态里非常有用,后面会讲到。 我们先来讲为导出类提供方法这个特性——继承是代码复用中重要的一种方式,很难把它与复用割裂开看,而且放在一起比较似乎更容易理解继承在复用这方面的用途以及与其他两种方式的区别。那么这一篇我们讲组合&amp;amp;amp;继承&amp;amp;amp;...

技术随笔驿站 1193

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

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

8.1 复用(组合/继承)

对于像 C 语言等面向过程语言来说,“复用”通常指的就是“复制代码”。任何语言都可通过简单复制来达到代码复用的目的,但是这样做的效果并不好。Java 围绕“类”(Class)来解决问题。我们可以直接使用别人构建或调试过的代码,而非创建新类、重新开始。 如何在不污染源代码的前提下使用现存代码是需要技巧的。在本章里,将介绍两种方式来达到这个目的: 第一种方式直接了当。在新类中创建现有类的对象。这种方式叫做“组合”(Composition),通过这种方式复用代码的功能,而非其形式。 第二种方式叫做“继承”(In

kking_edc的博客 1368

Java中的委托和继承(Delegation and Inheritance)

写在前面 概念 Delegation(委托) Dependency: 临时性的delegation Association: 永久性的delegation Composition: 更强的delegation Aggregation Composition vs. Aggregation Inheritance(继承) 各自特点 总结 写在前面 上课的时候对delega...

黑白沙漠 1万+

java——继承

文章目录一.继承1.1继承的概念1.2继承的语法1.3父类成员的访问1.3.1子类中访问父类的成员变量1.3.2子类访问父类的成员方法1.4super关键字1.5子类构造方法1.6super和this 一.继承 1.1继承的概念 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复

m0_62476684的博客 706

谈谈有关设计模式的思想精髓:变继承关系为组合关系、如何创建对象(单例、状态、装饰者模式)

说起设计模式,最广为人知的就是“四人帮”编写的设计模式,其书的副标题为软件中可重用的元素,此书本来是一篇博士论文,它将很多通用的设计思想总结并命名成设计模式,希望开发人员之间通过专有的模式名称交流,可惜最为熟悉的是被滥用最多的Singleton单例模式,但是此书中有许多值得学习的思想。 从当今角度看此书,其中一部分模式是教我们如何对现实的事物去建模,这是“设计”。而有一部分则是受到了“语言限制”

lemonGuo的大脑皮层、小脑、海马体、杏仁核..... 1881

JavaScript面向对象(4)——最佳继承模式(从深拷贝、多重继承、构造器借用,到组合寄生式继承)

       很多同学甚至在相当长的时间里,都忽略了JavaScript也可以进行面向对象编程这个事实。一方面是因为,在入门阶段我们所实现的各种页面交互功能,都非常顺理成章地使用过程式程序设计解决了,我们只需要写一些方法,然后将事件绑定在页面中的DOM节点上便可以完成。尤其像我这类一开始C++这类语言没好好学,第一门主力语言就是JavaScript的同学来说,过程化程序设计的思维似乎更加根深蒂固。...

贰拾肆樵 1373

设计模式之美学习(八):为何说要多用组合少用继承?如何决定该用组合还是继承?

在面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。为什么不推荐使用继承?组合相比继承有哪些优势?如何判断该用组合还是继承? 为什么不推荐使用继承? 继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。所以,对于是否应该在项目中使用继承,网上有很多争议。很多...

微赚淘客开发者博客 585

谈谈java继承_简谈Java的继承-“谁都看得懂”篇

Java语言的继承这里简谈Java语言的三大特性之二——继承。Java语言的三大特性是循序渐进的、是有顺序性的,应该按照封装-->继承-->多态这样的顺序依次学习继承的定义百度百科中这样定义继承:继承是面向对象最显著的一个特性。它是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加...

weixin_39626745的博客 116
上一篇: 谈谈Java中的多态
下一篇: 谈谈Java中的访问控制
Cpp_Java_Man
博客等级 码龄21年 26粉丝 67原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值