JAVA---继承

继承

  1. 在 Java 里,继承是面向对象编程的重要特性之一,它允许一个类(子类、派生类)继承另一个类(父类、基类)的属性和方法;

  2. Java 中提供一个关键字 extends ,用这个关键字,我们可以让一个类和另一个类建立起继承关系;

java 复制代码
public class Srudent extends Person  {}
java 复制代码
public class 子类 extends 父类 {}

Student 称为子类(派生类)

Person 称为父类(父类、超类)

e.g.

java 复制代码
//基本语法示例
// 父类
class ParentClass {
    // 父类的属性
    int parentAttribute;

    // 父类的方法
    void parentMethod() {
        System.out.println("This is a method from the parent class.");
    }
}


// 子类
class ChildClass extends ParentClass {
    // 子类的属性
    int childAttribute;

    // 子类的方法
    void childMethod() {
        System.out.println("This is a method from the child class.");
    }
}

什么时候会用到继承?

当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码。


使用继承的好处:

  1. 可以把多个子类中重复的代码抽取到父类中,减少代码冗余,提高代码复用性;

  2. 子类可以在父类的基础上,增加其他的功能,使子类更强大。


继承的特点

Java 只支持单继承,不支持多继承,但支持多层继承。

单继承:一个子类只能继承一个父类;

不支持多继承:子类不能同时继承多个父类;

多层继承:子类 A 继承父类 B,父类 B 可以继承父类 C

每一类都直接或间接的继承于 Object


继承的限制

  1. Java 只支持单继承,即一个类只能直接继承自一个父类。

  2. 私有成员(private)不能被继承,但可以通过公共的访问器方法来访问。

示例:

java 复制代码
class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    void eat() {
        System.out.println(name + " is eating.");
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    void bark() {
        System.out.println(name + " is barking.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        dog.eat();
        dog.bark();
    }
}

在这个示例中,Dog 类继承了 Animal 类,并且添加了自己的 bark 方法。在 Main类的 main方法中,创建了一个 Dog对象,并调用了它继承的 eat方法和自己的 bark方法。


子类到底能继承父类中的哪些内容?

构造方法

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

  1. 父类中的构造方法不会被子类继承,但是可以通过super()调用;

  2. 子类构造方法的第一行,有一个默认的super();

  3. 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己;

  4. 如果想要方法中父类有参构造,必须手动书写。

为什么?

  1. 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类中的数据;

2. 子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。
怎么调用父类构造方法?

子类构造方法的第一行语句默认为:super(),不写也存在,且必须在第一行


成员变量

继承中:成员变量的访问特点

就近原则

现在局部位置找,本类成员位置找,父类成员位置找,逐级向上。

如果出现了重名的成员变量怎么办?

java 复制代码
System.out.println(name); //从局部位置开始向上找

System.out.println(this.name);  //从本类成员位置开始向上找

System.out.println(super.name);  //从父类成员位置开始向上找

成员方法

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

直接调用满足就近原则:谁离我近,我就用谁

this调用:就近原则

super调用:直接找父类


方法重写

当父类的方法不能满足子类现在的需求时,需要进行方法重写

在继承体系中,子类出现和父类一模一样的方法声明。

本质:覆盖虚方法表中的方法

如果发生重写,则会覆盖

书写格式:

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

@Override重写注释

  1. @Override是放在重写方法上的,校验子类重写时语法是否正常;

  2. 加上注释后如果有红色波浪线,表示语法错误;

  3. 建议重写方法都加@Override注释,代码安全,优雅!

  4. 提高代码可读性。

方法重写注意事项和要求:

  1. 重写方法的名称、形参列表必须与父类中保持一致;

  2. 子类重写父类方法时,访问权限子类不许大于等于父类

(暂时了解:空着不写<protected<public)

  1. 子类重写父类方法时,返回值类型子类必须小于等于父类;

  2. 建议:重写的方法尽量和父类保持一致;

  3. 只有被添加到虚方法表中的方法才能被重写。

(私有方法不能被重写

子类不能重写父类中的静态方法,如果重写会报错)

相关推荐
liaokailin32 分钟前
Spring AI 实战:第十一章、Spring AI Agent之知行合一
java·人工智能·spring
JANYI20181 小时前
C文件在C++平台编译时的注意事项
java·c语言·c++
蓝莓味柯基1 小时前
Python 学习路线与笔记跳转(持续更新笔记链接)
笔记·python·学习
先鱼鲨生2 小时前
【Qt】初识Qt
开发语言·qt
benpaodeDD2 小时前
双列集合——map集合和三种遍历方式
java
Rytter2 小时前
Android逆向学习(八)Xposed快速上手(上)
android·学习
chao_7892 小时前
QT开发工具对比:Qt Creator、Qt Designer、Qt Design Studio
开发语言·qt
Kx…………3 小时前
Day3:设置页面全局渐变线性渐变背景色uniapp壁纸实战
前端·学习·uni-app·实战·项目
Q_Boom3 小时前
前端跨域问题怎么在后端解决
java·前端·后端·spring
搬砖工程师Cola3 小时前
<Revit二次开发> 通过一组模型线构成墙面,并生成墙。Create(Document, IList.Curve., Boolean)
java·前端·javascript