目录
  1. 1. 继承
    1. 1.1. 如何实现
    2. 1.2. 格式
    3. 1.3. 好处
    4. 1.4. 弊端
    5. 1.5. Java中继承的特点
      1. 1.5.1. 注意事项
    6. 1.6. this和super
      1. 1.6.1. this和super的区别
      2. 1.6.2. 使用
    7. 1.7. 继承中构造方法的关系
      1. 1.7.1. 如果父类没有构造方法
        1. 1.7.1.1. 解决
        2. 1.7.1.2. 注意事项
        3. 1.7.1.3. 注意
java继承必须知道的事儿

继承

简单来说继承就是把多个类中相同的内容给提取出来定义到一个类中。

如何实现

Java提供了关键字:extends

格式

class 子类名 extends 父类名 {}

好处

  • 提高了代码的复用性
  • 提高了代码的维护性
  • 让类与类之间产生了关系,是多态的前提

弊端

类的耦合性增强了

开发的原则:低耦合,高内聚。
耦合:类与类的关系
内聚:就是自己完成某件事情的能力

Java中继承的特点

  • Java只支持单继承,不支持多继承。
    • 有些语言是支持多继承,格式:extends 类1,类2,…
  • Java支持多层继承(继承体系)
class Father {}
class Mother {}
class Son exnteds Father {} //正确的
class Son extends Father,Mother {} // 错误的

注意事项

  • 子类只能继承父类所有非私有的成员(成员方法和成员变量)
  • 子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。
  • 不要为了部分功能而去继承

this和super

this和super的区别

  • this代表本类对应的引用。
  • super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)

使用

调用成员变量

this.成员变量 调用本类的成员变量

super.成员变量 调用父类的成员变量

调用构造方法

this(...) 调用本类的构造方法

super(...) 调用父类的构造方法

调用成员方法

this.成员方法 调用本类的成员方法
super.成员方法 调用父类的成员方法

继承中构造方法的关系

子类中所有的构造方法默认都会访问父类中空参数的构造方法

因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。

注意:子类每一个构造方法的第一条语句默认都是:super();

class Son extends Father {
public Son() {
super();
System.out.println("Son的无参构造方法");
}

}

如果父类没有构造方法

解决

  1. 在父类中添加构造方法
class Father {
int age;
public Father() {
System.out.println("Father的无参构造方法");
}

}

class Son extends Father {
public Son() {
System.out.println("Son的无参构造方法");
}
}

class demo {
public static void main(String[] args) {
//创建对象
Son s = new Son();
}
}
  1. 通过使用super关键字去显示的调用父类的带参构造方法
class Father {
int age;
public Father(String name) {
System.out.println("Father的带参构造方法");
}
}

class Son extends Father {
public Son() {
super("随便写一个");
System.out.println("Son的无参构造方法");
}
}

class demo {
public static void main(String[] args) {
//创建对象
Son s = new Son();
}
}
  1. 子类通过this去调用本类的其他构造方法
class Father {

public Father(String name) {
System.out.println("Father的带参构造方法");
}
}

class Son extends Father {
public Son() {
super("随便写一个");
System.out.println("Son的无参构造方法");
}

public Son(String name) {
this();
System.out.println("Son的带参构造方法");
}
}

class ExtendsDemo7 {
public static void main(String[] args) {
Son s = new Son("Jachie");
}
}

注意事项

this(...)或者super(...)必须出现在第一条语句上。如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。

看程序写结果:

class X {
Y b = new Y();
X() {
System.out.print("X");
}
}

class Y {
Y() {
System.out.print("Y");
}
}

public class Z extends X {
Y y = new Y();
Z() {
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}

结果是:

YXYZ

一个类的初始化过程

  1. 成员变量的初始化
  2. 默认初始化
  3. 显示初始化
  4. 构造方法初始化

子父类的初始化(分层初始化)

  • 先进行父类初始化,然后进行子类初始化

注意

    虽然子类中构造方法默认有一个super()
    初始化的时候,不是按照那个顺序进行的。
    而是按照分层初始化进行的。
    它仅仅表示要先初始化父类数据,再初始化子类数据。
文章作者: Jachie Xie
文章链接: https://xjc5772.github.io/2020-08/11/%E5%AD%A6%E4%B9%A0/%E5%90%8E%E7%AB%AF%E5%AD%A6%E4%B9%A0/JAVA/java%E7%BB%A7%E6%89%BF%E5%BF%85%E9%A1%BB%E7%9F%A5%E9%81%93%E7%9A%84%E4%BA%8B%E5%84%BF/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XJC&Blog
打赏
  • 微信
  • 支付宝

评论