【Java 基础篇】Java继承:打开面向对象编程的大门

news/2024/7/16 8:03:05 标签: java, 开发语言, python, 后端, 前端, github, ide

在这里插入图片描述

继承是面向对象编程(Object-Oriented Programming,OOP)中的一个重要概念。在Java中,继承允许一个类(子类)从另一个类(父类)继承属性和方法。这种机制使得代码重用、扩展和维护变得更加容易。本篇博客将深入探讨Java中继承的概念、语法和最佳实践,适用于初学者,让你轻松理解和运用继承的强大功能。

什么是继承?

继承是面向对象编程的四大基本特征之一,包括封装、继承、多态和抽象。继承允许你创建一个新的类(子类或派生类),该类继承了另一个类(父类或基类)的属性和方法。这意味着子类可以复用父类的代码,并在其基础上进行扩展或修改。

继承的主要优点包括:

  1. 代码重用: 可以重用现有的代码,无需重复编写相同的功能。

  2. 扩展性: 可以在现有类的基础上创建新的类,以满足不同的需求。

  3. 维护性: 如果需要对多个类进行相似的更改,只需更新父类即可。

Java中的继承

在Java中,继承是通过关键字 extends 来实现的。子类继承了父类的属性和方法,可以通过子类对象访问它们。

基本语法

下面是一个简单的继承示例,其中有一个父类 Animal 和一个子类 Dog

java">class Animal {
    String name;

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

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

在这个示例中,Dog 类继承了 Animal 类。子类 Dog 拥有 Animal 类的属性 name 和方法 eat(),同时还有自己的方法 bark()

访问父类的属性和方法

在子类中,可以使用 super 关键字来访问父类的属性和方法。例如,子类中的 bark() 方法可以通过 super.eat() 来调用父类 Animaleat() 方法。

java">class Dog extends Animal {
    void bark() {
        System.out.println(name + " is barking.");
        super.eat(); // 调用父类的eat()方法
    }
}

ide_56">方法覆盖(Override

子类可以覆盖(override)父类的方法,这意味着子类可以提供自己的实现版本。覆盖发生在子类中重新定义父类方法的情况下。要覆盖一个方法,子类的方法必须具有相同的名称、返回类型和参数列表。

下面是一个方法覆盖的示例:

java">class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound.");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Dog barks.");
    }
}

在这个示例中,Dog 类覆盖了 Animal 类中的 makeSound() 方法,提供了自己的实现。

构造方法的继承

子类可以调用父类的构造方法来初始化从父类继承的属性。在子类的构造方法中使用 super() 调用父类的构造方法。

java">class Animal {
    String name;

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

class Dog extends Animal {
    Dog(String name) {
        super(name); // 调用父类的构造方法
    }
}

防止继承

有时候,你可能希望阻止某个类被继承,你可以使用 final 关键字来标记这个类。例如:

java">final class FinalClass {
    // 类的内容
}

标记为 final 的类不能被继承。

继承的注意事项

在使用继承时,有一些需要注意的事项:

  1. 单一继承: Java中不支持多重继承,一个类只能继承一个父类。这意味着一个类不能同时继承多个类。

  2. 方法覆盖: 子类覆盖父类方法时,必须保持方法名称、返回类型和参数列表的一致性。否则,编译器将会报错。

  3. super关键字: 子类可以使用 super 关键字来访问父类的属性和方法。这在需要调用父类的构造方法或访问父类方法时非常有用。

  4. 构造方法的调用: 子类的构造方法可以调用父类的构造方法,以确保从父类继承的属性得到正确的初始化。

  5. final关键字: 使用 final 关键字可以防止一个类被继承,或者防止一个方法被覆盖。这在某些情况下可以提高代码的安全性和可维护性。

  6. 抽象类和接口: 除了普通的类继承,Java还支持抽象类和接口的继承。抽象类和接口提供了更多的灵活性和多态性。

实例:继承的应用

