目录
1 概述
继承其实是把一些具有 具有共性的 类的部分 抽到一个父类中
让类和类之间产生关系(子父类关系), 让子类继承父类中的非私有成员部分
注:
-
父类也称之为基 , 超类
-
子类也称为 派生类
2 使用继承的场景
当两个或两个以上的类有大量的重复的属性和方法的时候,可以考虑抽取出来一个父类。
注:
抽取出来的父类和子类是包含关系, 不是平级关系。例如 父类 水果和 子类苹果的关系,而不是苹果和香蕉的关系。
3 继承的书写格式
public class 子类名 extends 父类名(){}
4 优缺点
- 优点:
- 提高了代码的复用性, 也就是使用更方便了。
- 提高了代码的维护性, 也就是修改的时候,改父类,子类也跟着改变了,不用子类一个一个修改。
- 缺点:
- 增强了子类和父类的耦合性, 减少了子类的灵活性。
5 继承方式特点
单继承:一个子类只能继承一个父类。
多层继承:一个子类的父类也可以继承别的类,依次类推。
6 继承中的访问特点
先局部,后成员
先子类,后父类
最后都找不到就报错
7 super 和 this 关键字
super 和 this 关键字使用位置是子类。
7.1 super关键字
super是表达父类的意思,用以子类中调用父类的方法。
书写格式是:
父类构造方法的调用:super(),如果是调用有参构造,在()内直接传入参数即可。
父类变量的调用:super.变量名 。
父类方法的调用:super.方法名 。
7.2 this关键字
this是子类成员的意思, 用以调用自己的本类的方法或者成员变量。
this成员方法的调用就少的多了,一般是用在无参构造方法的地方, 调用本类方法随着初始化而初始化。
书写格式同父类
注意:
- 子类加载的时候 就会对 父类进行加载,在子类开辟的空间里开辟一个父类空间,对父类的变量进行初始化。
- 子类父类初始化都是通过 构造方法初始化,所以有参构造, 无参构造至少需要一个。
- 类的初始化时,有static 修饰的方法 和变量 还有 new 对象名生成的对象 都会进行初始化。
8 方法重写
8.1 概念
当父类不方法不能满足子类的需求时子类会对父类的方法进行重写。
8.2 特点
方法重写时,方法声明,返回值一模一样。
备注:
public void 方法名()是方法声明,{} 内的是方法体。
父类的static 方法, private 修饰的方法不能被重写。
8.3 应用场景
-
如果子类对父类的方法不满足时, 可以对父类的 方法进行重写。
-
在重写的时候, 可以用super() 把父类的方法继承过来, 然后在继续添加功能。
8.4 方法重写 与方法重载的区别
方法重载overload: 在同一个类中, 方法名相同, 形参不同。
方法重写override: 在子父类中, 子类的方法声明和 形参一模一样的时候。
8.5 方法重写的注意事项
-
声明要完全一致;
-
利用@overriade 可以检查重写正确性;
-
父类私有的方法无法进行方法重写, 构造方法也不可以重写;
-
static修饰的静态方法 无法进行重写;
-
方法重写时,子类的 访问权限必须大于等于父类的;
-
继承关系中, 父类及父类以上类中的方法都能重写;
8.6 权限修饰符
修饰符 | 本类 | 同包 | 外包子类 | 外包非子类 |
---|---|---|---|---|
private | * | |||
默认 | * | * | ||
protected | * | * | * | |
public | * | * | * | * |
注: * 表示有这个权限
9 构造方法的访问顺序
子类初始化的时候会默认访问父类的无参构造器。
父类不写构造方法,则系统自动提供无参构造方法。
父类提供有参构造方法, 不提供无参构造方法,则虚拟机不会自动提供无参构造方法,默认访问无参构造方法的时候就会报错。
10 抽象(abstract )
10.1 概述
抽象是两个类的 方法声明一样, 方法体不一样,我们把他们抽取到父类中,然后用 abstract 方法名,此时这个父类就变成抽象类了,父类名要用abstract 修饰。
10.2 抽象类
- 抽象类不能有实例化,通俗的讲就是不能通过new 类名创建抽象类的对象。
- 抽象类的子类必须重写所有抽象方法。
10.3 抽象方法
- 抽象方法没有方法体。例如 public void method();
- 抽象方法的类一定是抽象类。此时的类名记得用abstract修饰。
10.4 抽象的用处
抽象可以做模板设计
例如面的代码,子类继承的时候就必须重写body 的部分,其他部分不用动,达到模板的效果。
public void inform() {
System.out.println("通知");
body();
System.out.println("xx年xx月x日");
System.out.println("xxx经理");
}
public abstract void body();
接口也用的抽象方法
其实接口就是一种规则,一种协议,规范调用者的代码的。
11 final关键词
11.1 概念
final 最终的意思 可以修饰 类 成员变量 成员方法
-
final修饰的 类不能继承, 不能被子类重写
-
final修饰的方法不能修改
-
final修饰的变量称为常量, 叫做自定义常量, 不能再次赋值
-
final修饰的基本类型的变量, 属性值不能再次被赋值
-
final修饰的引用类型的变量, 地址值不能改变, 地址内的数值可以改变
-
final在 类中 修饰的变量 需要直接赋值, 或者 在无参构造结束前 把值赋上 建议直接赋值
12 代码块
12.1 概念
在java中, 使用{} 括起来的代码称为代码块
12.2 分类
12.2.1 局部代码块
位置: 方法中
作用: 限定内存的生命周期, 及早释放,提高内存的利用率
12.2.2 构造代码块
位置: 类中方法外
特点: 每次构造方法执行之前就会执行该代码块
作用: 将多个方法中的代码块抽取到 构造代码块中, 提高了代码的复用性
缺点: 每次加载构造代码块之前都要加载这个构造代码块, 缺乏灵活性.
12.2.3 静态代码块
位置: 类中方法外
特点: 需要用static 修饰, 在加载类的时候就会执行,并且执行一次
作用: 用于加载类的时候做一些数据初始化
应用场景: 加载驱动, 加载配置文件