继承
概述:日常生活中儿女总会继承长辈的遗产,java语言也是。通过继承多种实物之间形成一种关系。
特点:
①一个类只能继承一个父类
②一个父类可以有多个子类
③可以多层继承(a类继承b类 C类继承a类)
成员变量特点:(就近原则)
①.如果子类没有需要的成员变量,子类可以使用父类的成员变量。
②.如果父类的成员变量私有,子类不能访问到。
成员方法特点:(就近原则)
①如果子类没有需要的成员方法,子类可以使用父类的成员方法。
②.如果父类的成员方法和成员变量私有,子类不能访问到。
内存图:
创建子类对象时 会加载父类,先对父类进行初始化
初始化顺序:
默认初始化------显示初始化-------构造方法初始化
创建对象也算是初始化
子父类的初始化(分层初始化)
先进行父类初始化,然后进行子类初始化。
在此过程不会创建父类对象
构造方法的执行顺序:
/* * 继承中构造方法的执行顺序 * 在子父类中,创建子类对象,调用子类的构造方法, * 在子类的构造方法的第一行代码如果没有调用父类的构造或者没有调用子类的其他构造,则默认调用父类无参构造 * 为什么要调用父类构造? * 因为需要给父类的成员变量初始化 * 肯定会先把父类的构造执行完毕,在去执行子类构造中的其他代码 * * 我是父类无参构造 --- 我是子类有参构造 --- 我是子类无参构造 */ public class ExtendsDemo6 { public static void main(String[] args) { //Die d = new Die(); Zi z = new Zi(); } } class Die{ public Die() { System.out.println("我是父类无参构造"); } public Die(int num) { System.out.println("我是父类有参构造"); } } class Zi extends Di { public Zi() { //super(1); //super(); this(1);//不会再调用父类的无参构造了 System.out.println("我是子类无参构造"); } public Zi(int num) { //会默认调用父类无参构造 System.out.println("我是子类有参构造"); } }
重写
意义:因为父类的方法不能够满足子类的需求时,这时需要重写来达到需求。
注意事项:①.父类的方法不能私有
②不能被final修饰
③建议使用注解(@Override)来规范重写(方法名、返回值类型、参数列表完全相同)
和重载的区别:
重载的意义:相似的功能我们需要用相同的方法名来调用来提高代码的健壮性
方法名相同,参数列表不同(参数类型,参数个数,参数顺序满足至少一个),与返回值无关
this
意义:表示当前类的对象引用
作用:调用当前类的成员方法、成员变量、构造方法(this())。
super
意义:表示父类的对象引用
作用:调用父类的成员方法、成员变量、构造方法(this())。
final
final: 修饰符,可以用于修饰类、成员方法和成员变量
final所修饰的类:不能被继承,不能有子类
final所修饰的方法:不能被重写
final所修饰的变量:是不可以修改的,是常量
抽象类
抽象方法:不同类的方法是相似,但是具体内容又不太一样,所以我们只能抽取他的声明,没有具体的方法体,没有具体方法体的方法就是抽象方法
抽象类:有抽象方法的类必须是抽象类
注意事项:
①抽象方法只能在抽象类里面
②抽象类和抽象方法必须被abstract修饰
③抽象类不能创建对象(不能实例化)但是有构造方法(给父类初始化使用)
④抽象类中可以有非抽象的方法
⑤抽象类和类的关系也是继承
⑥一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类