【day11】面向对象编程进阶(继承)

概述

本文深入探讨面向对象编程的核心概念,包括继承、方法重写、thissuper关键字的使用,以及抽象类和方法的定义与实现。通过本文的学习,你将能够:

  1. 理解继承的优势。
  2. 掌握继承的使用方法。
  3. 了解继承后成员变量和成员方法的访问特点。
  4. 掌握方法重写及其应用场景。
  5. 学会使用this关键字调用当前对象的成员。
  6. 学会使用super关键字调用父类的成员。
  7. 定义抽象方法和抽象类。
  8. 重写抽象方法。

第一章:继承

1. 什么是继承

继承是一种代码复用机制,通过将共通代码抽取到父类中,子类可以直接继承父类的功能。在Java中,使用extends关键字实现继承。

注意点:

  • 子类可以继承父类的非私有成员,但不能访问私有成员。
  • 构造方法不能被继承。

学习继承:

  • 应从能否“使用”的角度来学习继承,而非“拥有”。
    在这里插入图片描述

2. 继承如何使用

定义一个父类,将重复代码放入其中。然后,定义子类继承父类,通过extends关键字。创建子类对象后,可以直接使用父类中的非私有成员。

public class Employee {String name;int age;public void work(){System.out.println("工作");}private void eat(){System.out.println("员工要干饭");}
}public class Teacher extends Employee{}public class Manager extends Employee{
}

3. 继承中,成员变量和成员方法的访问特点

成员变量
  • 不重名情况: 子类和父类可以拥有同名成员变量,但访问时会根据对象类型决定访问哪个变量。
