【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.rhkb.cn/news/493994.html

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

相关文章

高效准确的PDF解析工具,赋能企业非结构化数据治理

目录 准确性高:还原复杂版面元素 使用便捷:灵活适配场景 贴心服务:快速响应机制 在数据为王的时代浪潮中,企业数据治理已成为组织优化运营、提高竞争力的关键。随着数字化进程的加速,企业所积累的数据量呈爆炸式增长…

Unity全局雾效

1、全局雾效是什么 全局雾效(Global Fog)是一种视觉效果,用于在3D场景中模拟大气中的雾气对远处物体的遮挡 它通过在场景中加入雾的效果,使得距离摄像机较远的物体看起来逐渐被雾气覆盖,从而创造出一种朦胧、模糊的视…

解决Apache/2.4.39 (Win64) PHP/7.2.18 Server at localhost Port 80问题

配置一下apache里面的配置文件:httpd.conf 和 httpd.vhosts.conf httpd.conf httpd-vhosts.conf 重启服务 展示: 浏览器中中文乱码问题:

【Spring事务】深入浅出Spring事务从原理到源码

什么是事务 保证业务操作完整性的一种数据库机制 (driver 驱动)事务特定 ACID A 原子性 (多次操作 要不一起成功 要不一起失败 (部分失败 savepoint)) C 一致性 (事务开始时数据状态&#xff0c…

MFC/C++学习系列之简单记录13

MFC/C学习系列之简单记录13 前言memsetList Control代码注意 总结 前言 今天记录一下memset和List control 的使用吧! memset memset通常在初始化变量或清空内存区域的时候使用,可以对变量设定特定的值。 使用: 头文件: C&#…

C# cad启动自动加载启动插件、类库编译 多个dll合并为一个

可以通过引用costura.fody的包,编译后直接变为一个dll 自动加载写入注册表、激活码功能: 【CAD二次开发教程-实例18-启动加载与自动运行-哔哩哔哩】 https://b23.tv/lKnki3f https://gitee.com/zhuhao1912/cad-atuo-register-and-active

Android Studio AI助手---Gemini

从金丝雀频道下载最新版 Android Studio,以利用所有这些新功能,并继续阅读以了解新增内容。 Gemini 现在可以编写、重构和记录 Android 代码 Gemini 不仅仅是提供指导。它可以编辑您的代码,帮助您快速从原型转向实现,实现常见的…

固定电话采用的是模拟信号还是数字信号?如果通话两端采用不同的信号会发生什么?

固定电话信号大揭秘:模拟与数字信号的纠缠 模拟信号 VS 数字信号:谁是电话界的“老江湖”? 固定电话采用的是模拟信号还是数字信号? 这其实取决于接入方式: 铜线接入:传统方式,使用模拟电信号…

<项目代码>YOLO Visdrone航拍目标识别<目标检测>

项目代码下载链接 <项目代码>YOLO Visdrone航拍目标识别<目标检测>https://download.csdn.net/download/qq_53332949/90163918YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一…

druid与pgsql结合踩坑记

最近项目里面突然出现一个怪问题,数据库是pgsql,jdbc连接池是alibaba开源的druid,idea里面直接启动没问题,打完包放在centos上和windows上cmd窗口都能直接用java -jar命令启动,但是放到国产信创系统上就是报错&#xf…

LabVIEW电机控制中的主动消抖

在LabVIEW电机控制系统中,抖动现象(如控制信号波动或机械振动)会影响系统的稳定性和精度。通过使用主动消抖算法,可以有效降低抖动,提高控制性能。本文将介绍几种主流的主动消抖算法,并结合具体应用案例进行…

Vue CLI 脚手架创建项目流程详解 (2)

更新 CLI 脚手架 确保你安装的是最新版本的 Vue CLI,以支持最新的特性及改进。你可以通过以下命令全局安装或更新 Vue CLI: npm install -g vue/cli创建 Vue 3.x 项目 启动创建向导 使用 vue create 命令来开始创建一个新的 Vue 项目: vue …

macos 隐藏、加密磁盘、文件

磁盘加密 打开磁盘工具 点击添加 设置加密参数 设置密码 查看文件 不用的时候右键卸载即可使用的时候装载磁盘,并输入密码即可 修改密码 解密 加密,输入密码即可 禁止开机自动挂载此加密磁盘 如果不禁止自动挂载磁盘,开机后会弹出输入…

Chapter 19 Layout and Packaging

Chapter 19 Layout and Packaging 这一章我们介绍版图和封装, 关注模拟和数字电路的要求. 首先讲模拟电路中layout设计考虑, 然后解决衬底coupling问题, 最后描述封装问题, 分析IC的外部电容和电感问题. 19.1 General Layout Considerations 19.1.1 Design Rules Minimum W…

c++ ------语句

一、简单语句 简单语句是C中最基本的语句单元,通常以分号(;)结尾,用于执行一个单一的操作。常见的简单语句类型有: 表达式语句:由一个表达式后面加上分号构成,用于计算表达式的值或者执行具有…

OpenResty、Lua介绍认识

文章目录 官网网址openrestry介绍OpenResty 的关键特性包括:应用场景:Lua 在 OpenResty 中的应用 安装openrestry简单实验下 官网网址 开源版在线文档和支持 商业版支持 什么是Lua 学习Lua语法 每篇一问:什么是编译型语言,什么是…

Flutter组件————Container

Container Container 是 Flutter 中最常用的布局组件之一 参数 参数名称类型描述alignmentAlignmentGeometry定义子组件在其内部的对齐方式,默认为 null,即不改变子组件的位置。paddingEdgeInsetsGeometry内边距,用于在子组件周围添加空间…

36. Three.js案例-创建带光照和阴影的球体与平面

36. Three.js案例-创建带光照和阴影的球体与平面 实现效果 知识点 Three.js基础 WebGLRenderer WebGLRenderer 是Three.js中最常用的渲染器,用于将场景渲染到网页上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersobject可选参数&#…

vue2 - Day03 - (生命周期、组件、组件通信)

文章目录 一、生命周期1. 创建阶段2. 挂载阶段3. 更新阶段4. 销毁阶段5. 错误捕获总结 二、组件2.1 注册1. 全局注册 - 公共的组件。2. 局部注册总结 2.2 三大重要的组成部分1. 模板 (Template)主要功能:说明: 2. 脚本 (Script)主要功能:说明…

移动0 - 简单

************* C topic:283. 移动零 - 力扣(LeetCode) ************* Hello, hows your weekend. during my learning, topic about array perplex me. Just do it. Inspect the topic: It is a easy one but not easy for me now bec…