【Java基础】19.继承(面向对象的三大特征:封装、继承、多态)

news2024/11/16 23:58:46

文章目录

  • 前言
  • 一、继承的概念
  • 二、继承的步骤
    • 1.类的继承格式
    • 2.继承的实例
    • 3.继承类型
  • 三、继承的特性
  • 四、继承的关键字
    • 1.extends关键字
    • 2.implements关键字
    • 3.super 与 this 关键字
    • 4.final 关键字
  • 五、构造器


前言

一、继承的概念

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承
兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。

二、继承的步骤

1.类的继承格式

在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:

class 父类 {
}
 
class 子类 extends 父类 {
}

2.继承的实例

接下来我们通过实例来说明这个需求。
开发 People 类,其中有 Student 类和 Teacher 类。

  • 学生 Student,属性(名字 name,年龄 age,成绩 grades),方法(自我介绍 talk,学习 study)
  • 老师 Teacher,属性(名字 name,年龄 age,月薪 salary),方法(自我介绍 talk,教学 teach)

在 Student 类和 Teacher 类当中,有一些属性和方法是共有的,可以提炼成父类 People,减少代码重复。

  • 父类 People,属性(名字 name,年龄 age),方法(自我介绍 talk)

结构
父类People:

package com.zh.d7_extends;

/**
 * @ClassName: People
 * @Description: 父类People
 * @author: Zh
 * @date: 2024/4/20 9:09
 */
public class People {
    private String name; // 名字
    private int age; // 年龄

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 共有的方法
     */
    public void talk() {
        System.out.println("大家好,我的名字是" + getName() + "," + getAge() + "岁");
    }
}

子类Student:

package com.zh.d7_extends;

/**
 * @ClassName: Student
 * @Description: 子类Student继承父类People
 * @author: Zh
 * @date: 2024/4/20 9:09
 */
public class Student extends People {

    private double grades; // 成绩

    public double getGrades() {
        return grades;
    }

    public void setGrades(double grades) {
        this.grades = grades;
    }

    /**
     * Student类,独有的行为
     */
    public void study() {
        System.out.println(getName() + "学生开始学习~~~~");
    }
}

子类Teacher:

package com.zh.d7_extends;

/**
 * @ClassName: Teacher
 * @Description: 子类Teacher继承父类People
 * @author: Zh
 * @date: 2024/4/20 9:10
 */
public class Teacher extends People {

    private double salary; // 月薪

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    /**
     * Teacher类,独有的行为
     */
    public void teach() {
        System.out.println(getName() + "老师在教Java~~~~");
    }

}

测试,看子类继承父类以后,进行调用:

package com.zh.d7_extends;

/**
 * @ClassName: ExtendsTest
 * @Description: 继承(面向对象的三大特征:封装、继承、多态)
 * @author: Zh
 * @date: 2024/4/20 8:49
 */
public class ExtendsTest {
    public static void main(String[] args) {
        // 创建子类对象,看是否可以使用父类的属性和行为
        System.out.println("----学生----");
        Student s = new Student();
        s.setName("西门吹雪"); // 父类People的属性
        s.setAge(25); // 父类People的属性
        s.setGrades(87.5); // 子类Student的属性
        System.out.println("名字:" + s.getName());// 父类People的属性
        System.out.println("年龄:" + s.getAge());// 父类People的属性
        System.out.println("分数:" + s.getGrades()); // 子类Student的属性
        s.talk(); // 父类People的方法
        s.study(); // 子类Student的方法

        System.out.println("----教师----");
        Teacher t = new Teacher();
        t.setName("贝吉塔");
        t.setAge(55);
        t.setSalary(7856.34);
        System.out.println("名字:" + t.getName());
        System.out.println("年龄:" + t.getAge());
        System.out.println("月薪:" + t.getSalary());
        t.talk();
        t.teach();
    }
}

编译运行结果如下:

----学生----
名字:西门吹雪
年龄:25
分数:87.5
大家好,我的名字是西门吹雪,25岁
西门吹雪学生开始学习~~~~
----教师----
名字:贝吉塔
年龄:55
月薪:7856.34
大家好,我的名字是贝吉塔,55岁
贝吉塔老师在教Java~~~~