public class Fu {int numFu = 100;
}public class Zi extends Fu{int numZi = 10;
}public class Test01 {public static void main(String[] args) {Fu fu = new Fu();System.out.println(fu.numFu);//父类中的numFuZi zi = new Zi();System.out.println(zi.numZi);System.out.println(zi.numFu);//继承了父类,可以使用父类中非私有成员}
}
  • 重名情况: 当子类和父类成员变量重名时,访问时会优先使用子类的成员变量,如果子类没有,则访问父类的成员变量。
public class Fu {int numFu = 100;int num = 10000;
}public class Zi extends Fu{int numZi = 10;int num = 1000;
}
成员方法
  • 方法调用:new的对象是谁,优先调用谁的方法。如果子类没有该方法,则会寻找父类中的方法。
public class Fu {public void methodFu(){System.out.println("我是父类中的methodFu");}public void method(){System.out.println("我是父类中的method方法");}
}public class Zi extends Fu{public void methodZi(){System.out.println("我是子类中的methodZi方法");}public void method(){System.out.println("我是子类中的method方法");}
}

4. 方法的重写

方法重写是指子类中有一个与父类方法名和参数列表相同的方法。使用@Override注解可以检测是否为重写方法。

注意事项:

  1. 子类重写父类方法之后,权限必须要保证大于等于父类权限(权限指的是访问权限)
    public -> protected -> 默认 -> private
  2. 子类方法重写父类方法,方法名和参数列表要一样
  3. 私有方法不能被重写,构造方法不能被重写,静态方法不能被重写
  4. 子类重写父类方法之后,返回值类型应该是父类方法返回值类型的子类类型
public class Fu {public void methodFu(){System.out.println("我是父类中的methodFu方法");}public void method(){System.out.println("我是父类中的method方法");}void method01(){}/* public static void method02(){}*/public Fu method03(){return null;}
}
public class Zi extends Fu{public void methodZi(){System.out.println("我是子类中的methodZi方法");}@Overridepublic void method(){System.out.println("我是子类中的method方法");}@Overridepublic void method01(){}/* public static void method02(){}*/@Overridepublic Zi method03(){return null;}
}

使用场景: 功能升级改造,子类需要对父类中已经实现好的功能进行重新改造

public class Fu {public void methodFu(){System.out.println("我是父类中的methodFu方法");}public void method(){System.out.println("我是父类中的method方法");}
}public class Zi extends Fu{public void methodZi(){System.out.println("我是子类中的methodZi方法");}@Overridepublic void method(){System.out.println("我是子类中的method方法");}
}

在这里插入图片描述

第二章:superthis

1. 继承中构造方法的特点

  • 当创建子类对象时,会先初始化父类,即执行父类的构造方法。
public class Fu {public Fu(){System.out.println("我是父类中的无参构造");}
}public class Zi extends Fu{public Zi(){super();System.out.println("我是子类中的无参构造");}public Zi(int i){super();System.out.println("我是子类中的有参构造");}
}

2. superthis的具体使用

super
  • 调用父类构造方法: 在子类构造方法中使用super()调用父类无参构造,或使用super(实参)调用父类有参构造。
  • 调用父类成员变量和方法: 使用super.成员变量名super.成员方法名(实参)
public class Fu {int num = 10;public Fu(){System.out.println("我是父类中的无参构造");}public Fu(int data){System.out.println("我是父类中的有参构造");}public void method(){System.out.println("我是父类中的method方法");}
}public class Zi extends Fu{int num = 100;public Zi(){super();System.out.println("我是子类中的无参构造");}public Zi(int num){super(10);System.out.println("我是子类中的有参构造");}public void method(){super.method();System.out.println("我是子类中的method方法");System.out.println(num);System.out.println(super.num);}
}
this
  • 调用当前对象的构造方法: 在构造方法中使用this()调用当前对象的无参构造,或使用this(实参)调用当前对象的有参构造。
  • 调用当前对象的成员变量和方法: 使用this.成员变量名this.成员方法名(实参)
public class Person {int num = 10;public Person(){this();System.out.println("我是Person中的无参构造");}public Person(int data){this();System.out.println("我是Person中的有参构造");}public void method(){int num = 20;System.out.println(num);System.out.println(this.num);this.method01();System.out.println("我是Person类中的method方法");}public void method01(){System.out.println("我是Person类中的method01方法");}
}

3. 继承的特点

  • Java只支持单继承,不支持多继承。
  • 继承支持多层继承。
  • 一个父类可以有多个子类。
  • 构造方法、私有方法和静态方法不能被继承或重写。

第三章:抽象

在这里插入图片描述

1. 抽象的介绍

抽象类和抽象方法是面向对象编程中用来表达共性和多样性的工具。抽象方法没有具体实现,必须在子类中重写。

关键字:

  • abstract用于定义抽象方法和抽象类。

注意事项:

  • 抽象方法所在的类必须是抽象类。
  • 子类必须重写父类中的所有抽象方法,除非子类也是抽象类。
  • 抽象类不能被直接实例化,只能通过子类对象来调用重写的方法。
public abstract class Animal {public abstract void eat();public abstract void drink();
}public class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗啃骨头");}@Overridepublic void drink() {System.out.println("狗喝水");}
}

2. 抽象的注意事项

  • 抽象类不能直接创建对象,只能创建非抽象子类的对象。
  • 抽象类中可以包含成员变量、构造方法和成员方法。
public abstract class Employee {private String name;private int age;public Employee() {}public Employee(String name, int age) {this.name = name;this.age = 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 abstract void work();
}

第四章:综合案例

在这里插入图片描述

本章节通过一个IT公司的员工体系案例,展示了如何定义类、指定继承关系,并实现工作方法的调用。

案例描述:
某IT公司根据员工的工作内容,划分了不同的部门和职位。每个员工都有员工编号和姓名,并执行他们负责的工作。

类的定义和继承关系:

  • Employee:基类,包含员工编号和姓名。
  • Developer:抽象类,继承自Employee,代表研发部员工。
  • JavaEEAndroid:具体类,继承自Developer,代表不同的研发工程师。
  • Maintainer:抽象类,继承自Employee,代表维护部员工。
  • NetworkHardware:具体类,继承自Maintainer,代表不同的维护工程师。

对象创建和方法调用:
通过创建具体工程师类的对象,调用work方法,展示每个员工的工作内容。

public abstract class Employee {private int id;private String name;public Employee() {}public Employee(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void work();
}public abstract class Developer extends Employee{
}public class JavaEE extends Developer{@Overridepublic void work() {System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"正在开发网站");}
}public class Android extends Developer{@Overridepublic void work() {System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"正在开发app");}
}public class Test01 {public static void main(String[] args) {JavaEE javaEE = new JavaEE();javaEE.setId(1);javaEE.setName("涛哥");javaEE.work();System.out.println("===============");Android android = new Android();android.setId(2);android.setName("金莲");android.work();}
}

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

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

