面向对象的三大特征之一继承

继承

继承的特性

  • 概念:可以使得子类具有父类的属性(成员变量)和方法(成员方法),还可以在子类中重新定义,追加属性和方法。

  • 继承的格式: public class 子类名 extends 父类名{}

  • 父类:基类、超类 子类:派生类

  • 继承中子类的特点:

    • 子类可以有父类的内容(继承父类非私有的属性和方法
    • 子类还可以有自己特有的内容(自己重新定义新的属性和方法)
    public class Animal{private String name;public void show(){System.out.println("你好!");}
    }
    // 子类继承父类,可以继承非私有的,
    public class Dog extends Animal{private int age;						// 子类自己特有的内容}
    public class Test{public static void main(String args[]){// 创建一个狗的对象Dog d = new Dog();// 调用方法d.show();							// 我们看 Dog 类中并无 show() 方法,但是调用并不出错,是因为继承了父类}
    }
    

继承的好处

  • 提高了代码的复用性(多个类相同的成员可以放到同一个类中)

  • 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)

    // 比如人类,和学生、老师、工人
    public class Person{private String name;private int age;public void eat(){System.out.println("吃饭!");}
    }
    // 学生继承人类
    public class Student extends Person{}
    // 老师继承人类
    public class Teacher extends Person{}
    // 工人继承人类
    public class Worker extends Person{}
    

    我们可以看到,学生、老师、工人,都可以继承人类,提高了代码的复用性,我们知道,继承非私有的成员方法和成员变量,都可以继承 eat() 方法,那我们只需要Person类中修改 eat() 方法,那学生、老师、工人继承的也都修改了,这样提高了代码的维护性

继承的弊端

  • 继承让类与类之间产生了关系,类的耦合性增强了
  • 父类变化时,子类也随着变化,削弱了子类的独立性

什么时候使用继承

  • 继承体现关系:is a (有两个类A和B,满足A是B的一种,或者B是A的一种,就说说明他们存在继承关系)

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

  • 在子类中访问一个变量

    • 子类局部范围找(可简单理解为方法内)
    • 子类成员范围找(类内)
    • 父类成员范围找

    注意:不考虑父亲的父亲,也就是说,假设子类和其父类中都无这个变量,就报错!

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

  • 通过子类对象访问一个方法

    • 子类成员范围找
    • 父类成员范围找

    注意:不考虑父亲的父亲

super 关键字

  • 通过上述的一些特性之后,我们发现,继承是子类和父类的关系,我们涉及到了在子类中访问父类的概念,this 关键字是指代本类对象,我们需要找到一个指代父类对象的关键字–super。

    形式作用
    super.age访问父类成员变量
    super.成员方法(…)访问父类成员方法
    super(…)访问父类的构造方法

    注意:括号中的 “…” 是代表参数的意思,参数个数是 从 0 到多个

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

  • 接下来我们看段代码,来了解下,继承中构造方法的访问特点

    public class Animal{private String name;private int age;// 构造方法public Animal(){// ③}public Animal(String name , int age){	  // ④	this.name = name;this.age = age;}
    }// 继承动物类
    public class Dog extends Animal{				// 产生继承关系public Dog(){super();								// ①}public Dog(String name , int age){super(name,age);						// ②}
    }
    
  • 我们先看 ①和③ 的区别,在③中并无 super() 这行代码,根据我们super关键字的学习,我们知道 super() 其实就是调用 父类的 无参构造方法,其实也就是 调用 ③所在的 无参构造方法,那为什么 ③ 这行没写呢,其实自带 super() 只不过我们看不到而已。

  • 根据上述这句话,我们思考一个问题:那 Animal 类中无参构造也有 super() 这行代码,那Animal 明明没有父类啊,那他调用的是谁呢?

    // 这个就涉及到我们说的,所有类的祖宗类是谁呢,就是我们的 Object
    public class Animal extends Object{		// 原本这行应该这样写,只不过默认不写罢了}
    
  • 看完①和③ 的区别之后,我们看 ②和④的区别,那 ②相当于调用了 ④,那④中有没有 super() 这行代码呢,可以根据下面两图,发现,super(),只能在构造方法的第一行

综上所述:

​ ①:子类继承父类中的数据,可能使用父类中的数据,所以子类初始化之前,一定要完成父类数据的初始化

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

继承的注意事项

  • Java中类只支持单继承,不支持多继承

  • Java中类支持多层继承

方法重写(Override)

  • 学继承后,我们知道,子类会继承父类的成员方法,但是我们不想要父类的方法,怎么办呢?那就是方法的重写。举个列子:你继承了你父亲的公司,但是你不想按照父亲的来,你重新调整公司的模式和经营方向,这就可理解为方法重写。
  • 特点:
    • 子类中出现了和父类一模一样的方法声明(下述代码,会讲解什么是定义什么是声明)
    • 子类有自己特有内容的时候,重写父类中的方法
    • 父类中的私有方法子类无法重写(父类私有成员子类是不能被继承的)
    • 子类重写方法时候,访问权限(即权限修饰符,可点击了解这篇文章)不能比父类低
public class Person{private String name;private int age;public void show(){System.out.println("我是人类!");}// 私有无法被继承private void eat(){System.out.println("人类要吃饭!");}
}
public class Student extends Person{// 方法重写public void show(){						System.out.println("我是学生!");}
}

注意:

①:public void show() 就是方法的声明
②:public void show(){} 就是方法的定义

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

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

相关文章

【Unity】QFramework通用背包系统优化:TipPanel优化

前言 在学习凉鞋老师的课程《QFramework系统设计:通用背包系统》第五章时,笔者对物品提示TipPanel界面进行了一些优化。 优化内容包括: 解决闪烁问题跟随鼠标移动自适应界面大小生成位置优化 效果还是蛮丝滑的: 解决闪烁问题 …

[linux]:匿名管道和命名管道(什么是管道,怎么创建管道(函数),匿名管道和命名管道的区别,代码例子)

目录 一、匿名管道 1.什么是管道?什么是匿名管道? 2.怎么创建匿名管道(函数) 3.匿名管道的4种情况 4.匿名管道有5种特性 5.怎么使用匿名管道?匿名管道有什么用?(例子) 二、命名…

MVCC多版本并发控制

MVCC mvcc是多版本并发控制。维护一个数据的多个版本,使读写没有冲突 隐式字段 DB_TRX_ID:最近修改事务id,记录插入这条记录或最后一次修改该记录的事务id DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,用于配合undo log&…

筛法思想的题目

这道题目比较经典,或者说这种思想比较经典。 这种筛法的思想。 我们正着想对于每一个 n 、 n − 1 、 n − 2 、 . . . 、 2 、 1 n、 n-1、n-2、...、2、1 n、n−1、n−2、...、2、1都分解一遍质因数显然是来不及的时间复杂度达到 O ( n n ) O(n \sqrt{n}) O(nn ​…

Open CASCADE学习|点和曲线的相互转化

目录 1、把曲线离散成点 1.1按数量离散 1.2按长度离散 1.3按弦高离散 2、由点合成曲线 2.1B样条插值 2.2B样条近似 1、把曲线离散成点 计算机图形学中绘制曲线,无论是绘制参数曲线还是非参数曲线,都需要先将参数曲线进行离散化,通过离…

LayUI中表格树折叠 --

1、先将插件源码进行下载,新建 tableTree.js 文件,将源码放进去 2、将 tableTree.js 文件 配置之后,在需要使用的页面进行引入: layui.define(["tableTree"],function (exports) {var tableTree layui.tableTree;// …

2024年【天津市安全员B证】模拟试题及天津市安全员B证模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 天津市安全员B证模拟试题是安全生产模拟考试一点通生成的,天津市安全员B证证模拟考试题库是根据天津市安全员B证最新版教材汇编出天津市安全员B证仿真模拟考试。2024年【天津市安全员B证】模拟试题及天津市…

Redis——缓存设计与优化

讲解Redis的缓存设计与优化,以及在生产环境中遇到的Redis常见问题,例如缓存雪崩和缓存穿透,还讲解了相关问题的解决方案。 1、Redis缓存的优点和缺点 1.1、缓存优点: 高速读写:Redis可以帮助解决由于数据库压力造成…

安全的接口访问策略

渗透测试 一、Token与签名 一般客户端和服务端的设计过程中,大部分分为有状态和无状态接口。 一般用户登录状态下,判断用户是否有权限或者能否请求接口,都是根据用户登录成功后,服务端授予的token进行控制的。 但并不是说有了tok…

【LeetCode】332. 重新安排行程(困难)——代码随想录算法训练营Day30

题目链接:332. 重新安排行程 题目描述 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生&a…

JVM-运行时数据区程序计数器

运行时数据区 Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。《Java虚拟机规范》中规定了每一部分的作用。 程序计数器的定义 程序计数器(Program Counter Register)也叫PC寄存器,每个线程会通过程序计数器…

1.3 Verilog 环境搭建详解教程

学习 Verilog 做仿真时,可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE(目前已停止更新),VIVADO;因特尔公司的 Quartus II;ASIC 开发环境有 Synopsys 公司的 VCS ;很多人也在用 Icarus…

PyTorch 2.2 中文官方教程(三)

使用 PyTorch 构建模型 原文:pytorch.org/tutorials/beginner/introyt/modelsyt_tutorial.html 译者:飞龙 协议:CC BY-NC-SA 4.0 注意 点击这里下载完整示例代码 介绍 || 张量 || 自动微分 || 构建模型 || TensorBoard 支持 || 训练模型 ||…

Java风暴:打造高效作家信息管理平台

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

Web项目利用EasyExcel实现Excel的导出操作

早期Java使用的一些解析,到处excel的框架存在种种问题被遗弃,现在使用阿里巴巴所提供的EasyExcel已成为一种主流,本篇将详细介绍该功能在Web项目中如何实际应用。 详细操作文档:写Excel | Easy Excel 一、项目演示 在后台管理界…

Nginx与history路由模式:刷新页面404问题

使用nginx部署前端项目,路由模式采用history模式时,刷新页面之后,显示404。 路由模式 前端路由的基本作用为: ①当浏览器地址变化时,切换页面; ②点击浏览器后退、前进按钮时,更新网页内容&…

基于ISO13400 (DoIP) 实现车辆刷写

近年来,在整车研发中基于以太网实现车辆高带宽通讯无疑是人们热议的话题。无论是车内基于车载以太网来减少线束成本,实现ADAS、信息娱乐系统等技术,还是基于新的电子电气架构以及远程诊断需求来实现以太网诊断(DoIP)&a…

BUGKU-WEB 留言板

题目描述 题目无需登录后台!需要xss平台接收flag, http协议需要http协议的xss平台打开场景后界面如下: 解题思路 看到此类的题目,应该和存储型xss有关,也就是将恶意代码保存到服务器端即然在服务器端,那就…

【Cocos入门】场景切换(loadScene、preloadScene)

一、loadScene 加载场景 loadScene(sceneName: string, onLaunched: Director.OnSceneLaunched, onUnloaded: Director.OnUnload) : boolean 通过场景名称进行加载场景。返回值为布尔类型 参数: NameTypeDescriptionsceneNamestring场景名称onLaunchedDirector.O…

基于Chrome插件的Chatgpt对话无损导出markdown格式(Typora完美显示)

刚刚提交插件到Chrome插件商店正在审核,想尝试的可以先使用: https://github.com/thisisbaiy/ChatGPT-To-Markdown-google-plugin/tree/main 我将源代码上传至了GitHub,欢迎star, IssueGoogle插件名称为:ChatGPT to MarkDown plus…