继承
概念:基于某个父类的扩展,制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来不具备的属性和方法,或者直接重写父类中的某些方法。
- 子类不能直接访问超类的私有域,而是需要通过super调用超类的公有函数来访问,并且子类可以用同名方法覆盖(重写)超类中的方法
- 子类构造器中如果没有显式调用超类的构造器,则系统会自动调用超类默认构造器
final类:
不允许扩展的类(不允许定义子类)final方法:
不允许子类覆盖的方法;final类中所有的方法自动成为final方法,但域不会自动成为final。目的:确保它们不会在子类中改变语义
重写
- 重写是在子类中将父类的成员方法的名称保留,重写成员方法的实现内容,更改成员方法的存储权限(只能从小变大),或是修改成员方法的返回值类型(重写的返回值类型必须是父类中同意方法返回值类型的子类)。
- 重构:子类与父类的成员方法返回值、方法名称、参数类型以及个数完全相同,唯一不同的是方法实现内容。
构造
在实例化子类对象时首先要实例化父类对象,再实例化子类对象,所以在子类构造方法访问父类构造方法之前,父类已经完成实例化操作。
多态
- 向上转型:将父类对象变量赋值成子类对象(具体到抽象)。一个对象变量可以指示多种实际类型的现象,一个声明为超类的对象变量也可以引用子类对象。
- 置换法则:程序中任何出现超类的地方都可以用子类对象置换
- 向下转型:将父类对象转换为子类对象。
在执行向下转型之前应该先判断父类对象是否为子类对象的实例,通常用instanceof操作符来完成。可以使用instanceof操作符判断一个类是否实现了某个接口,也可以判断一个实例是否属于一个类。
多态可以解决代码冗余问题,同时也易于维护。
重载
在同一个类中允许同时存在一个以上的同名方法,只要参数个数或类型不同即可。
编译器总是利用方法名、方法各参数类型和参数的个数以及参数顺序来确定类中的方法是否唯一。
抽象
抽象类不能实例化对象,抽象方法没有方法体,抽象类必须被继承,否则没有意义。
抽象方法一定在抽象类里
重载和重写的区别:
重载和重写都是实现多态的方式,区别是前者是在编译时的多态性,后者是运行时的多态性。
重载的规则:
- 方法名一致,参数列表中参数的顺序、类型、个数不同
- 重载与方法返回值无关,存在于同类中
- 可以抛出不同的异常,可以有不同的修饰符
重写的规则:
4. 参数列表必须与被重写方法一致,返回类型必须一致或是被重写方法返回类型的子类
5. 构造方法、final方法、static方法不能被重写,但能够被再次声明
6. 访问权限不能比被重写方法更低
7. 不能比父类被重写方法声明更多的异常
抽象类和接口的区别:
抽象类:
- 可以定义构造器
- 可以有具体方法
- 成员可以是public、protected、private
- 可以定义成员变量
- 可以包含静态方法
- 有抽象方法的类一定是抽象类,反之不一定
- 一个类只能继承一个抽象类
接口:
- 不能定义构造器
- 方法都是抽象方法
- 成员都是public
- 定义的成员变量实际都是常量
- 不能有静态方法
- 一个类可以实现多个接口
相同:
- 不能实例化
- 可以将抽象类和接口类型作为引用类型
- 继承了抽象类或接口的类需要将抽象方法全部实现,否则仍是抽象类
来源:《java从入门到精通》