今日内容
继承 【重点】
抽象类 【重点】
final关键字 【重点】
代码块 【重点】
继承(extends) 【重点】
什么是继承
继承是面向对象的三大特征(封装、继承和多态)之一
使用extends关键字使类与类之间产生关系(子父类关系)
子类可以拥有父类中的成员(除了私有的和构造方法之外)
继承的好处和弊端
好处:
1、可以提高代码的复用性
多个类有共性的内容(相同的成员变量和成员方法),将这些相同的内容抽取到另一个类中
多个类(子类)就去继承这个类(父类),达到代码复用的效果
2、提高代码可维护性
3、是多态的前提之一
弊端:
类与类之间的耦合性增强
继承的格式
public class 子类 extends 父类 {
}
继承的特点
1、Java中的类,只支持单继承不支持多继承
(一个类同时只能继承一个类,而不能同时继承多个类,一个儿子只能有一个亲爹)
class A extends B{} // 单继承 √
class A extends B,C{} // 多继承 ×
class B{}
class C{}
2、Java中的类,支持多层继承
class A{}
class B extends A{}
class C extends B{}
面试题:Java是否支持多继承?
Java中的类是不支持多继承的
但是Java中还有接口这个东西,它是支持多继承的
继承中成员访问的特点
成员变量
就近原则:在一个方法中,使用的变量的时候首先会查找局部变量,如果没有局部变量会找本类的成员变量,
如果没有本类的成员变量就会查找父类的成员变量,如果这个三个都有,直接访问使用的就是局部变量,
通过this.访问的本类的成员变量通过super.访问的父类的成员变量。
成员方法
就近原则:先查找本类中是否有这个方法,有就调用,如果没有就查找父类中是否有这个方法,有就调用,没有报错
如果本类中有,父类中也有,就近使用本类中的方法,如果要使用父类中的方法,需要使用super.去访问
构造方法
访问子类的构造方法之前,一定会先执行父类的构造方法.
因为每一个构造方法的第一行默认有super()这样的语句,会去访问父类的空参构造方法。
如果我们手动编写super(实参)或者this(实参)这样的语句,
那么默认的super()这样调用父类空参构造的语句就没有了
super(实参)或者this(实参)这样的语句不能同时出现,只能二选一
this和super
this:当前类的对象的引用,谁来调用这个方法,这个方法中的this就代表哪个对象
* 可以调用本类的成员变量 this.成员变量名 - System.out.println(this.a);
* 可以调用本类的成员方法 this.成员方法名(实参) - this.show();
* 可以在构造方法中第一行代码,用于调用本类的其他构造方法 this(实参)
super:代表父类的那片内存空间(可以理解为父类对象的引用)
* 可以调用父类的成员变量 super.成员变量名 - System.out.println(super.a);
* 可以调用父类的成员方法 super.成员方法名(实参) - super.show();
* 可以在子类的构造方法中第一行代码,用于调用父类的构造方法 super(实参)
方法重写
什么是方法重写
方法重写(Override),也可以称之为方法覆盖
在有继承关系的两个类中,子类对父类的方法在一定范围进行修改的过程,就是方法重写。
注解:@Override,用于检测一个方法是否是重写的方法
方法重写的应用场景
有继承关系的类,子类可以将父类的方法继承下来,但是继承的方法可能不是完全满足子类的需求,
这时子类就可以对继承下来的这个方法在一定范围内进行修改,一般我们重写的时候会保持方法声明完全一致,
修改的是其方法体中的内容。
满足:不去重写
完全不满足:修改方法体内容,和父类中方法体内容完全不同
不完全满足:满足的不满就调用父类原来的方法,不满足的部分再添加或者修改
方法重写的原则
重写时一般都不去修改方法的声明,只修改方法体内容,但是如果要修改方法声明,请遵循以下重写原则:
一大两同两小
一大:子类重写的方法的修饰要大于等于父类方法的权限修饰符
两同:方法名必须相同,参数列表必须相同
两小:
子类重写的方法的返回值类型必须小于等于父类方法的返回值类型(引用类型,基本类型不适用)
子类重写的方法抛出的异常要小于/少于等于父类方法抛出的异常
假如父类方法没有抛出异常,那么子类重写的方法绝对不能抛
方法重写(Override)和方法重载(Overload)的区别
方法重写(Override):
两个类中,有继承关系的两个类
方法名和参数列表必须相同
和其他(返回值类型、修饰符)有关
方法重载(Overload):
同一个类中
方法名相同,参数列表不同
和其他(返回值类型、修饰符、参数变量名)无关
方法重写的注意事项
1、私有的方法不能被继承也不能被重写
2、静态方法可以被继承但是不能被重写
重写的时候父类方法没有使用static修饰,重写后的方法也不能使用static修饰
如果父类的方法使用了static修饰,子类的方法也必须使用static修饰,但是这种关系不是重写
3、构造方法不能被继承也不能被重写
权限修饰符
对类、类中的成员的权限进行限定
限定类、类中的成员使用的范围,是在当前类中、本包其他类中、其他包其他类中
本类 本包其他类 其他包子类 其他包其他类
private √
默认 √ √
protected √ √ √
public √ √ √ √
抽象类 【重点】
什么是抽象类
使用abstract关键字修饰类
有抽象方法的类就是抽象类,抽象类也可以没有抽象方法
抽象类的定义格式
public abstract class 类名{
}
抽象方法的定义格式
public abstract 返回值类型 方法名(参数列表);
抽象类的应用场景
1、一个类中有抽象方法,那么这个类就要定义成抽象类。
多个类向上抽取共性成员方法,抽取到父类中,无法中的共性方法中无法明确具体的实现,此时干脆不如让方法体空着,
没有方法体的这种方法,就是抽象方法,一个类有了抽象方法就要定义成抽象类
2、如果一个类不想让外界创建其对象
抽象类的特点
1、抽象类不能实例化(不能创建对象)
2、一个类如果继承了抽象类,要么重写抽象类的所有抽象方法,要么这个类也变成的抽象类
抽象类成员的特点
成员变量
常量:可以有
变量:可以有
构造方法
有构造方法的,由子类进行调用
成员方法
抽象方法:可以有可以没有
非抽象方法:可以有可以没有
final关键字 【重点】
是一个关键字,也是最终修饰符,可以修饰类、变量和方法
修饰类:不能被继承(太监类),如果一个类中的所有方法都不想被重写,就可以定义成final修饰的类
修饰方法:不能被重写,但是可以被继承
修饰变量:可以修饰局部变量,也可以修饰成员变量
局部变量
变成了常量,不能再次赋值
成员变量
变成了常量,不能再次赋值
常量命名规范:
都是大写,如果多个单词组成,中间使用_隔开
ctrl+shift+u可以切换大小写
代码块 【重点】
java中有四种代码块(静态代码块,构造代码块,局部代码块和同步代码块(多线程学习))
局部代码块
位置:在方法中,和局部变量的位置相同
格式:{
}
作用:限制了变量的作用域(声明周期),让变量及早进行释放,节省内存
特点:出了大括号就无法使用
构造代码块
位置:在类中方法外,和成员变量的位置相同
格式:
{
}
作用:抽取构造方法中的共性代码,提高代码的复用性
特点:每一次创建对象都会执行一次构造代码块,而且先于构造方法执行
静态代码块
位置:在类中方法外,和成员变量的位置相同
格式:
static{
}
作用:可以做一些初始化的操作,或者做一些准备工作
特点:
1、随着类的加载而执行,执行时机是非常早的
2、随着类的加载而执行,由于类的加载只会执行一次,所以静态代码块也只会执行一次
3、比主方法执行都早,比构造代码块执行也早