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

继承

继承的特性

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

  • 继承的格式: 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://xiahunao.cn/news/2775045.html

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

相关文章

React + SpringBoot + Minio实现文件的预览

思路:后端提供接口,从minio获取文件的预览链接,返回给前端,前端使用组件进行渲染展示 这里我从minio获取文件预览地址用到了一个最近刚开源的项目,挺好用的,大伙可以试试,用法也很简单 官网&am…

C语言笔试题之实现C库函数 pow()(递归的思想)

实例要求: 1、请你实现C库函数 pow()(stdio.h & math.h) ,即计算 x 的整数 n 次幂函数(即x^n );2、函数声明:double myPow(double x, int n);参数:1、x …

C++进阶(十三)异常

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、C语言传统的处理错误的方式二、C异常概念三、异常的使用1、异常的抛出和捕获2、异常的重新…

leetcode707. 设计链表

leetcode707. 设计链表 题目 思路 1.使用虚头节点,模拟class的初始化 2.class中添加一个链表长度的属性,便于后续操作 代码 class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextclass MyLinkedList:def __init__(self)…

创新指南|生成式AI实验 - 企业快速渐进采用人工智能的科学新方法

生成式人工智能(Gen AI)正迅速成为各行各业的企业创新焦点。 生成式AI实验对于企业创新而言至关重要,不仅可以帮助企业识别最适合和最有影响的应用场景,还能促进组织沿着生成式 AI 学习曲线前进,建立早期的创新领导者和…

Elementplus报错 [ElOnlyChild] no valid child node found

报错描述&#xff1a;ElementPlusError: [ElOnlyChild] no valid child node found 问题复现&#xff08;随机例子&#xff09;&#xff1a; <el-popover placement"right" :width"400" trigger"click"><template #reference><e…

零基础学Python之Unitest模块

1.unittest简介及入门案例 &#xff08;1&#xff09;什么是Unitest Unittest是Python自带的单元测试框架&#xff0c;不仅适用于单元测试&#xff0c;还可用于Web、Appium、接口自动化测试用例的开发与执行。该测试框架可组织执行测试用例&#xff0c;并且提供丰富的断言方法…

Unity引擎学习笔记之【动画层操作】

动画层Animation Layer 一、动画器的三个基本状态 1. Any State&#xff08;任意状态&#xff09; “Any State”&#xff08;任意状态&#xff09;&#xff1a;这个状态可以用来连接多个状态机的任意状态转换。在动画控制器中&#xff0c;你可以使用“Any State”作为过渡条…

问题:银行账号建立以后,一般需要维护哪些设置,不包括() #学习方法#经验分享

问题&#xff1a;银行账号建立以后&#xff0c;一般需要维护哪些设置&#xff0c;不包括&#xff08;&#xff09; A&#xff0e;维护结算科目对照 B&#xff0e;期初余额初始化刷 C&#xff0e;自定义转账定义 D&#xff0e;对账单初始化 参考答案如图所示

c入门第十篇——指针入门

一句话来说: 指针就是存储了内存地址值的变量。 在前面讨论传值和传址的时候&#xff0c;我们就已经开始使用了指针来传递地址。 在正式介绍指针之前&#xff0c;我们先来简单了解一下内存。内存可以简单的理解为一排连续的房子的街道&#xff0c;每个房子都有自己的地址&#…

94.网游逆向分析与插件开发-游戏窗口化助手-地图数据获取的逆向分析与C++代码还原

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;升级经验数据获取的逆向分析 码云地址&#xff08;游戏窗口化助手 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;c4351a5b346d8953a1a8e3ec…

还是蓝海项目?浅谈steam海外道具搬运项目几个常见问题!

做steam这个项目做了已经3年多了。记得刚开始做的时候还是一个很冷门的项目&#xff0c;现在越来越多的朋友也开始了解这个项目。 其中不乏很多已经在别的地方了解过后来找我咨询的朋友。我发现一些同行或者说自媒体太过于虚假宣传&#xff0c;把steam这个项目说的太好了。也有…

Java学习15-- 面向对象学习3. 对象的创建分析【★】

&#xff08;本章看不懂多读几遍&#xff0c;弄懂后再往下章看&#xff09; 面向对象学习3. 对象的创建分析 Java Memory Structure: 如上图所示&#xff1a; 主要分为Stack和Heap Memory 其中Stack主要放method包括main 程序从main开始所以main最先进入Stack&#xff0c;等…

【十二】【C++】vector用法的探究

vector类创建对象 /*vector类创建对象*/ #if 1 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std; #include <vector> #include <algorithm> #include <crtdbg.h>class Date {public:Date(int year 1900, int month 1, int …

Web课程学习笔记--CSS选择器的分类

CSS 选择器的分类 基本规则 通过 CSS 可以向文档中的一组元素类型应用某些规则 利用 CSS&#xff0c;可以创建易于修改和编辑的规则&#xff0c;且能很容易地将其应用到定义的所有文本元素 规则结构 每个规则都有两个基本部分&#xff1a;选择器和声明块&#xff1b;声明块由一…

【C++】引用与内联

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 引用2.1 引用概念2.2 引用使用场景2.3 引用特性2.4 引用和指针的区别2.5 传值、传引用效率比较2.5.1 值和引用的作为返回值类型的性能比较 3. 内联函数3.1 …

Guava RateLimiter单机实战指南

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Guava RateLimiter单机实战指南 前言maven坐标引入业务实现重要参数和方法关于warmupPeriod实战 前言 想象一下你是一位大厨&#xff0c;正在烹饪美味佳肴。突然之间&#xff0c;前来就餐的人潮如潮水…

#Js篇:js里面递归的理解

定义&#xff1a; 递归是一种编程技术&#xff0c;它是指一个函数在其定义内部调用自身的过程。 特点&#xff1a; 一个问题可以分解为更小的问题用同样的方法解决&#xff1b;分解后的子问题求解方式一样&#xff0c;不同的是数据规模变小&#xff1b;存在递归终止条件 作…

单片机学习笔记---DS1302实时时钟工作原理

目录 DS1302介绍 学会读芯片手册&#xff08;DS1302芯片手册&#xff09; 封装 引脚定义 电源部分 时钟部分 通信部分 总结列表 内部结构图 电源控制部分 时钟控制部分 寄存器部分 访问部分 寄存器部分的详细定义 命令字 时序的定义 单字节读 单字节写 提前预…

Vulnhub-Empire靶机-详细打靶流程

渗透思路 1.确认靶机IP地址2.端口服务扫描3.敏感目录扫描4.ffuf命令在这个目录下&#xff0c;继续使用ffuf工具扫描 5.ssh私钥爆破1.将私钥写进sh.txt中2.将私钥转换为可以被john爆破的形式3.通过John爆破 6.ssh私钥登陆7.icex64提权8.arsene提权 1.确认靶机IP地址 ┌──(roo…