Java基础—复用类
复用代码是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基础 -- 复用类(组合和继承)
复用类有两种实现方式. 在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以这种方法称之为组合. 采用继承实现. 一 组合语法 下面创建两个类WaterSource和Sprinkler ...
- 第二十九节:Java基础知识-类,多态,Object,数组和字符串
前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...
- java基础-BigDecimal类常用方法介绍
java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...
- java基础-BigInteger类常用方法介绍
java基础-BigInteger类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigInteger类概述 Java中long型为最大整数类型,对于超过long ...
- java基础-Arrays类常用方法介绍
java基础-Arrays类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Array类的概念 此类包含用来操作数组(比如排序和搜索)的各种方法.需要注意,如果指定 ...
- java基础-Math类常用方法介绍
java基础-Math类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Math类概念 Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函 ...
- java基础-System类常用方法介绍
java基础-System类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.System类概念 在API中system类介绍的比较简单,我们给出定义,system中 ...
- java基础-Integer类常用方法介绍
java基础-Integer类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需 ...
- Java基础-Calendar类常用方法介绍
Java基础-Calendar类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Calendar类概念 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 Y ...
随机推荐
- 浅谈js中继承的理解和实现
一.前言 java.C#等正统面向对象语言都会提供类似extend之类的处理类的继承的方法,而javascript并没有提供专门的方法用于继承,在javascript中使用继承需要一点技巧.js中实例 ...
- Verilog HDL test bench 문법에 관한
16bit ripple carry adder test bench `timescale 1ns/1ns module testbench2; reg [15:0] a, [15:0] b, c_ ...
- linux学习之缓存机制
linux中的缓存机制 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回 ...
- java - day10 - uptest
package day03; public class UpTest { public static void main(){ Aoo o = new Aoo(); o.a = 3; o.b = 3; ...
- C# 委托和Lambda表达式
看了一些资料,简要的总结一下委托,Lambda,事件. 委托. 1)委托的含义 委托定义了函数类型,是一种类似“C++函数指针”的东西. 但委托和函数指针还是不同的,函数指针不过是一个函数的入口地址( ...
- FreeBSD中实现root的ssh
在虚拟机中刚装好FreeBSD,结果不能以远程方式登录root,然后在如下链接中找到了解决方法: http://blog.chinaunix.net/uid-26719405-id-3822697.h ...
- CodeIgniter 框架在Apache服务器下去掉index.php 总结
最近一段时间一直研究CI框架,但是对CI框架的跳转链接一直需要加index.php前缀,经过CI论坛的各种解决方案,最后总结记录一下自己实际操作去掉index.php的过程. 1.要修改Apache ...
- java中Statement详细用法。
1.创建 Statement 对象 建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句.Statement 对象用 Connection 的方法createStatement 创建,如下列代 ...
- poj 1270(dfs+拓扑排序)
题目链接:http://poj.org/problem?id=1270 思路:就是一简单的dfs+拓扑排序,然后就是按字典序输出所有的情况. http://paste.ubuntu.com/59872 ...
- 第二章----python函数
第一节:调用函数 1.函数是什么? 函数是组织好的,可以重复利用的. 2.为什么要用到函数? 提高应用的模块性,提高重复利用率.指的是:多个文件中可能都要用到该函数,直接拿来调用就行,不用在重复写一个 ...