BCSP-玄子JAVA开发之面向对象编程CH02_ 继承笔记
7.1 继承
继承(Inheritance):面向对象的三大特性之一
7.1.1 定义
-
一个类获取现有类的所有属性和行为的机制
-
创建基于现有类的新类,可以重用现有类的属性和方法
-
可以在新创建的子类中添加新属性和方法
7.1.2 作用
-
有效的解决了代码的重用问题,使代码拓展更加灵活
-
从始至终完整的体现了一个应用系统,逻辑更加清晰
-
增加软件的可扩展性,以适应不同的业务需求
7.1.3 何时使用继承
- 继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合等
- 继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字
extends
来表示 - 子类和父类之间,子类和父类之间, 应符合
is-a关系
- 继承是代码重用的一种方式, 将子类共有的属性和行为放到父类中
public class XZ04_Student extends XZ04_Extend {
// extends 后跟继承父级
// 继承 XZ04_Extend 类的所有方法
}
7.1.4 理解继承
不能被继承的父类成员
- private 成员
- 子类与父类不在同包,使用默认访问权限的成员
- 构造方法
访问修饰符 protected
- 可以修饰属性和方法
- 本类、同包、子类可以访问
访问修饰符总结
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
package CH05_JAVAObjectOriented;
//继承父类
public class XZ04_Extend /* extends Object*/ {
public String name = "玄子";
// 所有的 Java 类都直接或间接地继承了Object类
private int money;
public void say() {
System.out.println("我是父级:XZ04_Extend");
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
package CH05_JAVAObjectOriented;
//继承子类
public class XZ04_Student extends XZ04_Extend {
// extends 父级:XZ04_Extend 的所有方法
// Ctrl + H 查看继承结构
public String name = "XuanZi";
public void test(String name) {
System.out.println(name);
// XuanZiShare
System.out.println(this.name);
// XuanZi
System.out.println(super.name);
// 玄子
}
}
package CH05_JAVAObjectOriented;
public class XZ04_Main {
public static void main(String[] args) {
XZ04_Student student =new XZ04_Student();
student.say();
student.setMoney(1000);
System.out.println(student.getMoney());
System.out.println("------------------");
student.test("XuanZiShare");
}
}
7.2 Object 类
Object 类是所有 Java 类的祖先,所有的 Java 类都直接或间接地继承了 Object 类
-
位于 java.lang 包中
-
在定义一个类时,如果没有使用 extends 关键字,即没有显式地继承某个类,那么这个类直接继承 Object 类
public class XZ04_Extend /* extends Object*/ {
// 默认继承Object类
}
Ctrl + H 查看继承结构树
7.2.1 常用方法
方法 | 说明 |
---|---|
toString() | 返回当前对象本身的有关信息,返回字符串对象 |
equals() | 比较两个对象是否是同一个对象。若是,返回true |
clone() | 生成当前对象的一个副本,并返回 |
hashCode() | 返回该对象的哈希代码值 |
getClass() | 获取当前对象所属的类信息,返回Class对象 |
java.lang.String 类重写了 Object 类中的 equals() 方法,用于比较两个字符串的值是否相等
7.3 Super 关键字
子类访问父类成员super
代表父类对象
- super 调用父类的构造方法,必须在构造方法的第一个
- super 必须只能出现在子类的方法或者构造方法中
- super 和 this 不能同时调用构造方法
7.3.1 访问父类的成员
-
super 只能出现在子类的方法和构造方法中
-
super 调用构造方法时,只能是第一句
-
super 不能访问父类的 private 成员
7.3.2 Super 和 This 的区别
代表的对象不同
- this:本身调用者这个对象
- super:代表父类对象的应用
前提
- this:没继承也可以使用
- super:只能在继承条件才可以使用
构造方法
- this(); 本类的构造
- super(); 父类的构造
7.4 方法的重写
方法的重写或方法的覆盖Override
在子类中,根据需求对从父类继承的方法体进行重新编写,以实现子类需求
7.4.1 方法重写的规则
-
需要先建立父子类关系
-
重写方法和被重写方法必须具有相同的方法名
-
重写方法和被重写方法必须具有相同的参数列表
-
重写方法返回值类型必须和被重写方法的返回值类型相同或为其子类
-
重写方法不能缩小被重写方法的访问权限
7.4.2 方法重载与方法重写
重载 \ 重写 | 位置 | 方法名 | 参数表 | 返回值 | 访问修饰符 |
---|---|---|---|---|---|
方法重载 | 同类 | 相同 | 不相同 | 无关 | 无关 |
方法重写 | 子类 | 相同 | 相同 | 相同或是其子类 | 不能比父类更严格 |
package CH05_JAVAObjectOriented;
//父类
public class XZ05_Extend_B {
public void test() {
System.out.println("B执行");
}
}
package CH05_JAVAObjectOriented;
//子类
public class XZ05_Extend_A extends XZ05_Extend_B {
@Override
public void test() {
// super.test(); 调用父类方法
System.out.println("A执行");
}
}
package CH05_JAVAObjectOriented;
public class XZ05_Extend_Main {
public static void main(String[] args) {
XZ05_Extend_A a = new XZ05_Extend_A();
a.test();
XZ05_Extend_B b = new XZ05_Extend_A();
b.test();
}
}
7.5 多级继承
-
一个类可以继承自某一个类,成为这个类的子类
-
同时,也可以在自身的基础上创建新的类,即成为它子类的父类
-
Java 中只支持单继承,即每个类只能有一个直接父类
7.5.1 继承关系中的构造方法
-
类的构造方法执行场景
-
创建该类的对象时,又称类的实例化
-
创建该类的子类的对象时,又称子类的实例化
-
-
Java 虚拟机按照先父类后子类的顺序执行一系列的构造方法
父类属性 > 父类构造方法 > 子类属性 > 子类构造方法 >
7.5.2 子类继承父类时构造方法的调用规则
-
如果类的构造方法中,没有通过 super 关键字显式调用父类的有参构造方法,也没有通过 this 关键字显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法
- 在这种情况下,是否写
super( );
语句,效果是一样的
- 在这种情况下,是否写
-
如果子类的构造方法中,通过 super 关键字显式地调用了父类的有参构造方法,则将执行父类相应的构造方法,而不执行父类无参构造方法
-
如果子类的构造方法中,通过 this 关键字显式地调用了自身的其他构造方法,在相应的构造方法中遵循以上两条规则
如果存在多级继承关系,则在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类 Object 类的无参构造方法为止
BCSP-玄子JAVA开发之面向对象编程CH02_ 继承笔记