前言

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

达到复用代码的方法有:

  1. 组合:新的类由现有类的对象所组成。(复用现有代码的功能,而非它的形式)
  2. 继承:按照现有类的类型组建新类。(不改变现有类的形式,复用现有类的形式并在其中添加新代码)。面向对象程序设计的基石

正文

1.组合语法

将对象引用置于新类中即可(非基本类型:在新类中放置引用,基本类型:直接添加就可以了)

/**
* 引擎
*/
class Engine{
/**
* 功率
*/
double power;
/**
* 品牌
*/
String type;
/**
* 无参构造方法
*/
Engine(){ }
/**
* 构造方法
* @param power
* @param type
*/
Engine(double power,String type){
this.power = power;
this.type = type;
} @Override
public String toString() {
return "Engine:power="+power+" type="+type;
}
}
/**
*火炮
*/
class Artillery{
/**
* 口径
*/
double caliber;
/**
* 构造方法
*/
Artillery(){ }
Artillery(double caliber){
this.caliber = caliber;
} @Override
public String toString() {
return "Artillery: caliber="+caliber;
}
}
/**
* 坦克
*/
public class Tank {
private Engine engine;
private Artillery artillery;
public Tank(Engine engine,Artillery artillery){
this.artillery = artillery;
this.engine = engine;
} @Override
public String toString() {
return "Tank:"+this.engine+""+this.artillery;
} public static void main(String[] args) {
Engine engine = new Engine(10000.0,"ABC");
Artillery artillery = new Artillery(1000);
Tank tank = new Tank(engine,artillery);
System.out.println(tank);
}
}

每一个非基本类型的对象都有一个toString()方法。可以打印对象,重写toString()方法能自定义打印的内容。

对于类中的域,若是基本类型则能自动初始化为0。但是对象引用会被初始化为null。

编译器不会简单的为每一个引用创建默认对象(如果创建默认对象的话,在许多情况下增加不必要的负担)

初始化引用的方法:

1.在定义对象的地方。(在构造器被调用前被初始化)

2.在类的构造器中。

3.正要使用这些对象之前(惰性初始化,可减少额外负担)

4.使用实例初始化。

class Soap{
private String s;
/**
* 构造器初始化
*/
Soap(){
System.out.println("Soap()");
s = "Constructed";
} @Override
public String toString() {
return s;
}
}
public class Bath {
/**
* 在定义对象的地方(在构造器被调用前初始化)
*/
private String s1 = "Happy",
s2 = "Happy",
s3,
s4;
private Soap castille;
private int i;
private float toy;
public Bath(){
System.out.println("Inside Bath()");
s3 = "Joy";
toy = 3.14f;
castille = new Soap();
}
/**
* 实例初始化
*/
{
i=47;
} @Override
public String toString() {
/**
* 惰性初始化
*/
if(s4==null)
s4="Joy";
return "s1 = "+s1+
"\ns2 ="+s2+
"\ns3 ="+s3+
"\ns4 ="+s4+
"\ni ="+i+
"\ntoy ="+toy
+"\ncastille ="+castille;
} public static void main(String[] args) {
Bath b = new Bath();
System.out.println(b);
}
}

继承语法

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

当创建一个类时,总是在继承。(除非已明确指出从其他类中继承,否则就是隐式的继承自Java的标准根类Object)

关键字:extends(子类会自动得到父类中所有的域和方法)

class Cleanser{
private String s = "cleanser";
public void append(String a){
s += a;
}
public void dilute(){
append("dilute()");
}
public void apply(){
append("apply()");
}
public void scrub(){
append("scrub()");
} @Override
public String toString() {
return s;
} /**
* 可以为每个类都创建一个main方法,使每个类的单元测试变得容易。
* @param args
*/
public static void main(String[] args) {
Cleanser cleaner = new Cleanser();
cleaner.dilute();
cleaner.apply();
cleaner.scrub();
System.out.println(cleaner);
}
}
public class Detergent extends Cleanser{
/**
* 重写Cleanser的scrub方法
*/
public void scrub() {
append("Detergent.scrub()");
super.scrub();
}
/**
* 在子类中添加新的方法
*/
public void foam(){
append("foam()");
} public static void main(String[] args) {
Detergent detergent = new Detergent();
detergent.dilute();
detergent.apply();
detergent.scrub();
detergent.foam();
System.out.println(detergent);
System.out.println("Test base classes:");
//调用Cleanser的main方法
Cleanser.main(args);
}
}

初始化基类(父类)

