关于继承,java中仅支持单继承,可以是多重继承;
即为一个类仅能有一个父类;
什么是继承?
继承可以提升代码的复用性(目的),父类的功能,子类可以直接使用;
使子类的功能更加强大;
java中用extends关键字表示继承;
语法:public class 类名 extends 父类名{类体}
注意:
私有化属性,不能被继承;
一个类如果没有显示继承另外一个类的话,该类默认继承Object;
java.lang.Object是java中的祖类;
意味着Object中的属性是所有类都有的;
super:保持了父类型的特征;
作用:子类访问父类的属性
super用法:
1.用于成员方法/构造方法中区分子类和父类同名的成员属性;
2.用于子类构造方法中,调用父类构造方法;(必须出现在有效代码第一行)
语法:super(参数);
注意:
①如果子类构造方法中,既没有this()也没有super();
那么会有一个默认的super();去调用父类的无参构造;
②this与super都必须出现在构造方法的第一行,那么就意味着两者不能同时出现;
③this与super都不能在静态方法中使用;
总结:
类名用于区分同名的静态变量和局部变量;
this用于区分同名的成员变量和局部变量;
super用于区分子类和父类同名的变量和方法;
super:子类构造方法使用super();去调用父类的构造方法;
如果构造方法中,第一行没有显示this()和super(),默认是super()调用父类的无参构造;
1.创建对象;
2.初始化父类属性;
this()和super()为什么必须出现在构造方法中有效代码的第一行?
super():用来调用父类的构造方法,初始化父类属性,并创建对象;
最终一定会溯源调用到祖类Object,通过Object创建对象;
既然创建对象,就必须在构造方法第一行。因为构造方法有初始化成员属性的功能;
成员属性想要初始化,必须要有存储它的空间,而这个空间就在对象中;
所以要保证先有对象,再有数据初始化,所以super()必须在第一行;
this():重载调用当前类的其他构造方法;
保证先有对象;
构造方法私有化后,不能被继承
虽然子类构造方法中,会有默认的super()去调用父类的无参构造;
但是由于私有化,没有访问权限
实例语句块
可以等同看作成员方法,肯定需要使用对象;
但是没有名字,所以不能手动调用,仅能自动调用;
何时调用,创建完对象,就立刻执行;
故实例语句块是在创建对象之后执行的,且在构造方法执行之前;
覆写:又称重写、覆盖
解决子类继承父类后,某些属性需要不同于父类的问题;
①子类拥有自身特有的属性
②可以覆写父类的成员方法(覆写特指成员方法)
什么情况下需要进行覆写?
如果父类的方法已经无法满足子类的需求的时候,需要将父类中的方法进行覆写;
覆写的条件有哪些?
1.必须是有继承关系的体系中;
2.方法名,返回值类型,参数列表必须都相同;
3.不能逼原方法有更宽泛的异常(异常更加具体化);
4.不能比原方法有更低的访问权限(层级越低访问权限越高);
5.覆写特指对父类成员方法的覆写
继承最基本的作用:代码重用;
继承最重要的功能:方法可以覆写、多态;
覆写的目的?
1.满足当前需求,对方法体修改;
2.错误越来越少,越来越具体到某个点上,不能有更宽泛的异常;
3.使用范围越来越广,层级越来越多,不能有更低的访问权限(父类访问权限比子类访问权限低);
4.功能越来越强大;
final:一个修饰符,表示最后的,最终的,不可更改的;
注意:①修饰的类不能被继承;
②修饰的变量,相当于常量,不能被二次赋值(在整个程序生命周期中);
没有默认值,常量一般是public static final 修饰的
③修饰的成员方法不能被覆写;
深入final:
final 修饰的变量,内存空间中的值不可更改;
如果修饰的是引用类型变量,地址不能更改,
但是与堆内存的内存空间无关(数据可以更改);