面向对象三大特性之 继承
继承的优点:
1. 提高代码的重用性;
2. 完善类的管理;
继承的实例引入:
生活中的继承:
1. 父亲有的东西,可以给予儿子;
2. 父亲私有的,不可以给儿子;
3. 儿子的还是儿子的,不给予父亲;
4. 一个儿子,只可以有一个亲生父亲;
5. 一个父亲,可以有多个亲生儿子;
java中的继承
指的就是两个类,组成了继承关系;
一个是父类,一个是子类;
java中 所有的类,如果没有显式的定义继承了某个类,那么就隐式的继承了 Object;
java中 所有的类,都是直接或间接的继承了Object类;
继承的格式
关键字 extends;
格式
[修饰符] class 子类名 extends 父类名 {
类体
}
继承的特性:
1. 父类的属性 和 方法 都可以给予子类;
属性、设定器、访问器、功能方法;
构造器见下面详细分析;
2. 父类的私有的不给予子类;
private 子类不能享有;
在权限的控制下,有些成员 子类不能获得;
总结: 当且仅当 子类有权限时,才可以继承父类;
3. 子类的成员 并不能 给予 父类;
继承当中父类构造器的问题!
1. 子类没有从父类得到构造器
使用 super 可以调用父类构造器, super要位于第一行;
2. new 子类构造器,会先执行父类的构造器
new 某类构造器,会先执行其父类的构造器;
如果父类还有父类,那么就先执行爷类的构造器;
如果人为没有定义调用父类的有参的构造器,那么就会默认的调用父类的无参的构造器;
执行完构造器之后产生效果:
创建对象
并不是单纯的创建了子类的对象,而是创建了一堆对象;
父类也被创建,以内部对象的形式存储;
每个对象都拥有自己一份属性,拥有自己的父类对象,父类对象拥有自己的一份父类属性;
构造器创建对象内存图
父类属性和子类属性
父类有的属性,子类可以再度定义属性;
子类和父类有相同的属性,一定要明确,用的是父类的属性,还是子类的属性;
默认使用子类的
如果子类没有,才会自动追溯找父类;
如果子类有,需要给super 才会追溯找父类;
总结:父类有了XXX属性,子类就不要在定义了!!
方法的重写
前提:
父类的某些方法,满足不了子类的需求;
方法的重写,又叫做方法的覆盖;
方法重写的条件:
基础 发生在父类和子类中,父类和子类都有同样(方法名 和 参数类型);
1. 子类重写的方法,必须大于等于 父类的方法权限;
2. 返回值类型 必须 小于等于 父类方法的返回值类型;
要么是类型相同,要么是子类类型;
3. 抛出的异常 必须小于 等于 父类的异常类型;
方法重写的好处:
符合子类的需求,有限制行的是子类的;
重写 Object 的 equals方法: 最好判断一下 this.name 是不是null;
父子类型相关存储
父类类型 可以 存储 子类的对象!
父类类型存储了子类型对象,只能拥有自己本身的成员;
虽然对象本身仍然拥有子类定义的成员,但是不能用;
强制类型转换 为 子类型 查看;
子类对象,可以自动的 储存给 父类的变量(引用);
父类对象,不可以自动 给 子类变量存储,需要强制转换;
强转格式:
子类型变量 = (子类型)父类型;
如果强转的类型 不匹配,那么就会异常!
instanceof:
关系运算符; 关系表达式,最终返回true值;
格式:
对象 instanceof 类名; 这就是一个关系表达式
如果对象 是这个类的实例,那么结果就是true
反之 就是 假 false;