3.继承类型

需要注意的是 Java 不支持多继承,但支持多重继承。
继承类型
单继承:一个人可以有爸爸。
多重继承:一个人可以有爸爸,也可以有爷爷。
不同类继承同一个类:一个人可以有孩子1和孩子2.
多继承(不支持):一个人不可以有两个爸爸。

三、继承的特性

  • 子类拥有父类非 private 的属性、方法。
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。
  • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

四、继承的关键字

继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承 Object(这个类在 java.lang 包中,所以不需要 import)祖先类。

1.extends关键字

在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

父类 Animal:

package com.zh.d8_extends_test;

/**
 * @ClassName: Animal
 * @Description: 父类Animal
 * @author: Zh
 * @date: 2024/4/20 9:58
 */
public class Animal {
    private String name;
    private int id;

    public Animal(String myName, int myid) {
        //初始化属性值
    }

    public void eat() {  //吃东西方法的具体实现
    }

    public void sleep() { //睡觉方法的具体实现
    }
}

子类 Cat,使用 extends 关键字进行继承:

package com.zh.d8_extends_test;

/**
 * @ClassName: Cat
 * @Description: extends关键字
 * 类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
 * 子类Cat继承父类Animal
 * @author: Zh
 * @date: 2024/4/20 9:59
 */
public class Cat extends Animal{
    public Cat(String myName, int myid) {
        super(myName, myid);
    }
}

2.implements关键字

使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。

接口A:

package com.zh.d8_extends_test;

/**
 * @ClassName: IntfA
 * @Description: 接口A
 * @author: Zh
 * @date: 2024/4/20 10:07
 */
public interface IntfA {
    public void eat();
    public void sleep();
}

接口B:

package com.zh.d8_extends_test;

/**
 * @ClassName: IntfB
 * @Description: 接口B
 * @author: Zh
 * @date: 2024/4/20 10:07
 */
public interface IntfB {
    public void show();
}

类 C 用 implements 关键字继承接口 A 和接口 B:

package com.zh.d8_extends_test;

/**
 * @ClassName: ClassC
 * @Description: implements关键字
 * 可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,
 * 可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
 * @author: Zh
 * @date: 2024/4/20 10:06
 */
public class ClassC implements IntfA,IntfB{
    @Override // 接口A的方法
    public void eat() {

    }

    @Override // 接口A的方法
    public void sleep() {

    }

    @Override // 接口B的方法
    public void show() {

    }
}

3.super 与 this 关键字

  • super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
  • this关键字:指向自己的引用。

父类:

/**
 * @ClassName: Animal
 * @Description: super关键字、this关键字
 * 父类Animal
 * @author: Zh
 * @date: 2024/4/20 10:22
 */
public class Animal {
    void eat() {
        System.out.println("animal : eat");
    }
}

子类:

/**
 * @ClassName: Dog
 * @Description: super关键字、this关键字
 * 子类Dog,继承父类Animal
 * @author: Zh
 * @date: 2024/4/20 10:22
 */
public class Dog extends Animal{
    void eat() {
        System.out.println("dog : eat");
    }
    void eatTest() {
        System.out.println("----this----");
        this.eat();   // this 调用自己的方法
        System.out.println("----super----");
        super.eat();  // super 调用父类方法
    }
}

测试类:

/**
 * @ClassName: TestDemo
 * @Description: super关键字、this关键字
 * 测试类TestDemo
 * @author: Zh
 * @date: 2024/4/20 10:23
 */
public class TestDemo {
    public static void main(String[] args) {
        Animal a = new Animal();
        a.eat(); // 父类方法
        System.out.println("----super关键字、this关键字----");
        Dog d = new Dog();
        d.eatTest(); // 子类方法
    }
}

编译运行结果如下:

animal : eat
----super关键字、this关键字----
----this----
dog : eat
----super----
animal : eat

4.final 关键字

final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
final 含义为 “最终的”。
使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写:

  • 声明类
