[think in java]第7章 复用类

java中,复用代码有两种途径:

  1. 在新的类中产生现有类的对象。由于新的类是由现有类的对象组成的,所以这种方法称为组合。
  2. 采用继承的方式来复用。

继承

继承采用关键字extends实现。

java用super关键字表述超类的意思。

初始化基类

当创建一个子类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类创建的对象是一样的。对基类子对象的正确初始化也至关重要,而且也只有一种方法来保证这一点:在构造器中调用基类的构造器执行初始化。看下面这个例子:

public class Cartoon extends Drawing{
	public Cartoon() {
		System.out.println("Cartoon constructor");
	}

	public static void main(String [] args){
		Cartoon cartoon = new Cartoon();
	}

}
class Art{
	Art() {
		System.out.println("Art constructor");
	}
}

class Drawing extends Art {
	public Drawing() {
		System.out.println("Drawing constructor");
	}
}

Art constructor

Drawing constructor

Cartoon constructor

可以发现,构建过程是从基类“向外”扩散的。如果构造器要带有参数,则子类构造其需要显示的用super调用基类的构造器。

在组合与继承之间选择

组合和集成都允许在新的类中放置子对象,组合是显示的这样做,而继承则是隐示的这样做。这二者该如何选择呢?这里有个规则:“is-a”(是一个)的关系用继承来表达的。而“has-a”(有一个)的关系则是用组合来表达的。

向上转型

每个子类都可以看作为它基类的类型。这个过程称为向上转型。

final关键字(类似c++ 中的 const)

final关键字通常指的是“这是无法改变的”。final常用于基本类型,表示final使数值恒定不变。而对于对象引用设为final,则表示引用恒定不变。一旦引用被初始化指向一个对象,将无法在把它指向其他对象。然而,对象自身的值确实可以被改变的。

空白final,指被声明为final但又未给定初值的域。这种情况将要求你一定在类构造器为其初始化。如:

public class Cartoon extends Drawing{
	private final int i;
	public Cartoon() {
		i = 0;
		System.out.println("Cartoon constructor");
	}

	public static void main(String [] args){
		Cartoon cartoon = new Cartoon();
	}

}

final参数,指在参数列表中将参数声明为final,则在方法中无法更改final所指参数。

final方法,用于将方法锁定,以防任何继承类修改它。

类中所有的private方法都隐示的指定为final的。由于无法取用private方法,所以u也就无法覆盖它。可以对private方法添加final修饰词,但并未产生额外的意义。但这个问题很容易造成误解。因为,如果你试图覆盖一个private方法(隐含是final的),似乎是奏效的,而且编译器也不会给出错误信息。如下所示:

public class Cartoon extends Drawing{
	public Cartoon() {
		System.out.println("Cartoon constructor");
	}

	private void play(){
		System.out.println("Cartoon play");
	}

	public static void main(String [] args){
		Cartoon cartoon = new Cartoon();
	}

}

class Drawing  {
	public Drawing() {
		System.out.println("Drawing constructor");
	}

	private void play(){
		System.out.println("Drawing play");
	}
}

程序并没报错。这是因为“覆盖”只有在某方法是基类的接口的一部分时才出现。而上例中基类Drawing中的play()方法是private的,是被隐藏的,Cartoon类无法接触的。所以即使Cartoon类中创建了play()方法,它也不是对基类方法的覆盖,而是直接创建了一个新的方法。

final类表示禁止继承该类。

时间: 2024-10-27 10:01:26

[think in java]第7章 复用类的相关文章

[Thinking in Java]第7章-复用类

7.1 组合语法 7.2 继承语法 7.3 代理 7.4 重载和覆盖 7.5 初始化以及类的加载 目录 7.1 组合语法 组合就是把对象放在新类中,做新类的成员,比如 class A { } class B { private String value1, value2, value3; private A a = new A(); private int integer; private double d; } 如上所示,类A对象作为类B的一个成为,此外,类B还具有类String3个对象,又有

Thinking In Java笔记(第七章 复用类)

