一、继承
1、子类和父类
- 子类:派生类
- 父类:基类
2、extends关键字
3、继承的作用
- 减少了代码冗余,提高了代码的复用性;
- 有利于功能的扩展;
- 让类与类之间产生了关系,提供了多态的前提
4、说明
- 子类继承了父类,就继承了父类的方法和属性。
- 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和 方法。
- 在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集, 而是对父类的“扩展”。
- 子类不能直接访问父类中私有的(private)的成员变量和方法
- Java只支持单继承和多层继承,不允许多重继承
- 一个子类只能有一个父类
- 一个父类可以有多个子类
二、方法的重写
1、定义
在子类中可以根据需要对从父类中继承来的方法进行改造,也称
为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法
2、要求
(1)子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
(2)子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
(3)子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
注意:子类不能重写父类中声明为private权限的方法
(4)子类方法抛出的异常不能大于父类被重写方法的异常
3、注意
(1)子类重写父类的方法,必须是非static的
(2)子类和父类同名同参数的static方法,不构成重写,子类不会覆盖
4、重载和重写的区别
(1)二者的定义细节:略
(2)重载,是指允许存在多个同名方法,而这些方法的参数不同。编译器根据方法不同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期就绑定了。Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法。
所以:
- 对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;
- 对于多态,只有等到方法调用的那一刻,解释运行器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。
三、super关键字
1、作用
在Java类中使用super来调用父类中的指定操作:
- super可用于访问父类中定义的属性
- super可用于调用父类中定义的成员方法
- super可用于在子类构造器中调用父类的构造器
2、注意点
(1)尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
(2)super的追溯不仅限于直接父类
(3)super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识
3、调用父类的构造器
(1)子类中所有的构造器默认都会访问父类中无参构造器
(2) 当父类中没有无参构造器时,子类的构造器必须通过**this(参数列表)或者super(参数列表)**语句指定调用本类或者父类中相应的构造器。同时,只能”二选一”,且必须放在构造器的首行
(3)如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错
4、this和super
区别点 | this | super |
---|---|---|
访问属性 | 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 直接访问父类中的属性 |
调用方法 | 访问本类中的方法,如果本类没有此方法则从父类中继续查找 | 直接访问父类中的方法 |
调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须放在子类构造器的首行 |
四、子类对象实例化过程
思考:
(1)为什么super(…)和this(…)调用语句不能同时在一个构造器中出现?
(2)为什么super(…)或this(…)调用语句只能作为构造器中的第一句出现?
1、从结果上来看
- 子类继承父类以后,就获取了父类中声明的属性或方法
- 创建子类的对象,在堆空间中,就会加载所有父类中声明的属性
2、从过程上来看
通过子类的构造器创建子类的对象,而在子类的构造器中,就会直接或间接的调用其直接父类的构造器,…,直到调用 java.lang.Object 的构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中父类中的结构,子类对象才可以考虑进行调用。
注意:虽然在创建子类对象时,调用了父类的构造器,但是自始至终就创建了一个对象,即new创建的子类对象。