final class 类名 {//类体}
  • 声明方法
修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}

注意: final 定义的类,其中的属性、方法不是 final 的。

五、构造器

子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。

如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

父类:

public class Animal {
    private String name; // 父类属性name

    Animal() {
        System.out.println("父类无参构造器Animal");
    }

    Animal(String name) {
        System.out.println("父类有参构造器Animal(String name)");
        this.name = name;
    }
    
}

子类1:

public class Dog extends Animal {
    private String name; // 子类属性name,和父类的name同名了

    Dog() { // 自动调用父类的无参数构造器
        System.out.println("子类无参构造器Dog");
    }

    public Dog(String name) {
        super("贝吉塔");  // 调用父类中带有参数的构造器
        System.out.println("子类有参构造器Dog(String name):" + name);
        this.name = name;
    }

}

子类2:

public class Cat extends Animal {
    private String name; // 子类属性name,和父类的name同名了

    Cat() {
        super("卡卡罗特"); // // 调用父类中带有参数的构造器
        System.out.println("子类无参构造器Cat");
    }

    public Cat(String name) { // 自动调用父类的无参数构造器
        System.out.println("子类有参构造器Cat(String name):" + name);
        this.name = name;
    }

}

测试类:

public class TestDemo {
    public static void main(String[] args) {
        System.out.println("------Dog类继承------");
        Dog sc1 = new Dog();
        Dog sc2 = new Dog("布尔玛");
        System.out.println("------Cat类继承------");
        Cat sc3 = new Cat();
        Cat sc4 = new Cat("魔人布欧");
    }
}

编译运行结果如下:

------Dog类继承------
父类无参构造器Animal
子类无参构造器Dog
父类有参构造器Animal(String name)
子类有参构造器Dog(String name):布尔玛
------Cat类继承------
父类有参构造器Animal(String name)
子类无参构造器Cat
父类无参构造器Animal
子类有参构造器Cat(String name):魔人布欧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1611099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git - 在PyCharm/Idea中集成使用Git

文章目录 Git - 在PyCharm/Idea中集成使用Git1.新建GitHub仓库2.将仓库与项目绑定3.在PyCharm中使用Git4.新建Gitee仓库5.将仓库与项目绑定6.在IDEA中使用Git Git - 在PyCharm/Idea中集成使用Git 本文详细讲解了如何在 PyCharm 或 Idea 中配置 Gitee 或 GitHub 仓库&#xff0…

【算法】深度优先遍历(DFS)算法详解与实现

文章目录 1.算法原理2. 常见的深度优先遍历方式3. 代码实现总结 深度优先遍历(DFS)是一种常用的树或图的遍历算法,它通过尽可能深地搜索树或图的分支,直到路径上的所有节点都被访问完毕,然后再回溯到上一层&#xff0c…

win10 系统怎么开启 guest 账户?

win10 系统怎么开启 guest 账户? 段子手168 前言: guest 账户即所谓的来宾账户,我们可以通过该账户访问计算机,如打印机共享等,但会在一定程度上受到限制。下面分享 WIN10 系统开启 guest 来宾账户的几种方法。 方法…

袁庭新ES系列15节|Elasticsearch客户端基础操作

前言 上一章节我们介绍了搭建Elasticsearch集群相关的知识。那么又该如何来操作Elasticsearch集群呢?在ES官网中提供了各种语言的客户端,我们在项目开发过程中有多种Elasticsearch版本和连接客户端可以选择,那么他们有什么区别?这…

Clion 2023.1.5 最新详细破解安装教程

CLion 最大的优点是跨平台,在Linux、Mac、Windows 上都可以运行。CLion 还同时支持 GCC、Clang、MSVC 这 3 种编译器,使用 CLion 编写程序,程序员可以根据需要随意切换使用的编译器。 第一步: 下载最新的 Clion 2023.1.5 版本安装包 我们先…

(2022级)成都工业学院数据库原理及应用实验五: SQL复杂查询

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求,请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 在实验三的基础上完成下列查询: 1、查询医生…

项目管理-项目开发计划介绍