相关文章

随手记:小程序兼容后台的wangEditor富文本配置链接

场景&#xff1a; 在后台配置wangEditor富文本&#xff0c;可以文字配置链接&#xff0c;图片配置链接&#xff0c;产生的json格式为&#xff1a; 例子&#xff1a; <h1><a href"https://uniapp.dcloud.net.cn/" target"_blank"><span sty…

6.8 Newman自动化运行Postman测试集

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 1 安装Node.js2 安装Newman3 使用Newman运行Postman测试集3.1 导出Postman集合3.2 使用Newman运行集合3.3 Newman常用参数3.4 Newman报告格式 4 使用定时任务自动化执行脚本4.1 编写B…

工具环境 | 工具准备

搭建一套验证环境需要的工具如下&#xff1a; 虚拟机&#xff1a;推荐virtualbox ubuntu VM好用&#xff0c;但是免费的好像木有了&#xff0c;ubuntu界面版更加容易上手。 网上找安装教程即可&#xff0c;注意实现文件共享、复制粘贴等功能。 EDA&#xff1a;VCS Veridi 工…

计算机网络之王道考研读书笔记-2

第 2 章 物理层 2.1 通信基础 2.1.1 基本概念 1.数据、信号与码元 通信的目的是传输信息。数据是指传送信息的实体。信号则是数据的电气或电磁表现&#xff0c;是数据在传输过程中的存在形式。码元是数字通信中数字信号的计量单位&#xff0c;这个时长内的信号称为 k 进制码…

ROS2学习配套C++知识

第3章 订阅和发布——话题通信探索 3.3.1 发布速度控制海龟画圆 std::bind cstd::bind绑定成员函数时&#xff0c;需要加上作用域以及取址符号 因为不会将成员函数隐式的转换成指针&#xff0c;因此需要加&符号&#xff1b; 后面的第一个参数必须跟具体对象&#xff0c;c…

法规标准-C-NCAP评测标准解析(2024版)

文章目录 什么是C-NCAP&#xff1f;C-NCAP 评测标准C-NCAP评测维度三大维度的评测场景及对应分数评星标准 自动驾驶相关评测场景评测方法及评测标准AEB VRU——评测内容(测什么&#xff1f;)AEB VRU——评测方法(怎么测&#xff1f;)车辆直行与前方纵向行走的行人测试场景&…

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书正式赛题

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书-A 目录 一、竞赛阶段 二、竞赛任务书内容 &#xff08;一&#xff09;拓扑图 &#xff08;二&#xff09;模块A 基础设施设置与安全加固(200分) &#xff08;三&#xff09;B模块安全事件响应/网络安全数据取证/…

mlr3机器学习AUC的置信区间提取

如果你在mlr3拿到机器学习的预测数据 ROC 过程原理探索 假设数据 df <- data.frame(Airis$Sepal.Length, groupsample(x c(0,1),size 150,replace T)) 分组为 0,1 # 变量A为连续性变量 library(pROC) roc_obj <- roc(df g r o u p , d f group, df group,dfA, le…

Halcon例程代码解读:安全环检测(附源码|图像下载链接)

安全环检测核心思路与代码详解 项目目标 本项目的目标是检测图像中的安全环位置和方向。通过形状匹配技术&#xff0c;从一张模型图像中提取安全环的特征&#xff0c;并在后续图像中识别多个实例&#xff0c;完成检测和方向标定。 实现思路 安全环检测分为以下核心步骤&…

Java——多线程进阶知识

目录 一、常见的锁策略 乐观锁VS悲观锁 读写锁 重量级锁VS轻量级锁 总结&#xff1a; 自旋锁&#xff08;Spin Lock&#xff09; 公平锁VS非公平锁 可重入锁VS不可重入锁 二、CAS 何为CAS CAS有哪些应用 1&#xff09;实现原子类 2&#xff09;实现自旋锁 CAS的ABA…

ubuntu18.04升级到ubuntu20.04

