Java 继承

目录

1. 继承概述

2. 继承好处

3. 继承格式

4. 继承规定

5. debug 调试 

6. 方法重写

6.1 概述

6.2 规定

7. super 关键字

7.1 概述

7.2 使用

7.3 在构造器中使用

8. 子类对象实例化的全过程

9. 练习


1. 继承概述

举例:Person 类中有name,age 等属性和方法,而 Couster 类,Student 类,Wait 类也具有相同的属性和方法 ,为了减少代码的冗余,可以使用 extents 关键字从 Person 类中获取并直接使用方法和属性。即为继承;

2. 继承好处

1. 减少代码冗余,提高代码的复用性;

2. 方便功能的扩展;

3. 为后面多态的学习提供前提;

3. 继承格式

格式:Class A extends B {   }

A :子类,派生类;

B:超类,父类,基类;

体现:

(1)子类继承父类,子类就会获得父类的属性和方法,

对于父类私有的属性和方法,子类也可以继承,但不能直接调用;

(2)子类继承父类之后,还可以声明自己独特的属性和方法,实现功能的扩展;

class A{String name;private int age;public A(){};public void setAge(int age){this.age = age;}public int getAge(){return age;}private void show(){System.out.println("快乐一万年");}public void See(){show();}
}class B extends A {public void eat(){System.out.println("这是子类自己生声明的方法");}public static void main(String[] args) {
//     子类 B 会继承父类 A 的结构:属性,方法;B b = new B();b.name="吕小布";System.out.println(b.name);
//      私有属性亦可继承,但不能直接调用,须借助set/get方法b.setAge(100);System.out.println(b.getAge());
//      私有方法也可继承,但不能如此直接调用:b.show()b.See();//通过继承父类公共权限的方法间接调用
//        private void show(){
//            System.out.println("快乐一万年");
//        }
//        public void See(){
//            show();
//        }b.eat();}
}
4. 继承规定

1. Java 中允许多层继承,不允许多重继承;

2. 一个类可以被多个类继承;

3. 单继承性:一个类只有一个父类;

4. 子类直接继承的类称为直接父类,

间接继承的类称为间接父类,

同时也获取了直接父类与间接父类的所有属性和方法;

5. 所有的类都直接继承或间接继承 java.lang.Object 类;

5. debug 调试 

step into 无法进入方法:

6. 方法重写
6.1 概述

子类继承父类的所有属性和方法后,子类可能会根据其需求对父类同名同参的方法的方法体进行修改,进而覆盖夫类的方法,这就是方法重写(override)。

子类调用方法时,会调用子类中重写的方法,父类中的方法被重写方法覆盖;

public class Annimal {public void eat(){System.out.println("生物得吃饭啊");}
}
class dog extends Annimal{
//    方法重写:子类继承父类了方法,又根据其需要修改方法体;public void eat(){System.out.println("狗爱吃骨头");}public static void main(String[] args) {dog d = new dog();d.eat();}
}
6.2 规定

格式:权限修饰符  返回值类型  方法名( 参数列表 ){ 方法体 }

1. 权限修饰符:子类的权限修饰符不得低于父类,但父类的私有方法不可以被重写

2. 返回值类型:子类重写的方法的的返回值类型需要和父类被重写的方法保持一致;

但若父类返回值类型为引用类型,子类返回值类型可以相同,也可以是该引用类型的子类,

如父类返回值类型为 Object ,子类重写的方法的返回值应为 Object 或其子类,如 String 等;

3. 重写方法的方法名与参数列表必须与父类保持一致;

4. 子类重写的方法抛出的异常不大于父类被重写的方法抛出的异常;

5. 子类与父类同名同参的方法要么都声明为 static (无法覆盖,不允许重写),

要么都声明为 非static (允许重写);

在实际使用中,可以将父类被重写的方法直接复制到子类中重写方法的位置,接着修改其方法体即可,一定不会重写方法出错;

7. super 关键字
7.1 概述

继承关系中,子类的属性不会被父类的属性覆盖。

因此,在调用父类、子类重名的属性或者调用父类被重写的方法(也可以认为方法重名)时,为便于区分,需要使用 super 关键字;

即,super 如同 this,解决重名的问题;

7.2 使用

1. super 可修饰属性、方法、构造器;

2. super.属性/方法/构造器 相当于 父类的属性/方法/构造器,即 super == 父类;

class F{int age = 18;String name = "小布";public void eat(){System.out.println("吃东西可以补充营养");}
}
class Z extends F{String name = "吕小布";
//    方法重写public void eat(){System.out.println(super.name);//子类中调用父类的同名属性System.out.println("不可以不吃饭");super.eat();                    //子类中调用父类被重写的方法;}public static void main(String[] args) {Z z = new Z();System.out.println(z.name);//父类,子类的属性不会覆盖;z.eat();
//        吕小布
//                小布
//        不可以不吃饭
//                吃东西可以补充营养}
}
7.3 在构造器中使用

1. 父类属性没有私有化;子类构造器中可以使用 this.

2. 父类属性私有化;子类构造器中可以使用 super 

3. this. 与 super()  只能放在子类构造器的首行;

4. 但是,父类属性非私有化时,this. 与 super() 只能使用其中一个;

5. 子类构造器没有显式的使用 this. 或 super( ) ,则默认使用父类的空参构造器

因此父类的空参构造器一定要写

6. 在子类的多个构造器中,至少有一个构造器使用了 super( ),调用了父类的空参;

8. 子类对象实例化的全过程

从结果上看:子类继承父类,就会获得父类(直接父类与间接父类)所有的方法和属性;

从过程上看:通过子类构造器创建子类的对象时,一定会直接或间接调用父类的构造器,进而调用父类的父类的构造器,一直到 Java.long.Object 为止,获得所有父类(直接和间接父类)的所有属性和方法;

9. 练习

public class Account {private int id;//账号private double balance;//余额private double annualinterestRate;//年利率public Account(){};public Account(int id,double balance,double annualinterestRate){this.id = id;this.balance = balance;this.annualinterestRate = annualinterestRate;}public void setId(int id){this.id = id;}public int getId(){return id;}public void setBalance(double balance){this.balance = balance;}public double getBalance(){return balance;}public void setAnnualinterestRate(double annualinterestRate){this.annualinterestRate = annualinterestRate;}/*返回月利率方法* */public double getMonthlyInterest(){return annualinterestRate/12;}/*取款方法* */public void withdraw(double amount){if(amount <= balance){balance -=amount;System.out.println("取款成功!");}elseSystem.out.println("取款失败!\n"+"余额为"+balance+"元");} /*存款方法* */public void deposit(double sum){balance += sum;System.out.println("存款成功!");}
}class CheckAccount extends Account{private double overdraft;//可透支限额public CheckAccount(int id,double balance,double annualinterestRate,double overdraft){super(id,balance,annualinterestRate);this.overdraft = overdraft;}public void setOverdraft(double overdraft){this.overdraft = overdraft;}public double getOverdraft(){return overdraft;}
//    核心代码均在此重写方法中@Overridepublic void withdraw(double amount){
//       不可以使用 super 调用父类私有的属性,因为 super 解决的是重名问题,并不能解决封装问题;
//       if(amount <= (super.getBalance() + overdraft)){}if(amount <= getBalance()){
//            setBalance(getBalance()-amount);//与下方代码功能相同super.withdraw(amount);//调用父类的方法;}else if(overdraft >= amount-getBalance()){//算术运算符优先级大于逻辑运算符overdraft -=(amount-getBalance());setBalance(0.0);}else System.out.println("超过可透支金额!");}
}class CheckAccountTest{public static void main(String[] args) {CheckAccount ca = new CheckAccount(200022,6000,0.031,1000);ca.withdraw(8000);System.out.println("您的帐户余额:"+ca.getBalance());System.out.println("可透支余额:"+ca.getOverdraft());}
}

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

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

相关文章

CES Asia 2025科技盛宴,AI智能体成焦点

2025第七届亚洲消费电子技术展&#xff08;CES Asia赛逸展&#xff09;将在北京拉开帷幕&#xff0c;AI智能体有望成为展会的核心亮点。 深圳市人工智能行业协会发文表示全力支持CES Asia 2025&#xff08;赛逸展&#xff09;&#xff0c;称其为人工智能领域的创新发展提供了强…

HTMLHTML5革命:构建现代网页的终极指南 - 0. 课程目录设计

结构清晰&#xff0c;层层递进 课程从基础知识&#xff08;如HTML学前必知&#xff09;开始&#xff0c;逐步深入到高级应用&#xff08;如PWA配置和WebApp优化&#xff09;。每个模块都有明确的目标&#xff0c;适合零基础学员逐步掌握HTML。 覆盖范围广 这套课程涵盖了HTM…

大型语言模型(LLM)中的tokens是什么

大型语言模型(LLM)中的tokens是什么 在大型语言模型(LLM)中,tokens是文本处理的基本单位,它可以是一个单词、一个字符、一个标点符号,或者是一个特殊的标记。以下是关于tokens的详细介绍及举例: 一、tokens的定义和作用 定义:tokens是将文本分割成的一个个有意义的…

嵌入式C语言:二维数组

目录 一、二维数组的定义 二、内存布局 2.1. 内存布局特点 2.2. 内存布局示例 2.2.1. 数组元素地址 2.2.2. 内存布局图&#xff08;简化表示&#xff09; 2.3. 初始化对内存布局的影响 三、访问二维数组元素 3.1. 常规下标访问方式 3.2. 通过指针访问 3.2.1. 指向数…

Java进阶-在Ubuntu上部署SpringBoot应用

随着云计算和容器化技术的普及&#xff0c;Linux 服务器已成为部署 Web 应用程序的主流平台之一。Java 作为一种跨平台的编程语言&#xff0c;具有广泛的应用场景。本文将详细介绍如何在 Ubuntu 服务器上部署 Java 应用&#xff0c;包括环境准备、应用发布、配置反向代理&#…

node-sass@4.14.1报错的最终解决方案分享

输入npm i全安装文件所需的依赖的时候&#xff0c;博主是使用sass去书写的&#xff0c;使用的是node-sass4.14.1和sass-loader7.3.1的版本的&#xff0c;安装的时候老是出现错误&#xff0c; node-sass4.14.1版本不再被支持的原因 node-sass 是一个基于 LibSass 的 Node.js 绑…

Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解

文章目录 模式介绍优缺点适用场景结构案例实现注意事项 模式介绍 有时候需要向某些对象发送请求&#xff0c;但是并不知道请求的接收者是谁&#xff0c;也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序&#xff0c;使得请求发送者和请求接收者能够消除彼此…

Vue3初学之组件通信

一起进行学习&#xff1a; 在 Vue 3 中&#xff0c;组件通信是一个非常重要的概念&#xff0c;它决定了如何在父子组件之间、兄弟组件之间以及跨层级组件之间传递数据和事件。以下是 Vue 3 中常见的组件通信方式&#xff1a; 父子组件通信 1.1 父组件向子组件传递数据&#x…

springBoot整合ELK Windowsb版本 (elasticsearch+logstash+kibana)

springBoot整合ELK Windowsb版本 【elasticsearchlogstashkibana】 下载软件启动服务1、elasticsearch2、kibana3、logstash 集成springboot1、添加依赖2、在logback.xml添加相关配置3、修改logstash 配置4、重启logstash 最后测试 下载软件 elasticsearch 官网 https://www.…

选择器css

1.a标签选择 // 选中所具有herf 的元素 [herf] {color: skyblue; } // 选中所具有herfhttps://fanyi.youdao.com/ 的元素 [herf$"youdao.com"] {color:pink; } // 按此顺序书写 link visited hover active // 未访问状态 a:link {color:orange } // 访问状态 a…

数据结构大作业——家谱管理系统(超详细!完整代码!)

目录 设计思路&#xff1a; 一、项目背景 二、功能分析 查询功能流程图&#xff1a; 管理功能流程图&#xff1a; 三、设计 四、实现 代码实现&#xff1a; 头文件 结构体 函数声明及定义 创建家谱树头结点 绘制家谱树&#xff08;打印&#xff09; 建立右兄弟…

TDC-GP30 Data Sheet

4 特殊服务功能 4.1 看门狗 系统复位后,GP30的看门狗功能被启用。大约13秒后,如果看门狗计时器在此之前未被清除,则看门狗会重置芯片。这通常由固件使用clrwtd命令完成,以便在固件因任何原因未清除看门狗时,系统会发生复位。看门狗时间基于一个未稳定的10 kHz内部振荡器时…

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定&#xff0c;根据图示步骤继续导入项目 查看项目目录&#xff…

基于单片机的指纹密码锁

【摘要】 本设计是一款基于单片机的指纹识别电子密码锁系统。该系统以STC89C52单片机作为模块核心同时结合ZFM-60指纹模块实现录取指纹并存储指纹数据的功能&#xff0c;并且通过HS12864-15C液晶显示比对流程及比对结果&#xff0c;该指纹电子密码锁通过直流继电器与发光二极管…

2025-1-9 QT 使用 QXlsx库 读取 .xlsx 文件 —— 导入 QXlsx库以及读取 .xlsx 的源码 实践出真知,你我共勉

文章目录 1. 导入QXlsx库2. 使用 QXlsx库 读取 .xlsx 文件小结 网上有很多教程&#xff0c;但太费劲了&#xff0c;这里有个非常简便的好方法&#xff0c;分享给大家。 1. 导入QXlsx库 转载链接 &#xff1a;https://github.com/QtExcel/QXlsx/blob/master/HowToSetProject.md…

QT + Opencv 实现灰度模板匹配

QT Opencv 实现灰度模板匹配 实现思路 1.模板创建代码思路 1 初始化和准备&#xff1a; 使用 cv::buildPyramid 函数构建图像金字塔。图像金字塔是一种多分辨率表示&#xff0c;每个层级的图像分辨率逐步降低。 调整 m_TemplData 的大小以匹配图像金字塔的层级数。 计算每…

深度学习知识点:LSTM

文章目录 1.应用现状2.发展历史3.基本结构4.LSTM和RNN的差异 1.应用现状 长短期记忆神经网络&#xff08;LSTM&#xff09;是一种特殊的循环神经网络(RNN)。原始的RNN在训练中&#xff0c;随着训练时间的加长以及网络层数的增多&#xff0c;很容易出现梯度爆炸或者梯度消失的问…

git提交

基本流程&#xff1a;新建分支 → 分支上开发(写代码) → 提交 → 合并到主分支 拉取最新代码因为当前在 master 分支下&#xff0c;你必须拉取最新代码&#xff0c;保证当前代码与线上同步&#xff08;最新&#xff09;&#xff0c;执行以下命令&#xff1a;bashgit pull orig…

Spring——自动装配

假设一个场景&#xff1a; 一个人&#xff08;Person&#xff09;有一条狗&#xff08;Dog&#xff09;和一只猫(Cat)&#xff0c;狗和猫都会叫&#xff0c;狗叫是“汪汪”&#xff0c;猫叫是“喵喵”&#xff0c;同时人还有一个自己的名字。 将上述场景 抽象出三个实体类&…

基于 JavaEE 的影视创作论坛

在当今数字化时代&#xff0c;影视创作论坛成为了影视爱好者们交流与分享的重要平台。本文将详细介绍基于 JavaEE 的影视创作论坛的设计与实现&#xff0c;让大家了解其背后的技术奥秘。 文末附有完整项目代码 该论坛具备丰富的功能&#xff0c;包括首页推荐、用户管理、影片管…