《Java核心技术卷1:基础知识》CH5-继承

文章目录

  • 简述
  • 5.1 类、超类、子类
    • 5.1.1 定义子类
    • 5.1.2 覆盖方法
    • 5.1.3 子类构造器
    • 5.1.4 继承层次
    • 5.1.5 多态
    • 5.1.6 理解方法调用
    • 5.1.7 阻止继承:final类和方法
    • 5.1.8 强制类型转换
    • 5.1.9 抽象类
    • 5.1.10 受保护访问
  • 5.2 Object: 所有类的超类
    • 5.2.1 equals方法
    • 5.2.2 相等测试与继承
    • 5.2.3 hashCode方法
    • 5.2.4 toString方法
  • 5.3 泛型数组列表
    • 5.3.1 访问数组列表元素
    • 5.3.2 类型化与原始数组列表的兼容性
  • 5.4 对象包装器与自动装箱
  • 5.5 参数数量可变的方法
  • 5.6 枚举类
  • 5.7 反射
    • 5.7.1 Class类
    • 5.7.2 捕获异常
    • 5.7.3 利用反射分析类的能力
    • 5.7.4 在运行时使用反射分析能力
    • 5.7.5 使用反射编写泛型数组代码
    • 5.7.6 调用任意方法
  • 5.8 继承的设计技巧


简述

本章主要阐述面向对象设计的三大特性之一:继承。所谓继承,指的是基于已经存在的类,构造一个新类;这样,新类(一般称之为子类)就可以复用已存在的类(一般称之为父类)的方法和域,而又可以增加一些新的方法和域。继承可以大大的减少代码量,其关键字是extends

本章还介绍了一个关键概念,反射(reflection)。但是反射的概念比较困难,这里暂且不表,我目前也不理解。


5.1 类、超类、子类

5.1.1 定义子类

// Manager类:子类、派生类、孩子类
// Employee类:父类、超类、基类
public class Manager extends Employee  // Manager类,继承了Employee类
{
	private double bonus;

	public void setBonus(double bonus)
	{
		this.bonus = bonus;
	}

	public double getSalary()
	{
		double baseSalary = super.getSalary();  // 调用父类Employee中的getSalary()方法
		return baseSalary + bonus;
	}

	public Manager(String name, double salary, int year, int month, int day)
	{
		super(name, salary, year, month, day);  // 简写形式,调用父类Employee中含有这5种参数的构造函数
		bonus = 0;
	}
}

5.1.2 覆盖方法

对于相同名字的方法,子类中的方法可以重写,以覆盖父类中的方法;使用关键字super调用父类中的方法;

public class Manager extends Employee  // Manager类,继承了Employee类
{
    double baseSalary = super.getSalary();  // 调用父类的getSalary()方法
    return baseSalary + bonus;
}

5.1.3 子类构造器

5.1.4 继承层次

5.1.5 多态

5.1.6 理解方法调用

5.1.7 阻止继承:final类和方法

5.1.8 强制类型转换

5.1.9 抽象类

5.1.10 受保护访问

  • super关键字,用于调用父类的方法;
  • 由一个公共超类派生出来的所有类的集合,被称为继承层次;在继承层次中,由某个特定类到其祖先的继承路径,被称之为继承链;
  • Java不支持多继承;
  • Java中,对象变量是多态的;
  • final关键字修饰的类,是不允许扩展的,它阻止了其他人利用该类作为父类,去定义新的子类;同样,final修饰的方法,不能被重写;final修饰的变量,不能改变其值;
  • 如果一个类声明为final,只有其中的方法自动的成为final,而不包括成员变量;
  • 类的类型转换;
  • 抽象类。如果自下而上的在类的继承层次结构中上移,位于上层的类更具有通用性,甚至可能更加抽象,将其作为其他类的祖先的父类,并用abstract修饰;
  • 最好将类中的成员变量标记为private,而将方法标记为public;任何声明为private的内容,对其他类都是不可见的;
  • protected修饰符,可以使得父类中的方法被子类访问,或允许子类的方法访问父类的成员变量;

5.2 Object: 所有类的超类

5.2.1 equals方法

5.2.2 相等测试与继承

5.2.3 hashCode方法

5.2.4 toString方法

  • Object类是Java中所有类的始祖,在Java中所有类都是由它扩展开来了;如果没有明确的指出其父类,那么该类的父类即是Object;
  • Java中,只有7种基本类型不是对象,包括:数值、字符、布尔类型等;
  • equals:用于检测一个对象是否等于另外一个对象;这个方法将判断两个对象是否具有相同的引用;
  • instanceof
  • getClass
  • hashCode:散列码hashCode是对象导出的一个整型值,并且没有规律。由于hashCode()方法定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储地址;
  • toString:返回对象的字符串;
  • getClass:包含对象信息的类对象;
  • getName:返回这个类的名字;
  • getSuperclass:以Class对象的形式返回这个类的父类信息;

5.3 泛型数组列表

5.3.1 访问数组列表元素

5.3.2 类型化与原始数组列表的兼容性

  • ArrayList是一个采用类型参数的泛型类,为了指定数组列表保存的元素对象类型,需要用一对尖括号将类名括起来加在后面;
  • add:向泛型数组中增加元素;
  • ensureCapacity:确定泛型数组的元素个数;
  • size:返回泛型数组的长度;
  • trimToSize:将泛型数组的大小调整为当前元素所需要的存储空间;
  • set()
  • get()

5.4 对象包装器与自动装箱


5.5 参数数量可变的方法

  • 用户可以定义,可变的参数数量调用的方法;

5.6 枚举类

  • enum:枚举声明的是一个类,枚举的每个取值都是该类的实例,因此在比较两个枚举类型的值时,永远不要调用equals,直接用’=='就可以了;
  • toString
  • valueOf
  • values
  • ordinal
  • compareTo

5.7 反射

5.7.1 Class类

5.7.2 捕获异常

5.7.3 利用反射分析类的能力

5.7.4 在运行时使用反射分析能力

5.7.5 使用反射编写泛型数组代码

5.7.6 调用任意方法

  • 反射库用于编写能够动态操纵Java代码的程序;这项功能被大量用于JavaBeans中;特别是在设计和运行中添加新类时,能够快速的应用开发工具动态的查询新添加类的能力;
  • 能够分析类能力的程序,称为反射;
  • 这一节目前理解不透彻,暂时略过;

5.8 继承的设计技巧

你可能感兴趣的:(Java)