• 可以基于已存在的类构造一个新类,复用(继承)这些类的方法和域,可以添加一些新的方法和域
  • “is-a”(是)关系
  • 一个子类到父类的路径被称为该类的继承链,父类可以拥有多个子类继承链,Java不支持多继承

    子类:extends

  • 在Java中,所有的继承都是公有继承

  • 应该将通用的方法放在超类中,而将具有特殊用途的方法放在子类中
  • 在子类中可以增加域、增加方法或覆盖超类的方法,然而绝对不能删除继承的任何域和方法。

    重写:override

  • 不能够直接地访问超类的私有域

  • 只有Employee类的方法才能够访问私有部分
  • 关键字super
  • 因为super不是一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字

    子类构造器

  • 子类必须通过父类构造器对父类私有域进行初始化,用super调用父类构造器

  • super调用构造器的语句必须放在子类构造器的第一条语句
  • 如果子类的构造器没有显式地调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中又没有显式地调用超类的其他构造器,则Java编译器将报告错误
  • 关键字this有两个用途:一是作为引用隐式参数,二是调用该类其他的构造器
  • 关键字super也有两个用途:一是调用超类的方法,二是调用超类的构造器
  • 构造参数既可以传递给本类(this)的其他构造器,也可以传递给超类(super)的构造器

    多态:程序中出现超类对象的任何地方都可以用子类对象置换

    即在Java程序设计语言中,对象变量是多态的。一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类的对象

    1. Employee e;
    2. e = new Employee(...);
    3. e = new Manage(...);
    4. Manage boss = new Manage(...);
    5. Employee[] staff = new Employee[3];
    6. staff[0] = boss;
  • 但编译器将staff[0]看成Employee对象,所以:boss.setBouns(…);//OK staff[0].setBouns(…);//Error

  • 不能将一个超类的引用赋给子类变量(不能向下转型)
  • 在Java中,子类数组的引用可以转换成超类数组的引用,而不需要采用强制类型转换
  • 所有数组都要牢记创建它们的元素类型,并负责监督仅将类型兼容的引用存储到数组中

    重载:overload(覆盖)

  • 即在子类中定义了一个与超类签名相同的方法

  • 返回类型不是签名的一部分,因此,在覆盖方法时,一定要保证返回类型的兼容性
  • 允许子类将覆盖方法的返回类型定义为原返回类型的子类型
  • 如果是private方法、static方法、final方法或者构造器,那么编译器将可以准确地知道应该调用哪个方法,我们将这种调用方式称为静态绑定(static binding)
  • 在覆盖一个方法的时候,子类方法不能低于超类方法的可见性

    阻止继承:final类和方法—确保它们不会在子类中改变语义

    即类或方法被声明为final,就不能被继承或重载

    强制类型转换:

  • 只有在使用Manager中特有的方法时才需要进行类型转换

  • Manage boss = (Manage)staff[0];
  • 即暂时忽视对象的实际类型之后,使用对象的全部功能
  • 在将超类转换成子类之前,应该使用instanceof进行检查

    抽象类:abstract

  • 只将它作为派生其他类的基类,而不作为想使用的特定的实例类;提高通用性

  • 可以写一个空字符串或使用abstract
  • 除了抽象方法之外,抽象类还可以包含具体数据和具体方法

    1. public abstract class Person{
    2. private String name;
    3. public Person(String name){
    4. this.name = name;
    5. }
    6. public abstract String getDescription();
    7. public String getName(){
    8. return name;
    9. }
    10. }
  • 不能包含具体方法

  • 继承或实现抽象类
  • 抽象类不能被实例化

受保护访问:proteced

  • 只能访问相互继承的域和方法

Object:所有类的超类

  • 如果没有明确地指出超类,Object就被认为是这个类的超类
  • 可以使用Object类型的变量引用任何类型的对象
  • Object类型的变量只能用于作为各种值的通用持有者。要想对其中的内容进行具体的操作,进行相应的类型转换,再执行操作
  • 在Java中,基本类型不是对象,数组是对象类型,都扩展了Object类

    equals方法

  • 用于判断两个对象是否具有相同的引用(即比较内容是否相同)

    hashcode方法

  • 散列码(hash code)是由对象导出的一个整型值,没有规律的

    toString方法

  • 返回表示对象值的字符串

  • 静态方法Arrays.toString;多维数组Arrays.deepToString
  • 强烈建议为自定义的每一个类增加toString方法

    泛型数组列表:ArrayList类

  • 在添加或删除元素时,具有自动调节数组容量的功能;

  • 在Java的老版本中,使用Vector类实现动态数组
  • 使用范型指定数组元素类型
  • 如果已经清楚或能够估计出数组可能存储的元素数量,就可以在填充数组之前调用ensureCapacity方法,设置大小