面向对象三大特征之继承(extends)——Java笔记(六)
继承:
从一般到特殊的关系,是一种拓展关系,子类对象是父类的一种,也可称为”is a“的关系
泛化:
把子类里的共性抽取到父类里的来的过程
特化:
子类在父类的基础上上定义了自己特有的行为特征的过程
格式:
修饰符 class SubClass extends SuperClass{
}
SubClass :导出类、继承类、子类
SuperClass:父类、基类、超类、源类
子类SubClass通过extends来继承父类SuperClass
继承是通过extends来实现的
继承提高了代码的复用性,提高了软件的开发效率
让类与类之间产生关系,这个是实现多态的前提
子类对象访问实例成员的时候,是现在子类里找,要是找不到再去父类找
每个类有且只有一个直接父类
一个类没有显示的继承其他的一个类时候,默认的直接父类就是object类
一旦一个类显示的继承了其他的一个类的时候,此时默认的直接父类object就会被取消
Java只支持单继承不支持多继承
父类里面私有的东西,子类不能继承
在继承操作中,对于子类的对象实例化,子类对象在实例化之前必须首先调用父类中的构造方法之后在调用自身的构造方法子
证明:
1 class Super{ 2 public Super(){ 3 System.out.println("我是父类super"); 4 } 5 } 6 class Sub extends Super{ 7 public Sub(){ 8 System.out.println("我是子类sub"); 9 } 10 } 11 public class InstanceDemo { 12 public static void main(String[] args) { 13 new Sub(); 14 /** 15 * 我是父类super 16 * 我是子类sub 17 * 18 * 先打印的是父类里面的在打印的子类里面 19 * 从这个可以看出是先调用父类的构造方法创建父类对象再来调用子类里面的构造方法 20 * 21 */ 22 } 23 }
子类对象在初始化之前会默认调用父类无参的构造方法,但是一旦子类显示的调用了父类其他的构造方法,那么默认调用的构造方法将会被取消
方法的重写(Override):
当父类的某个方法不适合于子类本身的特征行为时就当重写父类中应当改变的方法
方法重写应遵循的原则:
方法签名(方法名+参数列表)必须相同
子类方法的返回值类型比父类方法的返回值类型更小或相等
子类方法声明抛出的异常应比父类方法申明跑出异常更小或相等,即子类方法不能抛出新的异常类型,子类方法可以同时声明抛出多个父类方法声明抛出异常的子类(RuntimeException例外)
子类方法的访问权限应比父类方法更大或相等
overload 与 override
|
区别点
|
重载(overload) |
重写(override)
|
1
|
判断规则
|
参数列表顺序不同、类型不同、个数不同都可以构成重载
同类中方法名相同,但是方法的参数列表不同,与方法的返回值类型和修饰符无关
|
方法签名(方法名+参数列表)必须相同
子类方法的返回值类型比父类方法的返回值类型更小或相等
子类方法声明抛出的异常应比父类方法申明跑出异常更小或相等
子类方法的访问权限应比父类方法更大或相等
|
2
|
权限 |
无权限要求
|
被重写的方法不能拥有比父类更严格的权限
|
3
|
范围
|
发生在一个类中
|
发生在继承关系中
|
4 |
多态
|
编译时多态
|
运行时多态
|
构造方法不能被重写
super关键字
表示父类对象的默认引用
如果子类要调用父类被覆盖的实例方法,可用super作为调用者调用父类被覆盖的实例方法
使用super调用父类方法
使用super调用父类的构造方法
对super的调用必须是构造器中的第一个语句
this不能出现在static修饰的方法中,super也一样不能出现在static修饰的方法中
因为static修饰的方法属于类,即调用者是类
this与super
|
区 别
|
this
|
super
|
1
|
使 用
|
调用本类中的字段或方法
|
从子类调用调用父类的字段或方法
|
2
|
构 造
|
可以调用本类中的构造方法,且有一个构造方法要作为出口
|
从子类调用父类的构造方法,不管子类如何安排最终一定会去调用,默认调用的父类中无参的构造方法
|
3
|
要 求
|
调用自身构造方法时放在构造方法首行
|
调用父类构造方法时放在子类构造方法首行
|
4
|
特 殊
|
表示当前对象
|
表示父类对象
|
ps:使用super()和this()在同一个构造方法中是不可能同时显示出现的