目录 一、内容总览 二、项目开发计划概述 2.1 概述 2.2 项自开发计划的目的和作用 2.3 项目开发计划的内容 2.3.1 工作计划 2.3.2 人员组织计划 2.3.3 设备采购和资源供应计划 2.3.4 配置管理计划 2.3.5 进度安排计划 2.3.6 成本投资计划 2.3.7 质量保证计划 2.3.8…

Unity Editor编辑器扩展之创建脚本

前言 既然你看到这篇文章了,你是否也有需要使用代码创建脚本的需求?使用编辑器扩展工具根据不同的表格或者新增的内容去创建你想要的脚本。如果不使用工具,那么你只能不断去修改某个脚本,这项工作既繁琐也浪费时间。这个时候作为程…

Electron+Vue3整合 - 开发时状态整合

说明 本文介绍一下 Electron Vue3 的整合的基本操作。实现的效果是 : 1、一个正常的Vue3项目; 2、整合加入 Electron 框架 :开发时 Electron 加载的是开发的vue项目;步骤一:创建vue3项目 常规操作,不再赘…

盲人购物指南:智能化辅助引领超市购物新体验

作为一名资深记者,我有幸见证了一位盲人朋友借助一款名为蝙蝠避障的高科技辅助应用,独立完成超市购物之旅,这一过程充分展示了盲人购物指南新时代的到来。 在前往超市的路上,这款应用犹如一位贴心的“电子向导”,实时为…

Vue【路由】

1:什么是单页应用程序(single page application) 所有得功能在一个html页面上实现 2:单页面应用程序的优缺点 优点:按需更新性能高,开发效率也高,用户的体验较好 缺点:学习成本高…

学习-官方文档编辑方法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

高效编程工具 JetBrains CLion 2024 中文激活 mac/win

在追求编程高效与精准的道路上,JetBrains CLion 2024 for Mac无疑是您的最佳伙伴。这款专为Mac用户打造的C/C集成开发环境,凭借其强大的功能和出色的性能,赢得了广大开发者的青睐。 CLion 2024拥有智能的代码编辑器和强大的代码分析工具&…

超越GPT-4V,苹果多模态大模型上新,神经形态计算加速MLLM(一)

4月8日,苹果发布了其最新的多模态大语言模型(MLLM )——Ferret-UI,能够更有效地理解和与屏幕信息进行交互,在所有基本UI任务上都超过了GPT-4V! 苹果开发的多模态模型Ferret-UI增强了对屏幕的理解和交互&am…

解锁棋盘之谜:探索N皇后问题的全方位解决策略【python 力扣51题】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析…

【Qt 学习笔记】Qt常用控件 | 显示类控件Label的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 显示类控件Label的使用及说明 文章编号:Qt 学…

AOP基础-动态代理

文章目录 1.动态代理1.需求分析2.动态代理的核心3.代码实例1.Vehicle.java2.Car.java3.Ship.java4.VehicleProxyProvider.java(动态代理模板)5.测试使用 2.动态代理深入—横切关注点1.需求分析2.四个横切关注点3.代码实例1.Cal.java2.CalImpl.java3.VehicleProxyProvider02.jav…

iOS重签名-超详细,附排错

文章目录 重签名步骤步骤 1: 准备必要的材料步骤 2: 解压 .ipa 文件步骤3:将 Provisioning Profile 复制到 Payload 目录步骤 4: 移除原来的签名步骤 5: 使用新的证书和 Provisioning Profile 进行重签名步骤 6: 重新打包 .ipa 文件步骤 7: 安装和测试得到provisioning file和…

语音转换中的扩散模型——DDDM-VC

DDDM-VC: Decoupled Denoising Diffusion Models with Disentangled Representation and Prior Mixup for Verifed Robust Voice Conversion https://ojs.aaai.org/index.php/AAAI/article/view/29740https://ojs.aaai.org/index.php/AAAI/article/view/29740 1.概述 首先,语…

力扣HOT100 - 142. 环形链表 II

解题思路&#xff1a; public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();while (head ! null) {if (!set.add(head)) {return head;}head head.next;}return null;} }