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. 只有被添加到虚方法表中的方法才能被重写。

(私有方法不能被重写

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

相关推荐
独自破碎E3 分钟前
JDK版本的区别
java·开发语言
谦宸、墨白15 分钟前
从零开始学C++:二叉树进阶
开发语言·数据结构·c++
建群新人小猿36 分钟前
陀螺匠企业助手—个人简历
android·大数据·开发语言·前端·数据库
子夜江寒37 分钟前
OpenCV 学习:图像拼接与答题卡识别的实现
python·opencv·学习·计算机视觉
wdfk_prog37 分钟前
[Linux]学习笔记系列 -- [drivers][base]platform
linux·笔记·学习
悟空码字1 小时前
SpringBoot深度整合高德地图,构建高性能位置服务
java·springboot·高德地图·编程技术·后端开发
千金裘换酒1 小时前
栈和队列定义及常用语法 LeetCode
java·开发语言
be or not to be1 小时前
JavaScript 对象与原型
开发语言·javascript·ecmascript
0x531 小时前
JAVA|智能无人机平台(二)
java·开发语言·无人机
JH30731 小时前
SpringBoot自定义启动banner:给项目加个专属“开机画面”
java·spring boot·后端