class Art{
Art(){
System.out.println("Art Constructor");
}
}
class Drawing extends Art{
Drawing(){
//Java会自动在子类的构造器中插入对父类构造器的调用(即super()方法的调用)
// super();
System.out.println("Drawing Constructor");
}
}
public class Cartoon extends Drawing {
public Cartoon(){
// super();
System.out.println("Cartoon Constructor");
} public static void main(String[] args) {
Cartoon cartoon = new Cartoon();
}
}

结果:

Art Constructor
Drawing Constructor
Cartoon Constructor

带参数的构造器

若没有默认构造器,或想调用一个带参数的基类构造器,就必须使用关键字super显式地编写调用基类构造器的语句,并且配以适当的参数列表:

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

Java编程思想学习笔记——复用类的更多相关文章

  1. Java编程思想学习(五) 复用类

    1.继承与组合 复用类的方法有两种:继承与组合.继承就不多说了,组合就是直接在类中new一个对象. 数组也是对象,使用数组也是组合的一种. 2.初始化基类 当创建一个导出类的对象时,该对象包含一个基类 ...

  2. [Java编程思想-学习笔记]第3章 操作符

    3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...

  3. Java编程思想 学习笔记7

    七.复用类 1.组合语法 在新的类中产生现有类的对象.由于新的类是由现有类的对象所组成,所以这种方法叫做组合. 类中域为基本类型时能够自动被初始化为零.对象引用被初始化为null. 编译器不是简单地为 ...

  4. [Java编程思想-学习笔记]第2章 一切都是对象

    2.1  创建新的数据类型:类 通过第一章掌握了面向对象的理论后,我们知道每个对象必定属于一个类型,那么Java如何创建新的数据类型?如下程序所示: class Circle { // 属性 // 方 ...

  5. Java编程思想 学习笔记2

    二.一切都是对象 1.用引用操纵对象 在Java中,一切都被视为对象,但操纵的标识符实际上是对象的一个“引用”.可以将这想象成遥控器(引用)来操纵电视机(对象).另外,没有电视机,遥控器也可以单独存在 ...

  6. Java编程思想学习笔记——类的访问权限

    类的访问权限 Java中,访问权限修饰词用于确定库中哪些类对于该库的使用者是可用的. public class Foo{ } 注意点: 每个文件(编译单元)只能有一个public类. public类的 ...

  7. Java编程思想 学习笔记1

    一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...

  8. [Java编程思想-学习笔记]第1章 对象导论

    1.1  抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...

  9. Java编程思想 学习笔记11

    十一.持有对象  通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...

随机推荐

  1. 微服务之springCloud和docker-provide(二)

    简介 通过上一节我们已经通过docker-compose在swarm中部署了有三个实例的高可用eureka服务注册中心,本节我们讨论一下,怎么在创建一个spring cloud生产者,并用docker ...

  2. Go Revel - Routing(路由)

    `Routing`路由控制着请求应该由哪些控制器接受. 它在项目的`conf/routes`文件中定义. 格式为: (METHOD) (URL Pattern) (Controller.Action) ...

  3. java中GZIPOutputStream 流的使用(EOFException)

    GZip流的使用非常多人都出现了以下的异常:java.io.EOFException: Unexpected end of ZLIB input stream.或者出现压缩后的数据不全的情况(就是压缩 ...

  4. OCiOS开发:音频播放器 AVAudioPlayer

    简单介绍 AVAudioPlayer音频播放器可以提供简单的音频播放功能.其头文件包括在AVFoudation.framework中. AVAudioPlayer未提供可视化界面,须要通过其提供的播放 ...

  5. linux安装android sdk

    https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip 1,先安装java https://developer.and ...

  6. SpringMVC深度探险(二) —— SpringMVC概览

    对于任何事物的研究,总是由表及里.由浅入深地进行.在本系列的第二篇文章中,我们将通过不同的观察视角,对SpringMVC做一些概要性的分析,帮助大家了解SpringMVC的基本构成要素.SpringM ...

  7. ClassNotFoundException和NoClassDefFoundError的解决办法

    程序在其他手机都没有问题,但在刷到版本稍微较低的平板或手机上时就会直接闪退,并报出以下异常: java.lang.RuntimeException: Unable to instantiate act ...

  8. Sword protobuf学习一

    protobuf简介 Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. 它不依赖于语言和平台并且可扩展性 ...

  9. USB2.0学习笔记连载(十七):keil实现寄存器的配置及相关函数讲解(一)

    首先要实现对寄存器的配置,可以参考手册<Development kit  User Guide>,如下图所示: 此文件包含在 文件中.上述的应用文档详细介绍了如何利用KEIL实现对固件程序 ...

  10. Apple iOS MDM service 简介

    Apple iOS MDM service 簡介 藉由MDM服務,企業可以用來控管配發給員工的iOS Device.可以採用Apple官方推出的工具,也可以採用第三方開發的服務. MDM server ...