面向对象三大特性一一继承(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 ...
随机推荐
- 二、Jmeter录制脚本过程及Could not create script recorder报错、您的连接不是私密连接报错
两个报错:Could not create script recorder报错和您的连接不是私密连接报错 1.录制过程 * 打开jmeter * 点击Templated,选择Recoding模版 * ...
- 使用JMeter代理服务器录制APP脚本
重点:证书的安装,需要将Jmeter安装目录下证书传送到手机,使用手机安装(不要用QQ传送给手机,手机提示无法安装,可使用网盘方式传送,可成功安装证书) (出现该错误时,需安装证书) 简单的配置教程如 ...
- angularJS自定义服务的几种方式
在angularJS中定义服务共有四种常见的方式:factory,service,provider,constant,value 使用形式的不同: 1)factory以返回对象的形式定义服务: mya ...
- DKH大数据分析平台解决方案优势说明
大数据技术的发展与应用已经在深刻地改变和影响我们的日常生活与工作,可以预见的是在大数据提升为国家战略层面后,未来的几年里大数据技术将会被更多的行业应用. 相信很多人对于大数据技术的应用还是处于一个非常 ...
- Openwrt 3g模块
支持Huawei E367 一.编译选项的选择 都选上 都选上 Network目录下 Utiles Luci 二.USB连接3G模块时,显示如下,表示成功 三.没找到:
- 【shell】grep命令
1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局 ...
- php 生成.csv的文件
$data = array( "title" => array("服务器", "链接", "对应ID"), &qu ...
- 【C#】datetimepicker里面如何设置日期为当天日期,而时间设为0:00或23:59?
今天无意中发现要根据日期查询时间,datatimepicker控件会把时间默认成当前时间(当你的控件只显示日期时),这样查询出来的出来的数据会有误差,用来下面的办法成功设置日期为当天日期,而时间设为0 ...
- 建造者模式及C++实现
下面是我自己对建造者模式的理解.具体我还没在开发中应用过,这只是对于书本的理解. 建造者模式 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.这是建造者模式的标准 ...
- java web程序 登陆验证页面 4个页面人性化设置
到这里,快期末考试了,老师不讲课,我心里有苦不想说,也许没有考虑到老师的感受,让老师难堪了 但是我的行为已不再是我可以做的了.不可能了,我只是职业性的机械的做事了. 思路: 1.第一个是form表单, ...