继承是实现类重用的重要手段,但是它有一个最大的坏处:破坏封装。相比之下,组合也是实现类重用的重要方式,但是采用组合方式实现类重用则能提供更好的封装性。比如人有手一样,在人的类中增加一个手的属性。



  • 何时使用继承呢:

1,子类需要增加额外的属性,不仅仅是属性值的改变

2,子类需要增加自己独有的行为方式

  • 为了保证父类有良好的封装性,不会被子类随意改变,设计父类通常应该遵循以下规则:

1,尽量隐藏父类的内部数据。尽量把父类的所有属性都设置成private访问类型,不要让子类直接访问父类的属性

2,不要让子类可以随意访问,修改父类的方法。

父类中那些仅为辅助其他的工具方法,应该使用private访问控制符修饰,让子类无法访问该属性。

如果父类中的方法需要被外部类调用,则必须是public修饰,但是又不希望子类重写这个方法,可以使用final修饰符来修饰。

如果希望父类的某个方法被子类重写,但不希望被其他类自由访问,使用protected修饰。

3,尽量不要再父类构造器中调用将要被子类重写的方法。下面代码演示这个可能陷入的误区:

/**
*
* @version 1L
* @author LinkinPark
* @since 2014-10-28
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^在写继承的时候 注意构造器可能造成的误区:尽量不要再父类构造器中调用将要被子类重写的方法
*/
public class SubClass extends BaseClass{
private String name; @Override
public void test(){
System.out.println(name.length());
} public static void main(String[] args) {
//这里在new这个子类对象的时候,实际上调用了子类重写的Test方法,那么这个时候name是null,下面代码将造成空指针异常
SubClass linkin = new SubClass();
}
} class BaseClass{
//在new一个子类的时候,将调用这个默认的无参的构造器
public BaseClass(){
test();
}
public void test(){
System.out.println("1");
}
}

  • 那么什么时候继承,什么时候使用组合呢?

一般 → 特殊:继承关系,是"is a"关系,Java通过extends表示这种关系。

整体 → 部分:组合关系,Java语言通过在一个类中保存另一个对象的引用实现这种关系。是"has a"关系。

注意:上面2者的系统开销一样的,即使是继承也会为父类属性开辟内存空间的。

linkin大话面向对象--组合的更多相关文章

  1. linkin大话面向对象--类和对象

    我们每天在撸码,那么我们在敲什么东西呢?明显的我们在写类,写一个类,写一个接口,写某个接口里面写一些属性,在某个类里面写一个方法,然后以一个对象调用方法,对于j2ee来讲的话,可能还会写一些jsp,静 ...

  2. linkin大话面向对象--闭包和回调

      先来理解2个概念:闭包和回调   什么是闭包? 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为他不仅包含了外部类对象的信 ...

  3. linkin大话面向对象--多态

    java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...

  4. linkin大话面向对象--GC和jar包

    GC java的垃圾回机制是java语言的重要机制之一.当程序创建对象,数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中.当这块内存不再被任何变量引用时,这块内存就 ...

  5. linkin大话面向对象--内部类

    内部类说白了就是类中有类 内部类:嵌套类 外部类:宿主类 内部类主要有以下作用:记住了3个字:多继承... 1,内部类提供了更好的封装,可以把内部类隐藏在外部类中,不允许同一个包中的其他类访问该类. ...

  6. linkin大话面向对象--枚举

    枚举类(enum) 其实我们使用到枚举的地方还是很多的,其实我们可以完全人工的来实现枚举的功能.比如说我现在手里的项目我就是自己实现的枚举,说白了,枚举就是一个类的多例模式. 1,使用enum声明,默 ...

  7. linkin大话面向对象--包装类

    Java提倡的万物皆对象,但是数据类型的划分出现了基本数据类型和引用数据类型,那么我们怎么能把基本数据类型称为对象呢? 基本数据类型 包装类 byte Byte short Short int Int ...

  8. linkin大话面向对象--java关键字

    java中的关键字有以下几个,他们不能作任何其它的用途. 发现没,java中的关键字全是小写,java是严格区分大小写的. abstract  default  null  synchronized ...

  9. linkin大话面向对象--初始化块

    java使用构造器来对单个对象进行初始化操作,使用构造器先完成整个java对象的状态初始化,然后将java对象返回给程序,从而让整个java对象的信息更加完整.与构造器作用非常类似的是初始化块,它也可 ...

随机推荐

  1. 使用ControllerAdvice注意事项,Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]

    前言 ControllerAdvice非常好用,可以把系统内部的异常统一处理.用起来也很简单.比如,http://www.cnblogs.com/woshimrf/p/spring-web-400.h ...

  2. Linux redhat ICE环境安装

    1.安装64位redhat6.4操作系统(客户机为64位)为软件开发工作站模式. 2.卸载yum源,重新安装为免费的CentOS6.4 yum源(yum能解决软件安装中的包依赖问题,redhat 未注 ...

  3. 如何利用git shell提交代码到github

    在很早之前我根据找到的一些资料以及自己的实践总结了一篇如何将VS2015上的代码上传到GitHub上,后来我发现有小伙伴私信我,说跟我上面写的不一样,但是那段时间也比较忙,当我发现有人私信的时候差不过 ...

  4. python中的深拷贝和浅拷贝理解

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用.以下分两个思路来分别理解浅拷贝和深拷贝: 利用切 ...

  5. 【CentOS】php编译安装gd库

    一.准备工作 使用之前服务器按源码最小化安装完nginx.php-fpm,没有安装gd库,下面介绍下gd库的安装. gd库是一个开源的图像处理库,它通过提供一系列用来处理图片的API,使其可以用来创建 ...

  6. Video Target Tracking Based on Online Learning—TLD单目标跟踪算法详解

    视频目标跟踪问题分析         视频跟踪技术的主要目的是从复杂多变的的背景环境中准确提取相关的目标特征,准确地识别出跟踪目标,并且对目标的位置和姿态等信息精确地定位,为后续目标物体行为分析提供足 ...

  7. SSH Secure Shell Client最新版,解决Win10不兼容问题

    SSH的工具很多,像XShell,SecureCRT等等. 不过我一直用的是:SSH Secure Shell Client 主要的原因就是: 软件本身带文件浏览的功能,可以通过拖拽去实现文件上传和下 ...

  8. SSL数字证书Nginx配置部署

    由于小程序和Ios端的需要,公司的项目需要从原来的http协议扩展到https协议,因为项目本来就有采用nginx做了负载均衡,但是之前配置nginx的时候并没有配置关于https的内容,所以需要做这 ...

  9. TI-RTOS 之 GPIO中断(按键)

    TI-RTOS 之 GPIO中断(按键) 前面已经用过LED, 定时器,这次来了解GPIO的中断是怎么用的,从CC1310+TI-RTOS的例程可以直接找到相应的例子程序,它的关键是在于要使能中断,也 ...

  10. HDU 5914 Triangle(打表——斐波那契数的应用)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Problem Description Mr. Frog has n sticks, whos ...