记住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)的更多相关文章

  1. 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍

    面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...

  2. java面向对象三大特性之继承

    通过重用已经测试并验证通过的代码,怎样才减少开发工作,所有开发团队都在为一问题而努力.一个久经考验的方法是通过有效地使用Java继承优化应用程序开发. 继承的从某种意义上讲,继承的短暂美就如同宇宙中所 ...

  3. python学习 day23 面向对象三大特性之继承

    ### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...

  4. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  5. Java中面向对象三大特性之继承

    1. 继承的概述 继承就是子类继承父类的变量和方法,下面用代码解释一下: class Student {// 定义学生类 String name; int age; void study() { Sy ...

  6. C#面向对象三大特性:继承

    什么是继承 定义:继承是面向对象编程语言中的一个重要特性,当一个类A能够获取另一个类B中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系.被继承的类B称为父类或基类 ...

  7. python基础(24):面向对象三大特性一(继承)

    1. 继承 1.1 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继 ...

  8. python面向对象三大特性之继承

    继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...

  9. python面向对象三大特性之一继承、多态、封装

    继承,即在定义一个类时,以另一个类为参数,则称这个新定义的类继承了参数类,父类又称为基类. 单继承表示只继承一个类,多继承表示继承多个类. class parent1: pass class pare ...

随机推荐

  1. 联想服务器配置 RAID

    联想服务器配置 RAID BIOS 中配置 RAID 阵列卡 x3650 和 x3850 一.进入 RAID 1.在开机自检时按 F1 进入 UEFI 配置界面 2.选择 System Setting ...

  2. debian之apt源

    美国的 deb http://ftp.us.debian.org/debian stable main contrib non-freedeb-src http://ftp.us.debian.org ...

  3. PHP $_SERVER 祥细解读(有事例)

    为了看的更明白,添加上了事例 例如  'www.ceshiyuming.com/ceshi.php?p=123';Array(    [HOSTNAME] =>     [PATH] => ...

  4. BASIC-17_蓝桥杯_矩阵乘法

    示例代码: #include <stdio.h>#define N 30 int main(void){ int n = 0 , m = 0 , sum = 0; int i = 0 , ...

  5. Android logcat命令详解

    一.logcat命令介绍 1.android log系统 2.logcat介绍 logcat是android中的一个命令行工具,可以用于得到程序的log信息 log类是一个日志类,可以在代码中使用lo ...

  6. elastix php session保存地点

    这段时间要做 asterisk 的HA 放啊,需要同步session,所以做了下来研究. 1)elastix中的session 其实是存放在 /tmp/目录中的.可是/etc/php.ini中的[se ...

  7. rman备份恢复命令之switch(转)

    一 switch 命令1 switch命令用途更新数据文件名为rman下镜像拷贝时指定的数据文件名更新数据文件名为 set newname 命令指定的名字. 2 switch 命令使用前提条件rman ...

  8. php mysql_db_query()函数使用介绍

    php mysql_db_query()函数选择一个数据库并在其上执行查询,本文章向大家介绍mysql_db_query()函数的基本使用方法和实例,需要的朋友可以参考一下本文章. mysql_db_ ...

  9. PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别

    这篇文章主要介绍了PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别,本文给出了这两个参数的5个区别,需要的朋友可以参考下 虽然nos ...

  10. linux 定时

    http://blog.csdn.net/jingxiangren/article/details/4745631