继承
- 一个类的对象可以使用另一个类的对象里的成员变量和成员方法
- 类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。
- 提高代码的复用性!
- extands 的意思是“扩展”。子类是父类的扩展
- 不同的叫法:超类、父类、基类、子类、派生类
好处:
- 通过继承可以简化类的定义,实现代码的复用性
- 让类与类之间产生了关系,这是多态的前提条件
开发原则:高内聚,低耦合
坏处:
- 提高了代码的耦合性
特点:
- java中只有单继承,不可以多继承;可多层继承,不可循环继承
- java中的多继承,可以通过接口来实现
注意:
- 子类继承父类的成员变量和成员方法
- 子类不继承父类的构造方法
- 不能为了获取某个功能,就随便地去继承某个类
- 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object
继承的使用时机
- 当两个类之间存在 “is a” 的关系
子类继承中构造方法之间的关系
- 1.子类构造方法中默认第一行均为 super(); 前提:第一行不是 this();
- 2.子类构造方法第一行,要么是super(参数),要么是this(参数),super和this不能共存
- 3.子类中所有构造方法中,至少有一个构造方法中第一行是super();(避免 this 循环调用,死循环)
子类继承中成员方法之间的关系
super 关键字
父类内存空间的标记,在用法上可以当做父类对象的引用来使用;但这并不代表 super 就是父类对象的引用。
重写 override
子类中出现了与父类中 声明(方法名和参数列表) 完全一致的方法
- 在子类中可以根据需要对从基类中继承来的方法进行重写。
- 重写方法必须和被重写方法具有相同方法名称、参数列表和返回值类型
- 重写方法不能使用比被重写方法更严格的访问权限。(由于多态)
重写与重载的区别
- 重写
- 在子父类继承中,子类出现了与父类中方法的声明完全一致的方法
- 重载
- 在同一个类中,出现两个方法的名字相同,但参数列表不同的方法
- 在子类的重写方法上加上 @Override 判断
注意
- 1.子类不能重写父类中私有的成员方法
- 2.子类不能重写父类中被 final 修饰的成员方法
- 3.子类重写父类中的方法:重写方法的权限必须 >= 父类中的方法
- 4.static 方法不能被重写(静态重写静态方法知识看着像,但依旧不是重写)
父类方法的重写:
+ “**==**”:方法名、形参列表相同。
+ “**<=**”:返回值类型和异常类型,子类小于等于父类。
+ “**>=**”:访问权限,子类大于等于父类
- 构造方法调用顺序:
- 根据super的说明,构造方法第一句 总是:super(…)来调用父类对应的构造方法。
- 先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。
final 关键字
修饰符,“最终的”,可以修饰成员变量、方法和类
特点:
- 1.被 final 修饰的 类 不可以被继承
- 2.被 final 修饰的 成员方法 不能被重写(覆盖)
- 3.被 final 修饰的 成员变量 一旦被初始化便不能被改变了,相当于常量
- 如果变量是 基本类型,数据值不能发生改变
- 如果变量是 引用类型,地址值不变,但内容可以改变
Object 类
- Object 类是所有Java类的超类
- 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
- 重写:toString方法:
- 默认返回:包名+类名+@+哈希码
- 可以重写!
- 打开API文档,开始熟悉!
对象的比较 —— == 和 equals()
- ==:
- 比较两基本类型变量的值是否相等
- 比较两个引用类型的值即内存地址是否相等,即是否指向同一对象。
- equals() :
- 两对象的内容是否一致
- 示例
- object1.equals(object2) 如:p1.equals(p2)
- 比较所指对象的内容是否一样
- 是比较两个对象,而非两个基本数据类型的变量
- object1 == object2 如:p1==p2
- 比较p1和p2的值即内存地址是否相等,即是否是指向同一对象。
- object1.equals(object2) 如:p1.equals(p2)
- 自定义类须重写equals(),否则其对象比较结果总是false。
代码块
局部代码块
- 定义在方法中的代码块
- 能让局部变量能更早地在内存中消失,节省内存空间
构造代码块
- 定义在类中方法外的代码块
- 构造代码块是在创建对象时执行,且优先于构造方法执行
- 可以将多个构造方法中的共性内容抽取出来,放到构造代码块中执行
静态代码块
- 在构造代码块前面加上 static 关键字的代码块
- 静态代码块是随着 .class 文件的加载而执行的;又.class文件只会加载进方法区一次,所以静态代码块只执行一次;
- 当我们第一次创建该类对象时,.class文件会加载进方法区;所以第一次创建对象,静态代码执行一次之后,不管再创建多少次该类对象,静态代码块都不会执行。
当实例化子类对象时
-
首先要加载父类的class文件进内存,静态代码块由于有static修饰,所以是随着类的创建而执行,所以父类静态代码块最先被执行;
-
子类class文件再被加载,同理静态代码块被先执行;
-
实例化子类对象要先调用父类的构造方法,而调用父类构造方法前会先执行父类的构造代码块。
-
————>>父类静态代码块——>子类静态代码块——>父类构造块——>父类构造方法——>子类构造块——>子类构造方法