继承
继承的概述
就是两个类通过extends关键字来建立关系,一般称这种关系的双方叫做父类和子类
继承的格式
class 子类 extends 父类 {}
继承的特点
1.java中只支持单继承,一个子类只能有一个父类,但是可以多层继承,就相当于一个孩子只能有一个父亲,但是可以有爷爷,曾爷爷等
2.java中可以支持多个子类继承一个父类,就相当一个父亲有多个孩子
继承中成员变量的特点
- 子类只能获取父类非私有成员
子父类中成员变量的名字不一样直接获取父类的成员变量
子父类中成员变量名字是一样的获取的是子类的成员变量 - 就近原则:谁离我近,我就用谁
如果有局部变量就使用局部变量
如果没有局部变量,有子类的成员变量就使用子类的成员变量
如果没有局部变量和子类的成员变量,有父类的成员变量就使用父类的成员变量 - super:可以获取父类的成员变量和成员方法,用法和this是相似的
继承中成员方法的特点&方法重写
- 子类中没有这个方法,那么调用父类的
- 子类中有这个方法,那么调用子类的
这里注意,如果子类中的方法与父类中的方法完全一致(方法名,参数列表,返回值),那么子类中的这个方法叫做方法的重写
方法重写的应用场景&注意事项
- 当子类继承来的方法无法满足子类的需求时,使用方法重写,既可以保留父类的功能(沿袭、传承),还可以有自己特有的功能
- 方法重写的注意事项:
不可以重写父类私有的成员方法,压根就看不到父类的私有成员
子类重写父类方法,权限必须大于等于父类方法的权限
- 注解
@Override:方法重写,说明下面的方法是重写父类的方法
继承中构造方法的执行顺序
在子父类中,创建子类对象,调用子类的构造方法,
在子类的构造方法的第一行代码如果没有调用父类的构造或者没有调用子类的其他构造,则默认调用父类无参构造
为什么要调用父类构造?
因为需要给父类的成员变量初始化
肯定会先把父类的构造执行完毕,在去执行子类构造中的其他代码
- super(实参列表);语句在子类的构造方法中使用,用来调用父类中的构造方法(具体哪一个由传递的参数决定),
并且只能在构造方法第一行使用
- this(实参列表); 语句在类的构造方法中使用,用来调用本类中的其它构造方法(具体哪一个由传递的参数决定),
并且只能在构造方法的第一行使用
super和this的区别
super:子类中调用父类的方法或成员变量
this:一个类中调用自己的方法或成员变量
继承优缺点
- 优点
可以将多个类中共同的代码提取到一个类中,使这些类都继承这个被提取的类,简化代码,提高维护性 - 缺点
增加了类与类之间的耦合性,不符合java的编程思想(高内聚,低耦合)
内聚:就是自己完成某件事情的能力
耦合:类与类的关系
匿名对象&final
匿名对象定义&使用
匿名对象即无名对象,直接使用new关键字来创建对象
- 匿名对象的应用场景:
当方法只调用一次的时候可以使用匿名对象
可以当作参数进行传递,但是无法在传参之前做其他的事情 - 注意:匿名对象可以调用成员变量并赋值,但是赋值并没有意义
final关键字
是java中的修饰符,用于修饰成员变量、成员方法和类
- 特点:
final修饰的类:不能被继承,不能有子类
final修饰的方法:不能被重写
final修饰的变量:成为常量,不可被改变,必须初始化
abstract
abstract概述
是java中的一个关键字,可以用来修饰类和方法,被abstract修饰的类叫做抽象类,被abstract修饰的方法叫做抽象方法
- 抽象类:被abstract修饰的类,无法实例化对象,可被继承,
子类必须重写父类中所有的抽象方法,否则子类就必须是抽象类
- 抽象方法:被abstract修饰的方法,存在于抽象类中,如果一个类中包含抽象方法,那么这个类必须是抽象类,但是抽象类中可以没有抽象方法,
没有具体方法体的方法就是抽象方法
抽象类的特点
1.被abstract修饰的类
2.抽象方法只能在抽象类中
3.类中可以没有抽象方法
4.抽象类不能被实例化,因为,抽象类中可能存在抽象方法,如果能创建对象,那么就可以通过对象调用方法,但是抽象方法中没有具体的方法体,所以不能实例化
5.如果一个类需要继承抽象类,那么他要么重写父类中所有的抽象方法,要么这个子类就必须是抽象类
抽象类的成员的特点
- 成员变量
可以有成员变量
可以有常量 - 成员方法
可以有抽象方法
可以有非抽象方法 - 构造方法(
创建对象的时候需要调用构造方法初始化类中的成员变量,而不是因为调用了构造方法才创建了对象
)
可以有构造方法:用于初始化抽象类中的成员变量,为子类调用提供方便
抽象类的细节
- 抽象类关键字abstract不能和哪些关键字共存?
1.private:
私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。
2.final:
抽象类不能和final共存,因为抽象类自身无法创建对象,我们需要通过子类创建对象,一旦抽象类使用final关键字,那么抽象类就没有子类
抽象方法不能和final共存,因为抽象方法后期需要被子类重写,一旦加final无法重写
3.static:
抽象方法不能和static关键字共存,因为一旦加static我们就可以通过类名直接访问抽象方法,由于抽象方法没有方法体,没有任何意义,也不允许这样做 - 抽象类中是否可以不定义抽象方法?
是可以的,那这个抽象类的存在到底有什么意义呢?不让该类创建对象,方法可以直接让子类去使用 - 抽象类是否有构造函数?
有,抽象类的构造函数,是由子类的super语句来调用,用于给抽象类中的成员初始化