第七章 复用类 复用代码是Java众多引人注目的功能之一,但想要成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情. Java中所有事物都是围绕着类来展开的.通过创建新类来复用代码,不必重新开头编写.此方法的窍门在于使用类而不破坏现有程序代码.本章中有两种代码重用机制来达到这一目的: 只需要在新的类中生成现有类的对象.由于新的类是由现有类的对象所组成的,这种方法通常成为组合.该方法只是复用了现有程序代码功能,而非形式上和之前的类有相似之处. 第二种方法更加细致

《JAVA编程思想》学习笔记——第七章 复用类

复用类的主要方式有两种:组合,继承 组合 例: class A {} class B {A a;} 继承 继承是所有OOP语言和Java语言不可缺少的组成部分.当创建一个类时,总是在继承,因此,除非已明确指出要从其它类中继承,否则就是在隐式地从Java的标准根类Object进行继承. 继承适用关键词:extends,继承会自动得到基类中所有的域和方法 super super关键字表示超类的意思,当前类就是从超类继承来的.调用超类方法:super.funcName(); 初始化基类 无参构造器,J

Java编程思想:第7章 复用类

复用代码是Java众多引人注目的功能之一.但仅仅能复制代码并对之加以改变是不够的,还需要做更多的事情. 复用代码的两种形式: 1.组合,新类中产生现有类对象 2.继承,用现有类型创建新类型 7.1组合语法 7.2继承语法 7.2.1初始化基类 当创建了一个导出类的对象时,该对象包含了一个基类的子对象.这个子对象与你用基类直接创建的对象是一样的(Java会自动在导出类构造器里插入对基类构造器的调用,基类只含带参构造需要自己用super调用,不可省略),二者区别在于继承时基类的子对象包装在导出类对象

Java编程思想(四) —— 复用类

看了老罗罗升阳的专访,情不自禁地佩服,很年轻,我之前以为和罗永浩一个级别的年龄,也是见过的不是初高中编程的一位大牛之一,专访之后,发现老罗也是一步一个脚印的人.别说什么难做,做不了,你根本就没去尝试,也没有去坚持. If you can't fly then run,if you can't run then walk, if you can't walk then crawl,but whatever you do,you have to keep moving forward--Martin

Java编程思想之七复用类

复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须做更多的事情. 使用类而不破坏程序代码: 在新类中产生现有对象.由于新的类是由现有类的对象组成,所有这种方法称为组合. 按照现有类的类型来创建新类.无需改变现有类的形式,采用现有类的形式并在其中添加新代码.这种方法是继承. 7.1 组合语法 组合只需要将对象引用置于新类中就可以了. 但编译器并不是简单的为每一个引用都创建默认对象.如果想初始化这些引用,可以在代码中下列位置进行:

《Java编程思想》笔记 第七章 复用类

1.组合 将其他类的对象引用置于新的类中. 3.继承 关键词extends  一个类继承基类后自动获得 基类的所有域(包括字段 引用 内部类 )和方法,当然不包括private,子类中调用继承下来的方法也不需要基类对象引用.继承相当于对基类的一个扩展,因为基类有的它都有,再额外添加了一些域和方法(或覆写方法)而已. 4.super 4.1 super.f() 调用基类的f()方法. 4.2 构造器中的super(args) 调用基类构造器,且只能在第一行. 4.3 由于构造器被重载后默认构造器不

JAVA代码重用机制复用类之继承语法(附源码)

前言 继承是所有OOP语言和Java语言不可缺少的组成部分.当创建一个类时,总是在继承,因此,除非已明确指出要从其他类中继承,否则就是在隐式地从Java的标准根类Object进行继承. 组合的语法比较平实,但是继承使用的是一种特殊语法.在继承过程中,需要先声明"新类与旧类相似".这种声明是通过在类主体的左边花括号之前,书写后面紧随基类名称的关键字extends而实现的.当这么做时,会自动得到基类中所有的域和方法.例如: 示例源码 基类 package com.mufeng.thesev

第七章-复用类-继承语法-2初始化基类-带参构造器

书上代码示例: 1 package com.learnJava.test; 2 3 /** 4 * @Author zhuchangli 5 * @Date 2019/9/14 6 **/ 7 class Game{ 8 Game(int i){ 9 System.out.println("Game constructor"); 10 } 11 } 12 13 class BoardGame extends Game{ 14 BoardGame(int i){ 15 super(i);