让我们通过一个实例来演示继承的应用。假设我们正在创建一个简单的图形应用程序,其中有不同类型的图形,如圆形和矩形。我们可以使用继承来创建一个通用的图形类,然后派生出具体的子类。

java">class Shape {
    String color;

    Shape(String color) {
        this.color = color;
    }

    void draw() {
        System.out.println("Drawing a shape with color " + color);
    }
}

class Circle extends Shape {
    double radius;

    Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }

    @Override
    void draw() {
        System.out.println("Drawing a circle with radius " + radius + " and color " + color);
    }
}

class Rectangle extends Shape {
    double length;
    double width;

    Rectangle(String color, double length, double width) {
        super(color);
        this.length = length;
        this.width = width;
    }

    @Override
    void draw() {
        System.out.println("Drawing a rectangle with length " + length + ", width " + width + ", and color " + color);
    }
}

在这个示例中,我们创建了一个通用的 Shape 类,具有颜色属性和绘制方法。然后,我们派生出 CircleRectangle 类,它们继承了 Shape 类的属性和方法,并提供了自己的实现。

下面是如何使用这些类的示例:

java">public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle("Red", 5.0);
        circle.draw();

        Rectangle rectangle = new Rectangle("Blue", 4.0, 6.0);
        rectangle.draw();
    }
}

这个示例演示了如何使用继承创建一个简单的图形类层次结构,从而实现代码重用和多态性。

总结

继承是Java中的一个重要概念,它允许一个类继承另一个类的属性和方法,从而实现代码的重用和扩展。在使用继承时,需要注意方法覆盖、构造方法的调用、super 关键字等细节。通过合理使用继承,可以更好地组织和管理代码,提高代码的可维护性和可扩展性。

希望本篇博客帮助你理解Java中继承的基本概念和语法。继承是面向对象编程中的核心概念之一,掌握好它将对你的Java编程技能产生积极影响。


http://www.niftyadmin.cn/n/5001426.html

相关文章

递归算法学习——有效的数独,解数独

一,有效的数独 1.题意 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#x…

nuxt3项目使用pdfjs-dist预览pdf

使用的包的源代码是 pdfjs - npm 但是我们实际上项目中使用的是pdfjs打包后的dist文件,也就是pdfjs-dist - npm 所以我们需要使用这个命令 npm i pdfjs-dist 我们可以克隆pdfjs这个包来看源代码,里面有使用的例子,也可以根据源代码自己打…

【综述+3D】基于NeRF的三维视觉2023年度进展报告(截止2023.06.10)

论文:2003.Representing Scenes as Neural Radiance Fields for View Synthesis 官方网站:https://www.matthewtancik.com/nerf 突破性后续改进: Instant Neural Graphics Primitives with a Multiresolution Hash Encoding | 展示官网&#…

vue 防抖与节流用法

一、html <template><button click"getData">获取数据</button> </template>二、JS import { throttle } from "/utils/common"; export default {methods:{getData: throttle(async function(params){console.log(”获取接口数…

Swift 周报 第三十六期

文章目录 前言新闻和社区消息称苹果公司和印度财政部官员磋商&#xff0c;扩大在印度的制造产能iPhone 15 Pro 机型新增泰坦灰iPhone 15 全系配 USB-C 苹果拒绝接口和安卓互通 提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十…

C语言:选择+编程(每日一练Day15)

目录 选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;寻找奇数 思路一&#xff1a; 题二&#xff1a;寻找峰值 思路一&#xff1a; 本人实力有限可能对一些地方解…

ant vue3 自定义table一行两列

效果图 table代码 <a-tablesize"small":columns"columns":row-key"(record, index) > index 1":data-source"tableInfo.data":pagination"false"change"handleTableChange"resizeColumn"handleResiz…

单向链表和双向链表的增删改查以及排序问题

文章目录 单向链表双向链表运行结果完整代码 本文介绍链表的增删改查以及排序问题&#xff0c;其中最重要的还是指针的使用&#xff01; 单向链表 定义一个单向链表&#xff0c;里面包含一个整型数据和一个指向后向的指针。 typedef struct linklist{int data;struct linkli…