学习笔记——《Java面向对象程序设计》-继承
参考教材:
Java面向对象程序设计(第3版)微课视频版 清华大学出版社
1、定义子类
class 子类名 extends 父类名{......
}如:
class Student extends People{......
}
(1)如果一个类的声明中没有extends关键字,这个类被系统默认为是Object的子类。Object是java.lang包中的类。
(2)除了Object类,任何(子)类有且仅有一个父类。
如 class Student extends People,Person语法错误。
2、子类的继承性
(1)类可以有两种重要的成员:成员变量和成员方法。
子类中的成员变量或方法有一部分是子类自己声明的;另一部分是从父类继承的。
(2)什么叫继承呢?
子类继承父类的成员变量:像在子类中直接声明,可以被子类中自己定义的任何实例方法操作;
子类继承父类的方法:像在子类中直接声明,可以被子类中自己定义的任何实例方法调用;
也就是说,如果子类中定义的实例方法不能操作父类的某个成员变量或方法,那么该成员变量或方法就没有被子类继承。
(3)子类和父类在同一个包中的继承性
继承父类中不是private的成员变量或方法作为自己的成员变量或方法(继承protected、public、友好的变量及方法);继承的成员变量和方法的访问权限保持不变;
(4)子类和父类不在同一个包中的继承性
子类继承父类的protected、public成员变量或方法;继承的成员变量和方法的访问权限保持不变;
子类不能继承父类的友好变量和友好方法。
public class People {int age;String country;String sex;protected String workType;private String idcard;People(){System.out.println("调用People类的无参构造函数!");}
}class Worker extends People{ String position;public static void main(String[] args) {Worker one = new Worker();one.age = 10;one.country = "China";one.workType = "worker";//one.idcard = "123456"; //×,在同一个包中,不继承private变量 }
}
package eight;
public class People1 {int age;String country;public String sex;protected String workType;private String idcard;public People1(){System.out.println("调用People类的无参构造函数!");}
}package object.oriented;
import eight.People1;class Teacher extends People1{public static void main(String[] args) {Teacher two = new Teacher();two.sex = "male"; //√,子类继承父类的public成员变量//two.age = 10; //×,不在同一个包中时,不继承友好变量two.workType = "student"; //√,不在同一个包中时,可继承protected变量}
}
注意:
无论是否在一个包中,均可继承protected、public变量及方法;
只有在同一个包中,子类才可继承友好变量及友好方法;
3、子类对象的构造过程
构造过程:用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法,也就是说,如果子类的构造方法中没有明显地指明使用父类的哪个构造方法,子类就调用父类中不带参数的构造方法。(super关键字)
子类对象的特点:
(1)用子类创建对象时,不仅子类中声明的成员变量被分配了内存
(2)父类的成员变量也都分配了内存空间,但只将其中一部分(子类继承的那部分)作为分配给子类对象的变量。
(3)子类中还有一部分方法是从父类继承的,这部分方法却可以操作这部分未继承的变量。
4、成员变量的隐藏和方法重写
成员变量的隐藏
对于子类可以从父类继承的成员变量,只要子类中声明的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量;
需要注意:子类对象可以调用从父类继承的方法操作隐藏的成员变量
package object.oriented;class People1 {public double x; // 父类的double类型成员变量xpublic void setX(double x) {this.x = x; // 设置父类的x}public double getDoubleX() {return x; // 返回父类的double x}
}class Student1 extends People1 {int x; // 子类定义int类型x,隐藏父类的double xpublic int getX() {return x; // 返回子类的int x}
}public class Example5_3 {public static void main(String args[]) {Student1 stu = new Student1();stu.x = 98; // 合法:操作子类的int xSystem.out.println("对象stu的x的值是:" + stu.getX()); // 输出98// stu.x = 98.98; // 非法:子类x是int,不能赋double值stu.setX(98.98); // 合法:调用父类的setX方法,设置父类的double xSystem.out.println("父类的x的值是:" + stu.getDoubleX()); // 输出98.98System.out.println("子类的x的值是:" + stu.x); // 输出98(未被修改)}
}
方法重写
子类通过重写可以隐藏已继承的实例方法(方法重写也被称为方法覆盖)。如果子类可以继承父类的某个实例方法,那么子类就有权利重写这个方法;
重写:子类中定义一个方法,这个方法的类型和父类方法的类型一致,或父类的方法类型的子类型,且方法名、参数个数、参数类型和父类的方法完全相同。
(子类型是指:如果父类的方法类型是“类”,那么允许子类的重写方法类型是“子类”)
重写方法既可以操作继承的成员变量,也可以操作子类新声明的成员变量。(不能操作隐藏的成员变量)
重写父类的方法时,不可以降低方法的访问权限。
class AA{double f(float x,float y) {return x+y;}public int g(int x,int y) {return x+y;}
}class BB extends AA{double f(float x,float y) {return x*y;}
}public class Example5_4 {public static void main(String[] args) {BB b = new BB();double result = b.f(5, 6); //b调用重写的方法System.out.println("调用重写方法得到的结果:"+ result);int m = b.g(3, 5);System.out.println("调用继承方法得到的结果:"+ m);}
}
5、super关键字
(1)在子类中,想使用被子类隐藏的成员变量或方法就可以使用super关键字。
// 定义Animal类
class Animals { String name = "牧羊犬";//定义动物叫的方法 void shout() { System.out.println("动物发出叫声");}
}// 定义Dog类继承动物类
class Dogs extends Animals { //重写父类Animal中的shout()方法,扩大了访问权限public void shout() { super.shout(); //调用父类中的shout()方法System.out.println("汪汪汪……"); }public void printName(){//调用父类中的name属性System.out.println("名字:"+super.name); }
}public class Example05 {public static void main(String[] args) {Dogs dog = new Dogs(); // 创建Dog类的实例对象dog.shout(); // 调用dog重写的shout()方法dog.printName(); // 调用Dog类中的printName()方法}}
(2)使用super调用父类的构造方法
子类不继承父类的构造方法;
子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用super关键字来表示,而且super必须是子类构造方法的第一条语句。
public class Student {int number;String name;Student(){}Student(int number,String name){this.number=number;this.name=name;}public int getNumber() {return number;}public String getName() {return name;}
}public class UniverStudent extends Student{boolean isMarriage;UniverStudent(int number,String name,boolean b){super(number,name); //调用父类的构造方法}public boolean getIsMarriage() {return isMarriage;}
}
(3)使用super操作被隐藏的成员变量和方法
子类想使用被子类隐藏的成员变量或方法,就可以使用super关键字。
当super调用隐藏的方法时,该方法中出现的成员变量是指被隐藏的成员变量。
6、final关键字
final的英文意思是“最终”。在Java中,可以使用final关键字声明类、属性、方法,在声明时需要注意以下几点:
(1)使用final修饰的类不能有子类,即不能被继承。
(2)使用final修饰的方法不能被子类重写。
(3)使用final修饰的变量(成员变量和局部变量)是常量,常量不可修改。
Java中的类被final关键字修饰后,该类将不可以被继承,即不能够派生子类。
// 使用final关键字修饰Animal类
final class Animal {
}
// Dog类继承Animal类
//class Dog extends Animal //类被final关键字修饰后,该类将不可以被继承
//{
//}public class Example07 {public static void main(String[] args) {}
}
当一个类的方法被final关键字修饰后,这个类的子类将不能重写该方法。
Java中被final修饰的变量是为常量,常量只能在声明时被赋值一次,在后面的程序中,其值不能被改变。如果再次对该常量赋值,则程序会在编译时报错。
在使用final声明变量时,要求全部的字母大写。如果一个程序中的变量使用public static final声明,则此变量将成为全局变量,如下面代码所示。 public static final String NAME = "哈士奇";
public class Example09 {public static void main(String[] args) {final int AGE = 18; // 第一次可以赋值AGE = 20; // 再次赋值会报错}}
7、对象的上转型对象
假设,A类是B类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,比如:
A a;
a = new B();
//或
A a;
B b = new B();
a = b;
//这时,称对象a是对象b的上转型对象。
class Animal {
}public class Tiger extends Animal{public static void main(String[] args) {Animal a;Tiger b = new Tiger();a = b;}
}
对象的上转型的实体是由子类负责创建的,但上转型对象会失去源对象的一些属性和功能。
(1)上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能调用子类新增的方法(失掉了一些功能)
(2)上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类的重写方法。
上转型对象操作子类继承的方法或子类重写的方法,其作用等价于子类对象去调用这些方法。
因此,如果子类重写了父类的某个方法后,当对象的上转型对象调用这个方法时一定是调用了子类重写的方法。
class Anthropoid {double m = 12.58;void crySpeak(String s) {System.out.println(s);}}class People extends Anthropoid{char m = 'A';int n = 60;void computer(int a,int b) {int c = a+b;System.out.println("a+b的和为"+c);}void crySpeak(String s) {System.out.println(m+"**"+s+"**"+m);}}public class Example5_9{public static void main(String args[]) {People person = new People();Anthropoid monkey = person; //monkey是person对象的上转型对象monkey.crySpeak("I love this game"); //等同于person调用重写的crySpeak方法//monkey.n = 100; //非法,因为n是子类新增的成员变量//monkey.computer(12,19); //非法,因为computer()是子类新增的方法System.out.println(monkey.m); //操作隐藏的m,不等同于person.mSystem.out.println(person.m); //操作子类的mPeople zhang = (People)monkey; //将上转型对象强制转化为子类的对象zhang.computer(55, 33); //zhang是子类的对象zhang.m = 'T';System.out.println(zhang.m);}
}
相关文章:
学习笔记——《Java面向对象程序设计》-继承
参考教材: Java面向对象程序设计(第3版)微课视频版 清华大学出版社 1、定义子类 class 子类名 extends 父类名{...... }如: class Student extends People{...... } (1)如果一个类的声明中没有extends关…...
鸿蒙生态新利器:华为ArkUI-X混合开发框架深度解析
鸿蒙生态新利器:华为ArkUI-X混合开发框架深度解析 作者:王老汉 | 鸿蒙生态开发者 | 2025年4月 📢 前言:开发者们的新机遇 各位鸿蒙开发者朋友们,是否还在为多平台开发重复造轮子而苦恼?今天给大家介绍一位…...
如何收集用户白屏/长时间无响应/接口超时问题
想象一下这样的场景:一位用户在午休时间打开某电商应用,准备购买一件心仪已久的商品。然而,页面加载了数秒后依然是一片空白,或者点击“加入购物车”按钮后没有任何反馈,甚至在结算时接口超时导致订单失败。用户的耐心被迅速消耗殆尽,关闭应用,转而选择了竞争对手的产品…...
信号调制与解调技术基础解析
调制解调技术是通信系统中实现基带信号与高频载波信号相互转换的主要技术,通过调整信号特性使其适应不同信道环境,保障信息传输的效率和可靠性。 调制与解调的基本概念 调制(Modulation) 将低频基带信号(如语音或数…...
[PTA]2025 CCCC-GPLT天梯赛 胖达的山头
来源:L2-055 胖达的山头-Pintia题意:给定 n n n 个事件的起始和终止时刻(以hh:mm:ss给出),求最多并行事件数。关键词:差分(签到,模板题)题解:将所有时刻转换为秒,当某事件开始1,结束则-1。按时…...
基于Spring Cloud 2023.0.x + Micrometer Tracing的分布式链路追踪详细解析
前言 在微服务架构中,复杂的调用链路常让问题排查如大海捞针。Spring Cloud 2023.0.x整合Micrometer Tracing,深度支持OpenTelemetry标准,为开发者提供了轻量、高效的分布式链路追踪能力。本文将深入解析从TraceID透传到可视化分析的全流程实现,结合最新技术栈代码…...
【扫描件批量改名】批量识别扫描件PDF指定区域内容,用识别的内容修改PDF文件名,基于C++和腾讯OCR的实现方案,超详细
批量识别扫描件PDF指定区域内容并重命名文件方案 应用场景 本方案适用于以下场景: 企业档案数字化管理:批量处理扫描的合同、发票等文件,按内容自动分类命名财务票据处理:自动识别票据上的关键信息(如发票号码、日期)用于归档医疗记录管理:从扫描的检查报告中提取患者I…...
LOH 怎么进行深度标准化?
The panel of normals is applied by replacing the germline read depth of the sample with the median read depth of samples with the same genotype in our panel. 1.解释: panel of normal 正常组织,用于识别技术噪音 germline read depth: 胚系测序深度。根…...
【Python Web开发】01-Socket网络编程01
文章目录 1.套接字(Socket)1.1 概念1.2 类型1.3 使用步骤 Python 的网络编程主要用于让不同的计算机或者程序之间进行数据交换和通信,就好像人与人之间打电话、发消息一样。 下面从几个关键方面通俗易懂地介绍一下: 1.套接字(Socket) 在 Python 网络编…...
序列决策问题(Sequential Decision-Making Problem)
序列决策问题(Sequential Decision-Making Problem)是强化学习(Reinforcement Learning, RL)的核心研究内容,其核心思想是:智能体(Agent)需要在连续的时间步骤中,通过…...
L2-1、打造稳定可控的 AI 输出 —— Prompt 模板与格式控制
一、为什么需要 Prompt 模板? 在与 AI 模型交互时,我们经常会遇到输出不稳定、格式混乱的问题。Prompt 模板帮助我们解决这些问题,通过结构化的输入指令来获得可预测且一致的输出结果。 模板的作用主要体现在: 固定输出格式&am…...
ClickHouse进行LEFT JOIN 关联查询时, 关联键的数据类型不一致,导致报错 的解决方案详解
一.场景 使用golang语言操作ClickHouse数据库进行LEFT JOIN关联查询查询计算: 关联键在不同数据表中的数据类型不一致, 这样SQL语句就会报错, 二.问题 通过上面场景描述, 下面贴出具体的sql语句相关: 表user_phone_bind: 字段UserId(用户id): 类型Int64字段Phone(手机号): 类型…...
LLM中什么是模板定义、提示工程和文档处理链
LLM中什么是模板定义、提示工程和文档处理链 定义提示模板(prompt_template):prompt_template = """Use the following pieces of context to answer the question at the end. If you dont know the answer, just say that you dont know, dont try to make…...
密码学(二)流密码
2.1流密码的基本概念 流密码的基本思想是利用密钥 k 产生一个密钥流...,并使用如下规则对明文串 ... 加密:。密钥流由密钥流发生器产生: ,这里是加密器中的记忆元件(存储器)在时刻 i 的状态,…...
深度学习与总结JVM专辑(七):垃圾回收器—CMS(图文+代码)
CMS垃圾收集器深度解析教程 1. 前言:为什么需要CMS?2. CMS 工作原理:一场与时间的赛跑2.1. 初始标记(Initial Mark)2.2. 并发标记(Concurrent Mark)2.3. 重新标记(Remark)…...
力扣第446场周赛
有事没赶上, 赛后模拟了一下, 分享一下我的解题思路和做题感受 1.执行指令后的得分 题目链接如下:力扣 给你两个数组:instructions 和 values,数组的长度均为 n。 你需要根据以下规则模拟一个过程: 从下标 i 0 的第一个指令开…...
OpenCV中的透视变换方法详解
文章目录 引言1. 什么是透视变换2. 透视变换的数学原理3. OpenCV中的透视变换代码实现3.1 首先定义四个函数 3.1.1 cv_show() 函数 3.1.2 def resize() 函数 3.1.3 order_points() 函数 3.1.4 four_point_transform() 函数 3.2 读取图片并做预处理3.3 轮廓检测3.4 获取最大…...
并发设计模式实战系列(3):工作队列
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第三章工作队列(Work Queue),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …...
如何理解抽象且不易理解的华为云 API?
API的概念在华为云的使用中非常抽象,且不容易理解,用通俗的语言 形象的比喻来讲清楚——什么是华为云 API,怎么用,背后原理,以及主要元素有哪些,尽量让新手也能明白。 🧠 一句话先理解…...
10分钟二叉树的非递归排序完成
import java.util.Stack;public class test_04_23 {//二叉树的三种遍历static class TreeNode{int data;TreeNode left;TreeNode right;public TreeNode(int data){this.data data;}}//先序遍历public static void test1(TreeNode root){Stack<TreeNode> stack new Sta…...
[特殊字符]fsutil命令用法详解
🔧fsutil命令用法详解 以下是 fsutil 命令的常见用法及功能详解: 1. 基础语法 fsutil [子命令] [参数]2. 核心功能与用法 (1)管理硬链接 fsutil hardlink create <新硬链接路径> <原文件路径>作用:为文…...
GPIO(通用输入输出端口)详细介绍
一、基本概念 GPIO(General - Purpose Input/Output)即通用输入输出端口,是微控制器(如 STM32 系列)中非常重要的一个外设。它是一种软件可编程的引脚,用户能够通过编程来控制这些引脚的输入或输出状态。在…...
深度学习-全连接神经网络(过拟合,欠拟合。批量标准化)
七、过拟合与欠拟合 在训练深层神经网络时,由于模型参数较多,在数据量不足时很容易过拟合。而正则化技术主要就是用于防止过拟合,提升模型的泛化能力(对新数据表现良好)和鲁棒性(对异常数据表现良好)。 1. 概念认知 …...
Java面向对象的三大特性
## 1. 封装(Encapsulation) 封装是将数据和操作数据的方法绑定在一起,对外部隐藏对象的具体实现细节。通过访问修饰符来实现封装。 示例代码: java public class Student { // 私有属性 private String name; private int age; …...
多路转接select服务器
目录 select函数原型 select服务器 select的缺点 前面介绍过多路转接就是能同时等待多个文件描述符,这篇文章介绍一下多路转接方案中的select的使用 select函数原型 #include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, f…...
系统架构设计师:流水线技术相关知识点、记忆卡片、多同类型练习题、答案与解析
流水线记忆要点 公式 总时间 (n k - 1)Δt 吞吐率 TP n / 总时间 → 1/Δt(max) 加速比 S nk / (n k - 1) | 效率 E n / (n k - 1) 关键概念 周期:最长段Δt 冲突: 数据冲突(RAW) → 旁路/…...
复刻低成本机械臂 SO-ARM100 3D 打印篇
视频讲解: 复刻低成本机械臂 SO-ARM100 3D 打印篇 清理了下许久不用的3D打印机,挤出机也裂了,更换了喷嘴和挤出机夹具,终于恢复了正常工作的状态,接下来还是要用起来,不然吃灰生锈了,于是乎想起…...
AudioRecord 简单分析
基于AudioRecord简单分析,以下是HeadsetMIC tinymix "TX_CDC_DMA_TX_4 Channels" "One" tinymix "TX_AIF2_CAP Mixer DEC0" "1" tinymix "TX DEC0 MUX" "SWR_MIC" tinymix "TX SMIC MUX0" "SWR_…...
Flutter IOS 真机 Widget 错误。Widget 安装后系统中没有
错误信息: SendProcessControlEvent:toPid: encountered an error: Error Domaincom.apple.dt.deviceprocesscontrolservice Code8 "Failed to show Widget com.xxx.xxx.ServerStatus error: Error DomainFBSOpenApplicationServiceErrorDomain Code1 "T…...
Spring之我见 - Spring MVC重要组件和基本流程
核心组件详解 前端控制器 - DispatcherServlet 作用:所有请求的入口,负责请求分发和协调组件。 public class DispatcherServlet extends HttpServlet {// 核心服务方法protected void doService(HttpServletRequest request, HttpServletResponse re…...
