【Java】 5.8 继承和组合
目录
继承注意的问题
通过组合实现复用
使用组合或继承的时机
继承注意的问题
【继承带来的问题和解决的方式】继承是实现类复用的重要手段,但继承带来了一个最大的坏处:破坏封装性。相比较之下,组合也是实现类复用的重要方式,而且使用组合方式来实现类的复用则能提供更好的封装性。
【继承中设计父类的注意点】
- 尽量隐藏父类内部数据。尽量把父类的所有成员变量设置成 private 类型,不要让子类直接访问父类中的成员变量。
- 不要子类可以随意访问、修改父类的方法。
- 父类中那些仅为辅助其他的工具方法,应该使用 private 访问控制修饰符,让子类不能随意访问
- 如果父类中的方法需要被外部类调用,则必须以 public 访问控制符修饰符
- 如果仅希望子类访问父类的访问而不希望子类重写该方法,可以使用 final 修饰符来修饰
- 如果希望父类的方法的某个方法被子类重写,但不希望被其他类自由访问,可以用 protected 来修饰该方法
- 尽量不要在父类构造器中调用将要被子类重写的方法。
class Base{public Base() {test();}public void test() {System.out.println("这是父类的方法");}
}
public class Sub extends Base{private String name;public void test() {System.out.println("这是子类重写父类的方法,其name的长度是"+name.length());}public static void main(String[] args) {//以下代码为空指针异常Sub s = new Sub();}
}
【代码解释】为什么会出现空指针异常?
在创建Sub对象时,同样会先执行其父类构造器,若其父类构造器中调用了子类重写的方法时,则变成了调用被子类重写后的方法。这里实际上test()调用的实际上是下面Sub中的方法。由于name是null,所以就出现了NullPointerException
运行结果:
【何时应该派生子类】
- 子类需要额外增加属性,而不仅仅是属性值的改变
- 子类需要增加自己独有的行为方式
================================================================================
通过组合实现复用
class Animal {private void beat() {System.out.println("心脏跳动……");}public void breath() {System.out.println("吸一口气,吐一口气,呼吸中……");}
}class Bird2 {private Animal a;// 初始化实例public Bird2(Animal a) {this.a = a;}public void breath() {// 直接复用Animal提供的breath()方法来实现Bird的breath()方法a.breath();}public void fly() {System.out.println("飞翔……");}
}class Wolf {private Animal a;// 初始化实例public Wolf(Animal a) {this.a = a;}public void breath() {// 直接复用Animal提供的breath()方法来实现Bird的breath()方法a.breath();}public void run() {System.out.println("奔跑……");}
}public class CompositeTest {public static void main(String[] args) {Animal a1 = new Animal();Bird2 b = new Bird2(a1);b.breath();b.fly();Animal a2 = new Animal();Wolf w = new Wolf(a2);w.breath();w.run();}
}
【代码分析】首先这是使用组合实现复用的一种模式。一种有三个类分别是 Animal 、Bird 和 Wolf 三类,其中 Animal 类中 beat() 方法是不设计为与其他类共享,而 Bird 和 Wolf 类中,可以将Animal中的方法等打包为一个实例,通过实例初始化来具体调用,有一些可以的共享的可以直接复用:定义组合 → 初始化(构造器)→ 方法等
运行结果:从构造器到方法,先初始化实例后具体实现
==============================================================================
使用组合或继承的时机
组合:类之间存在整体和部分的关系
继承:类之间存在具体和抽象的关系
【Java】 5.8 继承和组合相关推荐
- Java中的继承与组合
本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过"组合"来改进这种继承的设计机制.最后总结这 ...
- 【Java SE】继承;组合;向上转型;动态绑定;方法重写;静态绑定;多态;抽象类;接口;
面向对象编程 文章目录 1. 包 1.1 导入包中的类 1.2 静态导入 1.3 将类放到包中 1.4 包的访问权限控制 1.5 常见的系统包 2. 继承 2.1 语法规则 2.2 protected ...
- Java基本知识——继承与组合
1.继承使用说明 1.1继承时的封装 在封装中我们希望进行封装操作的类的内部实现细节不会被其他类修改(set&get).想隐藏的信息不能被其他类直接访问(private修饰),但是通过继承的方 ...
- 详细分析如何在java代码中使用继承和组合
文章目录 继承与组合 何时在Java中使用继承 何时在Java中使用组合 继承与组成:两个例子 用Java继承重写方法 Java不具有多重继承 使用super访问父类方法 构造函数与继承一起使用 类型 ...
- java 继承 实现 会重写 方法吗_java 中继承,组合,重载,重写的实现原理 (转)...
我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...
- java依赖_java 依赖、组合、聚合与继承
java中类与类之间的关系 大部分的初学者只知道java中两个类之间可以是继承与被继承的关系,可是事实上,类之间的关系大体上存在五种-继承(实现).依赖.关联.聚合.组合. 接下来,简单的分析一下这些 ...
- java 继承 模型_java – 画布形状模型的继承与组合?
对于以下模型,您更喜欢继承还是组合: >我想在画布上绘制对象,每个对象代表一个数据对象 >将其视为状态机图:椭圆表示状态,线表示它们之间的连接/转换.对象表示本身永远不会改变,即状态将始终 ...
- C++ 面向对象(一)继承:继承、对象切割、菱形继承、虚继承、继承与组合
目录 继承 继承的概念 继承方式 基类与派生类的赋值转换 作用域与隐藏 派生类的默认成员函数 友元与静态成员 友元 静态成员 多继承 菱形继承 虚继承 继承和组合 什么是组合 如何选择组合和继承 继承 ...
- Scala入门到精通——第九节 继承与组合
主要内容 类的继承 构造函数执行顺序 方法重写 匿名类 多态与动态绑定 组合与继承的使用 1 类的继承 下类的代码演示了Scala类的继承 //Person类 class Person(name:St ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...
最新文章
- android 自定义actionbar前面有一块空白,解决Android V7后自定义Toolbar、ActionBar左侧有空白问题...
- OpenResty请求参数处理
- 两个向量之间的夹角公式_向量的内积
- 华为手机连电脑_手机、电脑无网高速互传!华为神技逆天
- linux中 字符串,linux内核驱动中对字符串的操作
- 计算机图形学基础第七章ppt,第三章 计算机图形学基础ppt课件.ppt
- OpenWrt开发必备软件模块——网络管理(CWMP、SSH、QoS、SMTP、NTP、uHTTPd)
- linux iozone测试工具,iozone命令 – 进行linux下的硬盘性能测试
- mysql分区数据覆盖_彻底搞懂MySQL分区
- WLAN和WIFI区别以及组网方式
- 聊聊 Redis 是如何进行请求处理
- c语言实现string sds,redis内部数据结构之SDS简单动态字符串详解
- 矩阵顺时针逆时针旋转90°
- 先决条件检查失败错误
- VS 错误: cout 不明确
- order by语句使用
- css3 的filer 功能
- 天线工程手册_相控阵天线方向图第3部分:旁瓣和锥削
- 查看公司内网 IP 占用情况
- 传奇服务端游戏中禁止或者允许删除人物怎么设置的?
热门文章
- poj 3101 Astronomy (java 分数的最小公倍数 gcd)
- Quartz在Spring中动态设置cronExpression
- red hat enterprise 6.3 change to chinese
- 论论资排辈和有能者居之
- linux mktime函数会受当前环境变量设置的时区影响
- 循环神经网络:RNN、LSTM、GRU、BPTT
- 区块链BaaS云服务(39)时戳信息Bystack“架构设计”
- [GWCTF 2019]babyvm
- 数据结构课程设计——机票售卖系统(C++)
- 14-Providing protection for complex software