Java核心技术卷Ⅰ第五章继承

第五章 继承

5.1 类、超类和子类

5.1.1 定义子类

public class Manager extends Employee{
	添加方法和域
}

extends表明正在构造的新类派生于一个已存在的类。

5.1.2 覆盖方法

Manager类中的getSalary不能够直接访问超类的私有域,也就是说,尽管每个Manager对象都拥有一个名为salary的域,但在Manager类的getSalary方法中不能直接访问salary域。只有Employee类的方法才能访问私有部分。

我们需要调用父类中的方法,可以使用特定的关键字super解决这个问题

5.1.5 多态

“is-a”规则,它表明程序中出现超类对象的任何地方都可以用子类对象置换

Employee e;
e = new Employee(...);
e = new Manager(...);//ok, Manager can be used as well

5.1.6 理解方法的调用

假设要调用x.f(args),隐式参数x声明为类C的一个对象。下面是调用过程的详细描述:

  • 编译器查看对象的声明和方法名。假设调用x.f(param),且隐式参数x声明为C类的对象。需要注意的是,可能存在很多f,但参数类型不一样。f(int)、f(String)。编译器将列出所有C类中和超类(public)中名为f的方法。
  • 接下来,编译器查看调用方法时提供的参数类型,

5.1.7 阻止继承:final类和方法

当把类定义为final时,不允许其扩展。
类中特定的方法也可以被声明为final。如果这样做,子类就不能覆盖这个方法

5.1.9 抽象类

为了提高程序的清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的

5.2 Object:所有类的超类

5.2.1 equals方法

Object中的equals方法用于检测一个对象是否等于另一个对象。

5.2.2 相等测试与继承

Java语言规范要求equals方法具有下面的特性:

  • 自反性:对于任何非空引用x,x.equals(x)返回true
  • 对称性
  • 传递性
  • 一致性

5.2.3 hashCode方法

散列码(hash code)是由对象导出的一个整型值。散列码是没有规律的。
如果重新定义equals方法,就必须重新定义hashCode方法,以便用户可以将对象插入到散列表中。

5.2.4 toString方法

下面是Employee类中的toString方法的实现:

public String toString(){
	return "Employee[name="+ name + ",salary=" + salary...
}

但实际上,最好通过调用getClass().getName()获得类名的字符串,而不要将类名硬加到toString方法中。

public String toString(){
	return getClass().getName()+"[name="+ name + ",salary=" + salary...
}

5.3 泛型数组列表

ArrayList是一个采用类型参数的泛型类。

数组列表管理者对象引用的一个内部数组。最终,数组的全部空间有可能被用尽。这就显现除数组列表的操作魅力:如果调用add且内部数组已经满了,数组列表就将自动的创建一个更大的数组,并将所有的对象从较小的数组拷贝到较大的数组中

5.4 对象包装器与自动装箱

有时,需要将int这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。例如,Integer->int。通常,这些类称为包装器(wrapper)。

你可能感兴趣的:(Java基础,java,开发语言,jvm)