继承-权限-super-final-多态-组合
权限修饰符
内容
public
protected
default(不写就是它)
private
作用 :
修饰类 只可以 public default
修饰方法
修饰属性
![](https://img2018.cnblogs.com/blog/1201698/201809/1201698-20180920194228181-671657908.png)
父类的属性 方法 子类都能拿到吗 ?
可以
虽然有权限的限制 , 但是不妨碍子类继承到 , 只是子类继承到了之后 没有权限使用
原因如下
父类 子类 构造器的执行顺序
当 new 一个类时 , 会先创建其父类的对象 先执行其父类的构造器 默认调用无参构造器,
如果父类还有父类 , 那么先创建父类的父类 先执行父类的父类的构造器 直至 Object
// 父类对象作为 子类对象的内部对象存在
因此 所有类最好有一个公共的无参构造器
因为 其子类对象创建时 会默认的调用它的无参构造器 (除非另行指明有参的构造器)
父类 子类内存图解
super 关键字
super.属性名 这是主动向上追溯 , 使用父类的 属性
在子类和父类有同名属性时会这么用
super.方法名 这是主动向上追溯 ,使用父类的方法
在子类和父类有同名方法时会这么用
super([实参]) 这是引用父类构造器
如果在子类的构造器中 不去显示引用父类构造器 , 那么默认引用无参构造器
如果要引用有参的构造器 , 那么可以 super(实参) 来引用
super 在构造器中 必须位于第一行 所以 super this 在构造器中不能共存
注意 : super 不能出现在 static 成员里
父类 子类如果定义相同的属性 该如何 ?
父类和子类可以相同的属性
如果 子类类型存储子类对象 , 那么使用的是子类的属性
如果 父类类型存储子类对象 , 那么使用的是父类的属性
以上 称为 静态绑定 属性是静态绑定的 -> 你的类型是谁的 用的就是谁的
父类和子类有相同的属性 在子类中 , 优先使用子类的属性
使用 super.属性名 可以使用父类的属性
调用父类的 get set 方法 , 修改的父类的属性
继承中 父类无法得到子类的东西
综上所述 :
不要定义相同的属性 太麻烦
重写
要求:
1. 权限修饰符 大于等于父类的权限修饰符
2. 返回值类型 要和父类一致
基本数据类型 完全和父类方法一致
引用数据类型 小于等于父类的返回值类型
3. 方法抛出的异常 必须小于等于父类方法抛出的异常 (异常)
父类 和 子类有同样的方法 , 在子类的使用中 ,优先使用谁的 ?
优先使用子类的方法
使用 super.方法 可以用父类的方法
父类和子类都有同样的方法 , 子类类型 存储 子类对象 , 调用的方法是 子类 的方法
父类和子类都有同样的方法 , 父类类型 存储 子类对象 , 调用的方法是 子类 的方法
在执行时 会确定这个对象的实际类型 , 按照实际类型来执行方法 (实际执行 默认执行自己的)
以上叫做 动态绑定
动态绑定 仅限于 非静态方法 。
静态方法 仍然是 静态绑定 , 如果对象被父类变量存储 那么执行父类的静态方法
final 关键字
final 最终的 不变的 , 它是修饰符 , 它修饰的成员 都是最终的不变的 .
作用 :
1. 修饰类 最终的类
该类无法被继承 例如 String
2. 修饰方法 最终的方法
该方法无法被重写
3. 修饰属性
该属性只要值确定了 那么值永不可变
该属性又被称为 常量
final 修饰的属性必须在声明时就赋值
否则 , 必须在每个构造器中 都对其进行赋值
一定要保证 final 修饰的属性 在对象创建之后必定有值
4. 修饰局部变量
只要值确定了 那么值永不可变 也叫做常量
多态
一种指令 多种状态
多态发生的三个基石
1. 必须发生继承关系
2. 必须有方法的重写
3. 父类引用指向子类对象 : 父类型的变量 存储的子类的对象 -- 实际执行的子类重写后的方法
组合
可以被称为 面向对象的第四大特性
![](https://img2018.cnblogs.com/blog/1201698/201809/1201698-20180920195414684-768500934.png)
就是相当于表的外键,关联另一张表