复用代码是Java众多引人注目的功能之一。

一般而言,实现代码重用java提供了两种方式:组合以及继承。

  • 组合:新的类由现有类的对象所组成。(复用现有代码的功能,而非它的形式)
  • 继承:按照现有类的类型组建新类。(在不改变现有类的基础上,复用现有类的形式并在其中添加新代码)。

组合

class Engine{
public void start(){}
public void stop(){}
}
class Door{
public void open(){}
public void close(){}
}
class Window{
public void rollup(){}
public void rolldown(){}
}
public class Car {
private Engine engine=new Engine();
private Door door=new Door();
private Window window=new Window();
public static void main(String[] args) {
Car car=new Car();
car.engine.start();
car.door.close();
car.window.rolldown();
}
}

可以看到 组合方式是显式性地在新类中放置子对象,而继承则是隐式地做。

继承

继承是所有OOP(面向对象的编程语言)语言,包括Java语言不可缺少的组成部分。

class Art{
Art(){
System.out.print("Art constructor");
}
}
class Drawing extends Art{
Drawing(){
System.out.print("Drawing constructor");
}
}
public class Cartoon extends Drawing{
public Cartoon(){
System.out.print("Cartoon constructor");
}
public static void main(String[] args) {
Cartoon c=new Cartoon();
}
}

输出:

Art constructor
Drawing constructor
Cartoon constructor

上面的例子中,父类在子类初始化之前就完成了初始化,因为在子类初始化时默认调用了父类的无参构造器。请注意一下几点:

  • 构造器不能被继承, 一个类能得到构造器,只有两个办法:编写构造器,或者使用默认无参构造器。
  • 如果想要调用父类有参数的构造器,则必须在子类的构造器中显式地通过super关键字调用父类的构造器,并配以适当的参数列表(必须放在第一行)。
  • 如果想要调用父类无参数的构造器,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。

再来看个例子:

class Art{
Art(int i){
System.out.println("Art Constructor i");
}
}
class Drawing extends Art{
Drawing(int i){
//super(i)显式调用基类(父类)的构造器方法
super(i);
System.out.println("Drawing Constructor i"); }
}
public class Cartoon extends Drawing {
public Cartoon(int i){
//super(i)显式调用基类(父类)的构造器方法
super(i);
System.out.println("Cartoon Constructor i");
} public static void main(String[] args) {
Cartoon cartoon = new Cartoon(1);
}
}

输出:

Art constructor 1
Drawing constructor 1
Cartoon constructor 1

总结

继承和组合都能从现有类型生成新类型。组合一般是将现有类型作为新类型底层实现的一部分来加以复用,而继承复用的是接口。

在使用继承时,由于导出类具有基类接口,因此它可以向上转型至基类,这对多态来讲至关重要。

尽管面向对象编程对继承极力强调,但在开始一个设计时,一般应优先考虑使用组合(或者可能是代理),只在确实必要时才使用继承。因为组合更具灵活性。此外,通过对成员类型使用继承技术的添加技巧,可以在运行时改变那些成员对象的类型和行为。因此,可以在运行时改变组合而成的对象的行为。

在设计一个系统时,目标应该是找到或创建某些类,其中每个类都有具体的用途,而且既不会太大(包含太多的功能而难以复用),也不会太小(不添加其它功能就无法使用)。如果你的设计变得过于复杂,通过将现有类拆分为更小的部分或添加更多的对象,通常会有所帮助。

当你开始设计一个系统时,应该认识到程序开发是一种增量过程,犹如人类的学习一样,这一点很重要。程序开发依赖于实验,你可以尽己所能去分析,但当你开始执行一个项目时,你仍然无法知道所有的答案。如果将项目视作是一种有机的、进化着的生命体而去培养,而不是打算像盖摩天大楼一样快速见效,就会获得更多的成功和更迅速的回馈。继承和组合正是在面向对象程序设计中使得你可以执行这种实验的最基本的两个工具。

参考:

《Java编程思想》

Java继承

Java编程思想学习笔记——复用类

Java基础—复用类的更多相关文章

  1. Java基础 -- 复用类(组合和继承)

    复用类有两种实现方式. 在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以这种方法称之为组合. 采用继承实现. 一  组合语法 下面创建两个类WaterSource和Sprinkler ...

  2. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  3. java基础-BigDecimal类常用方法介绍

    java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...

  4. java基础-BigInteger类常用方法介绍

    java基础-BigInteger类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigInteger类概述 Java中long型为最大整数类型,对于超过long ...

  5. java基础-Arrays类常用方法介绍

    java基础-Arrays类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Array类的概念 此类包含用来操作数组(比如排序和搜索)的各种方法.需要注意,如果指定 ...

  6. java基础-Math类常用方法介绍

    java基础-Math类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Math类概念 Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函 ...

  7. java基础-System类常用方法介绍

    java基础-System类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.System类概念 在API中system类介绍的比较简单,我们给出定义,system中 ...

  8. java基础-Integer类常用方法介绍

    java基础-Integer类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需 ...

  9. Java基础-Calendar类常用方法介绍

    Java基础-Calendar类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Calendar类概念 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 Y ...

随机推荐

  1. hive 用户订单行为 基础操作

    今天用hive查询用户日志表.这是日志表的格式: user_id,item_id,cat_id,merchant_id,brand_id,month,day,action,age_range,gend ...

  2. 移动端H5实现图片上传

    移动端H5实现图片上传 https://segmentfault.com/a/1190000010034177

  3. libubox组件(2)——blob/blobmsg (转载 https://segmentfault.com/a/1190000002391970)

    一:blob相关接口 1.数据结构 1: struct blob_attr { 2: uint32_t id_len; /** 高1位为extend标志,高7位存储id, 3: * 低24位存储dat ...

  4. dropdown多选下拉框

    写好了一个dropdown多选框.直接粘下面代码就能用 效果展示: temp2.jsp <%@page import="com.util.LabelCacheManager" ...

  5. PNP与NPN三极管

    主要区别是电流流向和电压不同:PNP管子是发射极流入后从基极和集电极流出,NPN管子是基极和集电极流入从发射极流出.PNP管子工作在放大区时电压是,Ue>Ub>Uc,NPN管子工作在放大区 ...

  6. chrome 设置代理服务器

    通过设置google chrome浏览器的代理服务器可以让google chrome浏览器通过代理服务器上网,可以隐藏本机的IP地址或者访问一些不能直接访问的网站. 工具/原料   google ch ...

  7. wtform 表单示例

    用户注册 from flask import Flask, render_template, request, redirect from wtforms import Form from wtfor ...

  8. 41个Web开发者必须收藏的JavaScript实用技巧

    1. 将彻底屏蔽鼠标右键 oncontextmenu=”window.event.returnValue=false” < table border oncontextmenu=return(f ...

  9. python3 - 闭包

    # 定义一个函数def test(number): # 在函数内部再定义一个函数,并且这个函数用到外边函数的变量, # 那么将这个函数以及用到的一些变量称之为 闭包. def text_in(numb ...

  10. 构造方法、this和super

    1.构造方法概述 创建对象的时候会调用构造方法.创建对象时需要给对象的属性初始化,这时需要有参的构造方法. 构造方法的格式: 修饰符 构造方法名(参数列表) { } 构造方法的体现: 构造方法没有返回 ...