为了使用qt6&#xff0c;在ubuntu18.04上各种折腾失败&#xff0c;无奈只能升级到ubuntu20.04, 按照网上的教程没成功。自己摸索了 lsb_release -a df -h sudo apt update sudo apt upgrade -y sudo apt dist-upgrade -y sudo apt autoremove -y sudo apt clean sudo apt inst…

【Blender】【源码详解】BLI_mesh_boolean 实现详解

1. 背景&#xff1a; 最近因为项目需要&#xff0c;需要阅读 Blender 中关于 mesh boolean 的源码&#xff1b;因此&#xff0c;对 blender 中的 mesh boolean 源码进行解读&#xff1b; Github 上源码下载很慢&#xff0c;一般使用 Gitee: gitee Blender 源码 2. Mesh Boole…

qcow2镜像大小压缩

本文拟对qcow2进行压缩进行简单介绍 背景 qcow2镜像在使用一段时间后&#xff0c;总是会不断膨胀变大&#xff0c;所以在导出分享时一般都需要进行压缩以缩减占用空间。 清除空洞 qcow2方式也有稀疏的问题&#xff0c;在磁盘级别上看&#xff0c;镜像会有大量连续的相同空洞…

达梦 本地编码:PG_GBK, 导入文件编码:PG_UTF8错误

问题 达梦 本地编码&#xff1a;PG_GBK, 导入文件编码&#xff1a;PG_UTF8错误 解决 右键管理服务器 查看配置 新建一个数据库实例&#xff0c;配置跟之前的保持一致 新建一个用户&#xff0c;跟以前的用户名一样 在用户上&#xff0c;右键导入&#xff0c;选择dmp的位置 导…

深度学习卷积神经网络CNN之MobileNet模型网络模型详解说明(超详细理论篇)

1.MobileNet背景 2.MobileNet V1论文 3. MobileNett改进史 4. MobileNet模型结构 5. 特点&#xff08;超详细创新、优缺点及新知识点&#xff09; 一、MobileNet背景 随着移动设备的普及&#xff0c;深度学习模型的应用场景逐渐扩展至移动端和嵌入式设备。然而&#xff0c;传统…

垂起固定翼无人机大面积森林草原巡检技术详解

垂起固定翼无人机大面积森林草原巡检技术是一种高效、精准的监测手段&#xff0c;以下是对该技术的详细解析&#xff1a; 一、垂起固定翼无人机技术特点 垂起固定翼无人机结合了多旋翼和固定翼无人机的优点&#xff0c;具备垂直起降、飞行距离长、速度快、高度高等特点。这种无…

kubernates实战

使用k8s来部署tomcat 1、创建一个部署&#xff0c;并指定镜像地址 kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre82、查看部署pod状态 kubectl get pods # 获取default名称空间下的pods kubectl get pods --all-namespaces # 获取所有名称空间下的pods kubect…

数据挖掘之认识数据

在数据挖掘过程中&#xff0c;数据的认识是非常重要的一步&#xff0c;它为后续的数据分析、建模、特征选择等工作奠定基础。以鸢尾花数据集&#xff08;Iris Dataset&#xff09;数据集之鸢尾花数据集&#xff08;Iris Dataset&#xff09;-CSDN博客为例&#xff0c;下面将介绍…

Java 优化springboot jar 内存 年轻代和老年代的比例 减少垃圾清理耗时 如调整 -XX:NewRatio

-XX:NewRatio 是 Java Virtual Machine (JVM) 的一个选项&#xff0c;用于调整 年轻代&#xff08;Young Generation&#xff09;和 老年代&#xff08;Old Generation&#xff09;之间的内存比例。 1. 含义 XX:NewRatioN 用于指定 老年代 与 年轻代 的内存比例。 N 的含义&…

统信UOS 1071 AI客户端接入本地大模型配置手册

文章来源&#xff1a;统信UOS 1071本地大模型配置手册 | 统信软件-知识分享平台 1. OS版本确认 1.1. 版本查看 要求&#xff1a;计算机&#xff0c;属性&#xff0c;查看版本&#xff08;1070,构建号> 101.100&#xff09; 2. UOS AI版本确认 UOS AI&#xff0c;设置&am…