Java 三大特性(二)继承:重写、重载+super+final详解
一.继承的定义
1 定义
将每种类型共有一些特性抽出来,放到另一种类型上,这种抽出来的类型就叫父类型,其它的每种类型就叫子类型,子类型和父类型之间的关系就是继承
学生有姓名、年龄、吃的方法、学习方法,老师有姓名、年龄、吃的方法、教学方法,姓名和年龄是共性的,那可以把姓名和年龄、吃的方法 抽出来,可以放到人这个类型里,人就是父类,学生和老师都是子类
2 为什么 继承(好处)
1)复用代码
2)约定共同的行为,相当于定义了一套行为规范,提高灵活性和扩展性
二.extends
1 extends关键字
继承的意思,用来定义子类和父类之间的继承关系
子类通过extends来继承父类,一旦建立继承关系,子类就把父类中非私有属性和方法继承下来
万物皆对象
如果一个类没有显式extends一个父类,则它的父类就是Object
三.方法重写
1 何为方法重写(Override)
父类的行为实现,对于子类并不适合,子类可以对父类的行为进行重新定义,这就是方法重写(覆盖)
2 重写的语法约定
1)方法名必须相同
2)参数列表必须相同
3)返回值可以协同一致
jdk1.4之前 : 必须完全一致
jdk1.5之后:重写的方法可以返回原来返回类型的子类型(扩展(泛化)的类型)
4)重写的方法的访问控制符不能更窄
3 重写的意义
多态的条件之一
使得扩展子类能不表现不同于父类的行为实现,代码可以更灵活
四.super
1 super关键字是什么
就是super引用,是在子类型对象中一个指向父类对象的引用
要创建子类的对象,就必须先创建父类对象
2 super示意图
3 super作用
1) 访问父类的属性和方法
当子类中定义了父类中相同的属性和方法时,此时发生了遮盖,直接访问只访问子类中的定义的属性和方法,如果想访问父类中定义的,只能通过super来访问
public class Pet {
public String name = "宠物";
public Pet() {
super();
}
public Pet(String name) {
super();
this.name = name;
}
public void eat() {
System.out.println("宠物吃东西");
}
}
public class Dog extends Pet {
public Dog() {
}
public Dog(String name) {
super(name);//访问父类的构造方法
}
public void eat() {
super.eat();//访问父类的方法
System.out.println("狗吃骨头!");
}
}
2)访问父类的构造方法
在每个构造方法的第一行都默认加上了super()调用
我们可以显式的使用super来调用父类其它有参的构造方法,以达到初始化的目的
调用父类构造方法有2个语法限制:
a) super()和this()不能合在一起
b) super()必须在第一行
五,对象创建过程
1 先分配内存空间
2 默认初始化父类属性(实例变量)
3 显式初始化父类属性(实例变量)
4 调用父类的构造方法
5 默认初始化自己类属性(实例变量)
6 显式初始化自己类属性(实例变量)
7 调用自己类的构造方法
总结:先执行父类的属性和构造方法,再执行子类的属性和构造方法。
先走属性,再走构造方法
六.final
(1)final含义
1 final的含义
最后的,最终的,不可变的
修饰变量 -> 常量
修饰方法 -> 这个方法不能被重写
修饰类 -> 这个类不能被继承,例如String和System这些类
2 关于final的一些面试题
final和finally和finalize的区别??
模板设计模式?
(2)修饰变量
final可以修饰变量,这个变量就会变成常量
1 修饰局部变量
public static void main(String[] args){
final int i = 8;
//......
i = 9;
}
2 修饰参数
public static int add(final int a, final int b){
//a = 8;//无法改变
return a+b;
}
3 修饰实例变量
class Person{
public final int j = 10;//修饰实例变量
}
4 修饰static变量
public static final String SRPING = "春季";
public static final int MAX_VALUE = ????;
(3)修饰方法
final修饰方法,表示方法不可改变,即不可重写
class Person{
public final void sleep(){
System.out.println("睡觉");
}
}
/**
铁人
*/
class IronMan extends Person{
/*不能重写
public void sleep(){
System.out.println("不睡觉");
}
*/
}
(4)修饰类
final修饰类表示该类是不能被继承
/*
编译出错,因为String是final,是不可继承
这样可以保证String内部的所有方法都是确定的,不可改变
这样子保证我们在处理字符串不会因为去重写它的方法而导致各种问题
*/
class MyString extends String{}
final class A{}
//B类不能继承A
class B extends A{}