继承:
继承的实现:
Java中如果想实现继承使用extends关键字完成,语法结构如下:
- class 子类 extends 父类{}:子类会被称为派生类,父类会被称为基类(超类)
继承的优点:
- 子类可以直接将父类的操作继续使用,属于代码重用;
- 子类可以继续 扩充属于自己的标准。
继承的限制:
继承也有自己的一些要求;
- Java不允许多重继承,
- 子类在继承父类的时候严格来说会继承父类中全部操作,但是对于所有的私有操作属于隐式继承,而对于所有的非私有操作属于显式继承。
- 在子类对象构造之前一定会默认调用父类的构造(默认使用无参构造),以保证父类对象先实例化,而后实例化子类对象;如果父类中没有无参构造方法,那么子类中就必须使用 ''super()"明确调用父类的有参构造方法;
可以发现,"super()" 主要是由子类调用父类中的构造方法,一定要放在子类构造方法的首行!与 this() 类似!
super()与 this()不能同时出现,不管怎么样,子类构造在调用前都要先调用父类的构造,为父类对象初始化后才轮到子类对象初始化。
覆写:
子类对父类继承之后,子类定义的属性或方法可能会与父类同名,参数的类型及个数、返回值相同的方法时,如此称为覆写;
方法覆写:
覆写结果的分析要素;
- 观察实例化的是哪个类;
- 观察这个实例化类里面调用的方法是否已经覆写过的,如果没有覆写过就调用父类的;
覆写的使用原则(被动):
如果现在发现父类中的方法名称功能不足(不适合本子类),但是又必须使用使用这个方法名称的时候,就用到了覆写;但是被子类覆写的方法,不能有比父类更严格的访问控制权限;
访问权限:public > default > private ,也就是说 private 是最严格的,如果父类是用 default 声明,那么子类只能是 default 或者 public ;99%情况下都是public!
super方法()与this()方法的区别?
- 使用"this.方法()"会首先查找本类中是否存在有要调用的方法名称,如果有则调用,如果没有则会查找父类中是否有,如果有则调用,如果没有则会发生编译时的错误提示。
- 使用"super.方法()"明确表明调用的不是子类方法(不查找子类中是否存在有此方法),而直接调用父类中的指定方法;
重载与覆写的区别?(OverLoading 与 Overrid 的区别?)
重载 | 覆写 | |
英文单词 | overloading | Overrid |
发生范围 | 发生在一个类里面 | 发生在继承关系中 |
定义 | 方法名称相同,参数的类型以及个数不相同 | 方法名称相同,参数的类型以及个数相同,方法返回值相同 |
权限 | 没有权限的限制 | 被覆写的方法不能拥有比父类更为严格的访问控制权限 |
使用overloading的时候返回值能否不同?
在发生重载关系的时候,返回值可以不同,但是考虑 到程序设计的统一性,最好相同。
关于 super 与 this 的区别?
区别 | this | super |
功能 | 调用本类构造、本类方法、本类属性 | 子类调用父类构造、父类方法、父类属性 |
形式 | 先查找本类中是否存在有指定的调用结构,如果有则直接调用,如果没有则调用父类定义 | 不查找子类,直接调用父类操作 |
特殊 | 表示本类的当前对象 | / |
在以后的开发过程中,对本类或者父类操作,建议加上 " this. " 或者 " super. " 这样好区分。
辅助概念:
final关键字:
final 在Java中被称为终结器;
- 使用 final 定义的类不能够再有子类;
- 使用 final 定义的类不能被子类所覆写;
- 使用 final 定义的变量就变成了常量,常量必须在定义的时候设置好内容,不能修改;
- public static final String MSG(大写) = " MMM";声明的就是全局常量;static 的数据保存在公共数据区,所以此时的常量就是一个公共常量;
对象的多态性:
多态严格来讲有2种描述形式:
- 方法的多态性:
- 方法的重载:同一个方法名称,会根据传入参数的类型及个数不同执行不同的方法体;
- 方法的覆写:同一个方法,会根据子类的不同,实现不同的功能;
- 对象的多态性:发生在继承关系类中,子类和父类之间的转换
- 向上转型:(自动完成):父类 父类对象 = 子类实例;重要意义在于参数统一;参数统一之后可以调用子类覆写后的方法体,即同一个方法对于不同的子类可以有不同的实现;
- 向下转型:(强制完成):子类 子类对象 = (子类)父类实例;向下转型指的是父类要调用子类特殊的方法;因为父类只能看到父类中所有的方法,看不到子类中的方法,强制转换之后就可以看见了。
对于对象的转型给出以下经验总结:
- 80% 情况下使用向上转型,因为可以得到参数类型的统一,方便我们程序设计(比如链表);注意:子类大部分情况下请以父类的方法名称标准进行覆写,不要有过多的扩充功能;
- 5% 情况下会使用向下转型,要使用子类的特殊方法;
- 15% 情况下是不转型的,例如:String;