JavaEE - 05OOP继承
(1)OOP特征二: 继承性Inheritance
- 继承性的好处
- 减少了代码的冗余,提高了代码的复用性
- 便于功能的扩展
- 为之后多态性的使用,提供了前提
- 继承性的格式: class A extends B{}
- A: 子类、派生类、 subclass
- B: 父类、超类、基类、superclass
- 体现: 一旦子类A继承父类B以后,子类A中就获取了父类B中声明的结构:属性、方法
- 父类中声明为private的属性或方法,子类继承父类后,仍然认为获取了父类中私有的结构。
- 只有因为封装性的影响,使得子类不能直接调用父类的结构而已。
- 子类继承父类后,还可以声明自己特有的属性或方法: 实现功能的扩展。
- 子类与父类的关系,不同于子集和集合的关系。
- Java只支持单继承和多层继承,不允许多重继承。
- 一个子类只能有一个父类。单继承性。
- 一个父类可以派生出多个子类。子父类是相对的概念。
- 多层继承: 子类直接继承的父类,称为:直接父类。间接继承的父类,称为:间接父类。
- 子类继承父类后,获取了直接父类以及所有间接父类中声明的属性和方法。
- 如果没有显式的声明一个类的父类,则此类继承于java.lang.Object类。
- 所有的java类(除java.lang.Object类)都直接或间接继承于java.lang.Object类。
(2)方法的重写(override/overwrite)
- 定义: 在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。
- 在程序执行时,子类的方法将覆盖父类的方法。
- 重写规定: 方法声明: 权限修饰符 返回值类型 方法名(形参列表) { //方法体 }
- 子类中的叫重写的方法,父类中的叫被重写的方法
- 要求:
- 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表。
- 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
- 父类被重写的方法的返回值类型是void, 子类重写的方法的返回值类型只能是void
- 父类被重写的方法的返回值类型是A类型,子类重写的方法的返回值可以是A类或A类的子类
- 父类被重写的方法的返回值类型是基本数据类型,子类重写的方法的返回值类型必须是相同的基本数据类型
- 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
- 子类不能重写父类中声明为private权限的方法
- 子类方法抛出的异常不能大于父类被重写方法的异常。
- 注意: 子类与父类中同名同参数的方法必须同时声明为非static的(即可重写),或者同时声明为static的(不能重写)。
- 因为static方法是属于类的,子类无法覆盖父类的方法。
- 重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法,实际执行的是子类重写父类的方法。
void eat(){ System.out.println("吃饭"); } // 在public修饰的方法中调用 缺省或private 修饰的方法 public void walk(int distance){ System.out.println("走路,走的距离是:"+ distance +"公里"); show(); eat(); } private void show(){ System.out.println("我是一个人"); }
(3)四种访问权限修饰符
- Java权限修饰符public、protected、(缺省)、private置于类的成员定义前,用来限定对象对该类成员的访问权限。
- 对于class的权限修饰只可以用public 和 default(缺省)。
- public 类可以在任意地方被访问。
- default类只可以被同一个包内部的类访问。
|
修饰符
|
类内部
|
同一个包
|
不同包的子类
|
同一个工程
|
|
private
|
Yes
|
|||
|
缺省
|
Yes
|
Yes
|
||
|
protected
|
Yes
|
Yes
|
Yes
|
|
|
public
|
Yes
|
Yes
|
Yes
|
Yes
|

(4)关键字:super
- super可以用来调用: 属性、方法、构造器
- super的使用
- 在子类的方法或构造器中,通过使用"super.属性"或"super.方法"的方式,显式调用父类中声明的属性或方法。
- 特殊情况:当子类和父类中定义了同名的属性,想在子类中调用父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是父类中声明的属性。
- 特殊情况:当子类重写了父类中的方法,想在子类中调用父类中被重写的方法时,则必须显式的使用"super.方法"的方式,表明调用的是父类中被重写的方法。
- super调用构造器
- 在子类的构造器中显式的使用"super(形参列表)"的方式,调用父类中声明的指定的构造器。
- "super(形参列表)"的使用,必须声明在子类构造器的首行。
- 在类的构造器中,针对于"this(形参列表)"或"super(形参列表)"只能二选一,不能同时出现。
- 在构造器首行,没有显式声明"this(形参列表)"或"super(形参列表)",默认调用的是父类中空参构造器。
- 在类的多个构造器中,至少有一个类的构造器中使用了"super(形参列表)", 调用父类中的构造器。
public Student(String name,char sex, int age, long number, int math, int english, int computer){ super(name, sex, age); this.number = number; this.math = math; this.english = english; this.computer = computer; }
(5)子类对象实例化全过程
- 从结果上来看:(继承性)
- 子类继承父类以后,就会获取父类中声明的属性或方法。
- 创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。
- 从过程上来看:
- 当我们通过子类的构造器创建子类对象时,一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器...直到调用了java.lang.Object类中空参的构造器为止。
- 正因为加载过所有的父类的结构,所以才可以看到内存中有父类的结构,子类对象才可以考虑进行调用。
- 虽然创建子类对象时,调用了父类的构造器,但自始至终就创建了一个对象,即 new的子类对象。
浙公网安备 33010602011771号