继承

定义

继承就是在原有的类(父类)的基础上,增加新的方法或者修改原有的方法,产生的新的类型(子类)。
我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类、超类),如果我们新定义的一个类没有明确地指定继承自哪个基类,那么JAVA就会默认为它是继承自Object类的。

类的分类

类:使用class定义且不含有抽象方法的类。
抽象类:使用abstract class定义的类,它可以含有,也可以不含有抽象方法。
接口:使用interface定义的类。

类的继承规则

类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。
抽象类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。
接口只能继承(extends)接口。
普通类继承接口后,必须实现接口的全部方法,否则只能定义成抽象类

以上三条规律同时遵守下面这些约束:

类和抽象类都只能最多继承一个类,或者最多继承一个抽象类,并且这两种情况是互斥的,也就是说它们要么继承一个类,要么继承一个抽象类。
类、抽象类和接口在继承接口时,不受数量的约束,理论上可以继承无限多个接口。当然,对于类来说,它必须实现它所继承的所有接口中定义的全部方法。
抽象类继承抽象类,或者实现接口时,可以部分、全部或者完全不实现父类抽象类的抽象(abstract)方法,或者父类接口中定义的接口。
类继承抽象类,或者实现接口时,必须全部实现父类抽象类的全部抽象(abstract)方法,或者父类接口中定义的全部接口。

多态

继承是多态得以实现的基础。从字面上理解,多态就是一种类型表现出多种状态

父类引用子类对象

  • 对象类型永远不变,变的是引用类型。 对象的类型不会随着保存的引用类型而变化
  • 只能对引用调用其引用类型中声明的方法。 当引用为父类类型时,只能调用父类中声明的方法,子类独有的方法无法调用
  • 运行时会调用对象的实际类型中的方法。 当引用为父类类型时,调用的方法子类覆盖的话,调用的是子类覆盖的方法

多态的常见用法:

  • 引用使用多态
  • 方法的形参使用多态
  • 方法的返回值类型使用多态

instanceof 关键字

instanceof 关键字的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
Object testObject = new ArrayList();
displayObjectClass(testObject);
}
public static void displayObjectClass(Object o) {
if (o instanceof Vector)
System.out.println("对象是 java.util.Vector 类的实例");
else if (o instanceof ArrayList)
System.out.println("对象是 java.util.ArrayList 类的实例");
else
System.out.println("对象是 " + o.getClass() + " 类的实例");
}
}

以上代码运行输出结果为:

对象是 java.util.ArrayList 类的实例