面向对象三大特性一一继承(inheritance)和组合(Composition)
记住2句话(常识),像个正常人思考!
1.“ is-a ”关系 用 继承! 学生是人,学生继承人这个类,
2. “has-a ”关系 用 组合!电脑有显卡,那么我们就在计算机类中增加显卡属性来复用显卡类的代码。
使用继承的代码
/**
*继承的好处
* 1 OOP面向对象 编程 提高代码复用性
* 2 OOD面向对象 设计 对某一类的抽象 实现对现实世界更好的建模
* 类继承 是单继承 构造方法 不继承 java.lang.object是根基类 如果你继承后边什么不写 他会继承根基类 接口是多继承
* @author Administrator
* overwrite重写 子类对父类的方法 不满意 重写
*
*/
public class Animal {
String eye; public void run(){
System.out.println("跑跑!");
}
public void eat(){
System.out.println("吃吃!");
}
public void sleep(){
System.out.println("睡觉觉!");
}
/*可以不写 编译器帮我们写
* 构造方法 可写可不写,一般不写, 因为Animal是Object的子类
* 因为Object是根基类 所以 Object没有super();
public Animal(){
super();//super必须在第一行
System.out.println("创建一个动物");
}*/
} class Mammal extends Animal{ public void taisheng(){ System.out.println("我是胎生");
}
} class Paxing extends Animal{ public void eggsheng(){
System.out.println("我是卵生");
}
} class Bird extends Animal{
//不满意可以重写 overwrite
public void run(){
super.run();//调用的原来父类Animal的run();方法
System.out.println("飞啊飞");
} public void eggsheng(){
System.out.println("我是卵生");
}
/**
* 同上
public Bird(){
super();
System.out.println("建一个鸟对象");
}
*/ }
main方法
public class Test {
public static void main(String[] args) {
Bird b = new Bird();
b.run();
//System.out.println(b.toString());
}
}
控制台
跑跑!
飞啊飞
使用组合的代码
/**
* 组合 的复用性更好 更灵活 继承和组合的区别 1.继承从OOA的层面讲 更容易建模 2.从OOD 的层面 具有复用性 组合 完成了 继承的部分功能 既
* 复用性 但没有继承容易建模
*/
public class Computer {
String eye; public void run() {
System.out.println("电脑已经开机!");
} public void sleep() {
System.out.println("关机!");
} // 测试组合
public static void main(String[] args) { Gpu g = new Gpu();
g.computer.run();
System.out.println("#####################");
g.run();// 空指针异常 为什么呢? } } class Gpu { Computer computer = new Computer(); public void run() { computer.run();
System.out.println("您的显卡TITAN X,开始工作");
} }
控制台
电脑已经开机!
#####################
电脑已经开机!
您的显卡TITAN X,开始工作
类继承和对象组合的优缺点
类继承和对象是复用的两种最常用的技术。
一:继承
继承是Is a 的关系,比如说Student继承Person,则说明Student is a Person。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。
继承的缺点有以下几点:
①:父类的内部细节对子类是可见的。
②:子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行为。
③:如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法必须做出相应的修改。所以说子类与父类是一种高耦合,违背了面向对象思想。
二:组合
组合也就是设计类的时候把要组合的类的对象加入到该类中作为自己的成员变量。
组合的优点:
①:当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象时不可见的。
②:当前对象与包含的对象是一个低耦合关系,如果修改包含对象的类中代码不需要修改当前对象类的代码。
③:当前对象可以在运行时动态的绑定所包含的对象。可以通过set方法给所包含对象赋值。
组合的缺点:①:容易产生过多的对象。②:为了能组合多个对象,必须仔细对接口进行定义。
由此可见,组合比继承更具灵活性和稳定性,所以在设计的时候优先使用组合。只有当下列条件满足时才考虑使用继承:
- 子类是一种特殊的类型,而不只是父类的一个角色
- 子类的实例不需要变成另一个类的对象
- 子类扩展,而不是覆盖或者使父类的功能失效
面向对象三大特性一一继承(inheritance)和组合(Composition)的更多相关文章
- 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍
面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...
- java面向对象三大特性之继承
通过重用已经测试并验证通过的代码,怎样才减少开发工作,所有开发团队都在为一问题而努力.一个久经考验的方法是通过有效地使用Java继承优化应用程序开发. 继承的从某种意义上讲,继承的短暂美就如同宇宙中所 ...
- python学习 day23 面向对象三大特性之继承
### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...
- 深入理解Java面向对象三大特性 封装 继承 多态
1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...
- Java中面向对象三大特性之继承
1. 继承的概述 继承就是子类继承父类的变量和方法,下面用代码解释一下: class Student {// 定义学生类 String name; int age; void study() { Sy ...
- C#面向对象三大特性:继承
什么是继承 定义:继承是面向对象编程语言中的一个重要特性,当一个类A能够获取另一个类B中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系.被继承的类B称为父类或基类 ...
- python基础(24):面向对象三大特性一(继承)
1. 继承 1.1 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继 ...
- python面向对象三大特性之继承
继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...
- python面向对象三大特性之一继承、多态、封装
继承,即在定义一个类时,以另一个类为参数,则称这个新定义的类继承了参数类,父类又称为基类. 单继承表示只继承一个类,多继承表示继承多个类. class parent1: pass class pare ...
随机推荐
- Java数组初始
首先要清楚数组变量与数组对象的概念.数组变量是一个引用变量,可以指向数组对象. int[] a = new int[]{7, 8, 9}; a是数组变量,指向有new创建的数组对象. 数 ...
- thinkphp3.2用户登录ajax提交验证
html代码 <if condition="!isset($_SESSION['account'])"> <div class="load lf&quo ...
- 学习 ASP.NET MVC
http://www.cnblogs.com/gaoweipeng/category/203080.html http://blog.csdn.net/liu_ben_qian/article/det ...
- sublime快捷键功能记录
shift+tab 向前缩进 ctrl+shift+k 删除当前行 菜单栏 view--side bar 选项 控制左侧文件展示视图 菜单栏“view”——“hideMiniMap” or &qu ...
- CentOS 静态IP设置&修改网卡名
一.CentOS版本查看的方法 1. lsb_release -a (若报命令找不到,直接yum install lsb –y) 2. cat /etc/redhat-release 二.CentOS ...
- 搭建OpenStack先电云平台
实际操作示意图 在VMware里面创建两台centos7的虚拟机作为搭建云平台的两节点配置如下: 1.第一台虚拟机 作为控制节点 2CPU 3G以上内存 硬盘50G 网络适配器一个nat 一个仅主 ...
- GitLab更新远程分支信息
项目开发中,当远程分支有变动,有人增加或删除了某些分支,而自己本地没有及时自动刷新出来分支的时候,可以用以下命令来更新以下分支信息 git fetch origin --prune 恩,就酱-
- [UE4]射击和直线追踪
只有有朝向的组件(如character.Controller等)才能动态获取到朝向,在编辑视图中会有一个箭头表示正前方: 如果是没有朝向的组件(如摄像机),则获取到的朝向永远是固定的
- 高通QMI协议
QMI(Qualcomm MSM Interface,官方名称应该是Qualcomm Message Interface)是高通用来替代OneRPC/DM的协议,用来与modem通信. QMI协议定义 ...
- ie6,7下的textarea的type获取
<input type='button' value="按钮" class='gys'> <textarea class='gys gystextarea'> ...