Java基础第二遍-07-面向对象-继承

继承

  1. 关键字:extends
  2. 优点:
    1. 提高代码的复用性
    2. 让类与类之间产生了关系,给多态提供了前提
  3. 父类是子类共性内容的抽取
  4. Java中只允许单继承,单继承:一个子类只允许有一个直接父类
  5. Java支持多重继承(例如:A继承B,B继承C,C继承D)
  6. 当要使用一个继承体系时:
    1. 查看该体系中的顶层类,了解该体系的基本功能
    2. 创建体系中的最子类对象,完成功能的使用
  7. 什么时候定义继承呢?
    1. 当类与类之间存在所属关系的时候定义,所属关系(xxx是yyy的一种,那么xxx继承yyy)

super关键字

  1. 子类成员与父类成员重名,可以使用super进行区分(调用父类的成员)(用法:super.成员名)
  2. this代表本类对象的引用
  3. super代表父类空间
  4. image
  5. 方法的重写(子类中存在于父类一样的方法(函数名、返回值、参数列表,都需要一样,方法体可以不一样))
  6. 重写:子类方法的权限必须要大于父类的权限,
  7. 静态只能重写静态,或者被静态重写

子类继承父类后的实例化过程

class Fu{
    Fu(){
        System.out.println("Fu create");
    }
}
class Zi extends Fu{
    Zi(){
        //super();默认隐式存在一个父类的无参构造函数 且必须在第一行
        //这里也可以是有参构造super(2);,但是父类需要显示的定义对应的有参构造
        System.out.println("Zi create");
    }
}
public class Demo01 {
    public static void main(String[] args) {
        new Zi();//子类在进行实例化的时候:子类中所有的构造函数默认都会访问父类中的空参数的构造函数
    }
}
  1. 为什么子类实例化的时候需要访问父类的构造函数?
    1. 父类可能会在构造函数中对自己的一些属性进行初始化操作,所以子类需要先看看父类的属性内容,然后再进行继承使用,所以需要调用父类的构造函数
    2. 为了完成上述目的,所以就在子类的构造函数的第一行加入了super();
  2. 如果父类中没有定义无参构造,那么子类需要明确的执行子类需要使用父类的哪个构造函数
  3. 如果子类的构造函数中使用了this();调用自己的构造函数,那么super();在此构造函数中就没有了,因为super();和this();都只能定义在第一行,this();调用的其他构造函数肯定会访问父类的构造函数。这是机制
  4. Java中的所有类都默认是Object的直接子类或者间接子类,一个没有显示的继承任何类的类,他默认继承了Objectclass A extends Objectextends只是没有显示。

子类实例化成员变量加载过程

package com.bixiangdong.oop;
class Fu1{
    Fu1(){
        super();
        show();//这里的show是this.show(); this省略了
    }
    void show(){
        System.out.println("Fu1 Run");
    }
}
class Zi1 extends Fu1{
    int num=8;
    Zi1(){
        super();
        //super初始化父类内容时,子类成员变量并未进行初始化,super父类初始化完毕之后
        //才进行子类成员变量的初始化
        System.out.println("Zi1 Run"+num);
        show();
    }
    void show(){
        System.out.println("Zi1 Run---"+num);
    }
}
public class Demo02 {
    public static void main(String[] args) {
        Zi1 zi1 = new Zi1();
        zi1.show();
    }
}
//结果
Zi1 Run---0
Zi1 Run8
Zi1 Run---8
Zi1 Run---8
  1. 从上述结果可以看出,Fu1中的构造方法运行的show是子类的show,其中的num为0,所以可以看出子类的成员变量还没有进行初始化,而且其中的show方法默认省略了this.show(); this代表当前对象 而当前对象是Zi1 所以使用的是子类的show方法
  2. 父类初始化完毕之后才进行的子类初始化
posted @ 2021-10-25 23:43  争取做百分之一  阅读(30)  评论(0)    收藏  举报