一、继承

1.继承概念/好处

让类与类之间产生关系,这也是多态的前提;

子类可以直接使用父类中非私有的成员;

2.继承代码格式

extents关键字
public class 子类名称  extends 父类名称{ }

3.继承的作用/用途

  • 继承好处(开发中)
  • 提高了代码的复用性(多个类相同的成员可以放到同一个类中);
  • 提高了代码的维护性(如果方法的代码需要修改,修改一处即可);
  • 继承弊端
  • 继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性;
  • 继承的应用场景:
  • 使用继承,需要考虑类与类之间是否存在is…a的关系,不能盲目使用继承;
  • is…a的关系:谁是谁的一种,例如:老师和学生是人的一种,那人就是父类,学生和老师就是子类;

4.继承的特点

  • 只支持单继承,不支持多继承,意思就是extends后面只能写一个类名
举例:calss A extends B,C {   }    //这是错误的
  • 类支持多层继承
    也就是说父与子之间,父可以有多个子,也可以有多个子孙类(感觉又是经典套娃);
public class Granddad {

    public void drink() {
        System.out.println("我爱喝酒");
    }

}

public class Father extends Granddad {

    public void smoke() {
        System.out.println("我爱抽烟");
    }

}

public class Mother {

    public void dance() {
        System.out.println("我爱跳舞");
    }

}
public class Son extends Father {
	// 此时,Son类中就同时拥有drink方法以及smoke方法
}

5.成员变量的访问特点

在子类方法中访问一个变量,采用的是就近原则。

  • 先从子类局部范围找
  • 再从子类成员范围找
  • 再从父类成员范围找
  • 如果都没有就报错(不考虑父亲的父亲…)

如果一定要使用父类的,可以通过super关键字,进行区分

6.关键字:this和super的使用

  • this&super关键字:
  • this:代表本类对象的引用
  • super:代表父类存储空间的标识(可以理解为父类对象引用)
  • this和super的使用分别
  • 成员变量:
  • this.成员变量 - 访问本类成员变量
  • super.成员变量 - 访问父类成员变量
  • 成员方法:
  • this.成员方法 - 访问本类成员方法
  • super.成员方法 - 访问父类成员方法
  • 构造方法:
  • this(…) - 访问本类构造方法
  • super(…) - 访问父类构造方法

7.继承中成员方法的访问特点

当子类和父类中出现了相同的方法时,调用子类中的方法是子类的方法;

注意:我们在调用一个类的成员变量和成员方法时,系统会默认的在前面加上this关键字;

8.方法重写

  • 方法重写概念
  • 子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
  • 方法重写的应用场景
  • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
  • Override注解
  • 用来检测当前的方法,是否是重写的方法,起到【校验】的作用
  • 方法重写的注意事项
  • 私有方法不能被重写(父类私有成员子类是不能继承的)
  • 子类方法访问权限不能更低(public > 默认 > 私有)
  • 静态方法不能被重写,如果子类也有相同的方法,并不是重写的父类的方法
public class Fu {
    private void show() {
        System.out.println("Fu中show()方法被调用");
    }

    void method() {
        System.out.println("Fu中method()方法被调用");
    }
}

public class Zi extends Fu {

    /* 编译【出错】,子类不能重写父类私有的方法*/
    @Override
    private void show() {
        System.out.println("Zi中show()方法被调用");
    }
   
    /* 编译【出错】,子类重写父类方法的时候,访问权限需要大于等于父类 */
    @Override
    private void method() {
        System.out.println("Zi中method()方法被调用");
    }

    /* 编译【通过】,子类重写父类方法的时候,访问权限需要大于等于父类 */
    @Override
    public void method() {
        System.out.println("Zi中method()方法被调用");
    }
}

9.权限修饰符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJXsHxkk-1666688104726)(C:\Users\Administrator\Desktop\02_权限修饰符.png)]

10.继承中构造方法的访问特点

  • 子类中所有的构造方法默认都会访问父类中无参的构造方法!
  • 原因:子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据,所以子类初始化之前,一定要先完成父类初始化;每一个子类构造方法的第一条语句默认都是:super()
  • 注意: 如果我们编写的类,没有手动指定父类,系统也会自动继承Object(Java继承体系中的最顶层父类)
  • 所有构造方法的第一条默认语句都是:super();

11.代码修改原则

的数据,所以子类初始化之前,一定要先完成父类初始化;每一个子类构造方法的第一条语句默认都是:super()

  • 注意: 如果我们编写的类,没有手动指定父类,系统也会自动继承Object(Java继承体系中的最顶层父类)
  • 所有构造方法的第一条默认语句都是:super();

11.代码修改原则

  • 开闭原则,对扩展开发对修改关闭,尽量在不更改原有代码的前提下以完成需求,是为了使程序的扩展性好,易于维护和升级;