继承

类、超类和子类

定义子类

  • 通过扩展超类定义子类的时候,只需要指出子类与超类的不同之处。
    将一般的方法放在超类中,而将更特殊的方法放在子类中。

覆盖方法

  • 继承可以增加字段、方法或覆盖方法但绝对不会删除任何字段或方法。

子类构造器

  • 如果子类的构造器没有显式地调用超类地构造器,将自动调用超类的无参数构造器

多态

  • 程序中出现超类对象的任何地方都可以使用子类对象替换。
  • 子类引用的数组可以转换成超类引用的数组,而不需要使用强制类型转换,但所有数组都要牢记创建时的元素类型,并负责监督仅将类型兼容的引用储存到数组中。

理解方法调用

  • 如果在子类中定义了一个与超类签名相同的方法,那么子类中的这个方法就会覆盖超类中这个相同签名的方法。
  • 在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。特别是,如果超类方法是public,子类方法必须也要声明为public。

阻止继承:final类和方法

不允许扩展的类被称为final类。类中的某个特定方法也可以被声明为final,则子类不能覆盖这个final方法。

  • final类中的所有方法都自动称为final方法,但字段不为final。

强制类型转换

  • 强制类型转换的唯一原因:要在暂时忽略对象的实际类型之后使用对象的全部功能。
  • 如果将一个子类的引用赋给一个超类变量,编译器是允许的。但将一个超类的引用赋给一个子类变量时,就承诺过多了。必须进行强制类型转换,这样才能通过运行时的检查。

抽象类

  • 祖先类具有一般性,只需将它作为派生其他类的基类,而不是用来构造想使用的特定实例。
  • 使用abstract关键字,这样就不需要实现不需要实现的方法。
  • 为了提高程序的清晰度,包含一个或多个abstract方法的类本身必须被声明为abstract类。
  • abstract方法充当着占位方法的角色,它们在子类中具体实现。
  • 即使不含abstract方法,也可以将类声明为abstract类。
  • abstract不能实例化。
  • 可以定义一个abstract类的对象变量,但是改变量只能引用非abstract子类的对象

Object类:所有类的超类

Object类是java中所有类的始祖,java每个类都扩展了Object类,但不需要手动写extends Object。JVM和编译器会进行处理。

Object类型的变量

  • 可以使用Object类型的变量引用任何类型的对象
Object obj= new 任何对象类();
  • 在java中,只有基本类型不是对象。

equal方法

  • 检测一个对象是否等于另外一个对象
  • getClass方法将返回一个对象所属的类,只有两个对象属于同一个类时,才有可能相等。

相等测试与继承

  • 如果子类可以有自己的相等性概念,则对称性需求强制使用getClass检测。
  • 如果由超类决定相等性概念,使用instanceof检测,可以在不同子类的对象之间进行相等性比较

hashCode方法

  • 散列码(hash code)是由对象导出的一个整型数值(可以为负值),没有规律。
  • hashCode方法定义在Object类中,因此每个对象都有一个默认的散列码,其值由对象的储存地址得出。

toString方法

可以返回对象值的一个字符串。

  • 重写toString方法时,最好不要将类名写死,最好通过调用getClass().getName()获得类名的字符串,这样toString方法也可以由子类调用。子类可以调用super.toString+子类字段。

泛型数组列表

//TODO

对象包装器与自动包装

包装器类型是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。
包装器类为final,不能派生出子类。

参数数量可变的方法

方法入参如果有...,表面这个方法可以接收任意数量的对象

枚举类

  • 枚举的构造器总是私有的private,改字段可以省略。 如果声明一个enum构造器为public或protected,会出现语法错误。

反射

反射库:java提供了一个丰富且精巧的工具集,可以用来编写能够动态操纵java代码的程序。
能够分析类能力的程序称为反射。反射功能极其强大:

  • 在运行时分析类的能力。
  • 在运行时检查对象,例如,编写一个适用于所有类的toString方法
  • 实现泛型数组操作代码。
  • 利用Method对象,这个对象很像C++中的函数指针。

Class类

  • 在程序运行期间,java运行时系统始终为所有对象维护一个运行时类型标识,这个信息会跟踪每个对象所属的类。
  • 保存这些信息的类名为Class,Object类中的getClass()方法将会返回一个Class类型的实例。
  • 在启动时,包含main方法的类被加载,它会加载所有需要的类。这些被加载的类又要加载它们需要的类,以此类推。
  • 虚拟机为每个类型管理一个唯一的Class对象。

继承的设计技巧

  • 将公共操作和字段放在超类中
  • 不要使用protected的字段
  • 使用继承实现"is-a"关系
  • 除非所有继承的方法都有意义,否则不要使用继承
  • 在覆盖方法时,不要改变预期行为
  • 使用多态,而不要使用类型信息
  • 不要滥用反射

这个家伙很懒,啥也没有留下😋