Java进阶----继承

继承

一.继承概述

继承是可以通过定义新的类,在已有类的基础上扩展属性和功能的一种技术.
案例:优化 猫、狗JavaBean类的设计

狗类:Dog
属性:名字 name,年龄 age
方法:看家 watchHome()Getter and Setter
猫类:Cat
属性:名字 name,年龄 age
方法:抓老鼠 catchMouse(),Getter and Setter

普通写法:

//猫类
public class Cat {private String name;private int age;public void catchMouse() {System.out.println("猫抓老鼠");}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 class Dog {private String name;private int age;public void watchHome() {System.out.println("狗看家");}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;}
}
相同的属性,有大量重复代码
private String name;
private int 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;}

继承格式

继承使用 extends 关键字,让派生类扩展基类的功能。派生类也叫子类,基类也叫超类或父类

需求:使用继承优化猫狗类的设计

  • 猫和狗都属于动物的一种,它们的共有属性、功能是每种动物都具备的,可将狗和猫看成是动物的扩展;
  • 定义Animal动物类,并定义猫和狗的共有内容,作为动物的基础属性和功能
属性:姓名 name,年龄 age
方法:Getter and Setter
  • 分别定义Dog狗类和Cat猫类,使用继承技术在Animal动物类的基础功能上扩展自己的特有功能
Dog:看家 watchHome()
Cat:抓老鼠 catchMouse()

分析:
需求:使用继承技术优化Dog和Cat类
1.思考父类是什么?(将Dog和Cat中的相同内容全部放到父类中)子类是什么?子类需要继承父类什么?
2.先定义Animal动物类,作为Dog狗类和Cat猫类的父类
3.使用extends关键字让Dog和Cat继承Animal

// Animal动物类
public class Animal {//父类的私有内容不能直接继承(直接使用)private String name;private int 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 class Cat extends Animal{public void catchMouse() {System.out.println("猫抓老鼠");}
}//狗类 继承动物类
public class Dog extends Animal{public void watchHome() {System.out.println("狗看家");}
}
//测试Dog和Cat的功能是否能够正常使用
public class Demo {public static void main(String[] args) {//需求:使用继承技术优化Dog和Cat类Dog dog = new Dog();dog.watchHome();dog.setAge(3);int age = dog.getAge();dog.setName("小黄");Cat cat = new Cat();String name = dog.getName();System.out.println(name);System.out.println(age);}
}

小结

继承技术的作用是什么?
可以使用___extends___关键字,让子类扩展父类的属性和功能
如何使用继承技术?
在__父类_____中定义子类们的共有内容,作为基础属性和功能
让___子类_____使用 extends__ 关键字,扩展父类的属性和功能
继承技术有什么好处?
可以提高代码__复用率________,减少重复的代码

拓展

什么时候使用继承呢?

  • 子类和父类具备 is a 的关系
  • is a 的关系:

假设A和B两个类,A是B的一种,那么A类和B类就有 is a 的关系
此时:A类 extends B类,苹果类 extends 水果,猫类 extends 动物.

继承案例练习

需求:在某个宠物店的宠物资源管理系统中,存在猫、狗角色。

猫类属性(姓名,年龄),行为(喝水,抓老鼠)
狗类属性(姓名,年龄),行为(喝水,看家)

利用继承技术,定义猫类和狗类,并实现效果:

3岁的小猫杰克,每天都抓一只老鼠当晚餐
2岁的小狗大黄,每天都趴在门口看家护院

1.先定义Animal动物类,作为父类
2.分别定义Dog狗类和Cat猫类,作为子类
3.创建子类对象,调用功能

/***动物类:作为父类*/
public class Animal {//提取子类们共有的属性和功能:共有的属性:姓名、年龄private String name;private int age;
//针对被私有的属性,需要提供Getter and Setter方法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 void drink(){System.out.println("喝水");}
}
/*** 狗类:使用extends关键字,继承Animal动物类*/
public class Dog extends Animal {//特有功能:看家public void watchHome() {System.out.println(getAge() + "岁的小狗" + getName() + ",每天都趴在门口看家护院");}
}
public class Cat extends Animal {//特有功能:抓老鼠public void catchMouse() {System.out.println(getAge() + "岁的小猫" + getName() + ",每天都抓一只老鼠当晚餐");}
}
public class Test {public static void main(String[] args) {//1.先定义Animal动物类,作为父类//2.分别定义Dog狗类和Cat猫类,作为子类//3.创建子类对象,调用功能Dog dog = new Dog();dog.setName("大黄");dog.setAge(2);Cat cat = new Cat();cat.setName("杰克");cat.setAge(2);dog.watchHome();cat.catchMouse();}
}

继承的注意事项

  1. 单继承: 一个子类只能有一个父类
  2. 多层继承:子类可以有父类,父类也可以有父类
  3. 继承成员子类能从父类那直接或间接获取属性和功能
  4. 祖宗类:任何一个类都直接或间接的继承Object类

分析
1.Java只能单继承(一个子类有且仅有一个父类)
需求:尝试让Son类同时继承Dad类和GrandDad类

public class GrandDad {public void drawing() {System.out.println("绘画");}
}
//尝试Son多继承(同时继承)Dad和GrandDaD类,代码会报错!
//public class Son extends Dad, GrandDad {
//public class Son extends Dad extends GrandDad {

2.Java虽然只能单继承,但是可以多层继承(子类继承父类,但父类也可以继续继承父类)

  • 需求:尝试让Son类继承Dad类,然后让Dad类继承GrandDad类
  • 创建子类Son的对象,去调用Dad类和GrandDad类的功能
//尝试让Son继承Dad
public class Son extends Dad{
}
//让Dad类继承GrandDad
public class Dad extends GrandDad {String car = "玛莎拉蒂";private String house = "小洋楼";public void swim() {System.out.println("游泳");}
}Son son = new Son();
System.out.println(son.car);
son.swim();
son.drawing();
System.out.println("----------------------");

3.子类可以直接或间接继承父类的成员(直接或间接的使用父类的成员变量、成员方法),父类的私有成员,子类不能直接继承,但是可以间接继承(使用super关键字)

//System.out.println(son.house);
//'house' has private access in 'i_extends.d3.Dad'

4.Java中任何一个类都直接或间接的继承Object类
,Object类提供了一个hashCode方法,可以返回对象在堆内存的十进制地址值

//需求:创建GrandDad类对象,尝试调用hashCode方法GrandDad grandDad = new GrandDad();int hashCode = grandDad.hashCode();System.out.println(hashCode);
玛莎拉蒂
游泳
绘画
----------------------
356573597

三.继承关系下,成员的访问特点

目标:了解继承关系中,子类访问成员的特点
就近原则
1.成员(变量、方法)访问的特点:

  • 子类有,就访问子类自己的
  • 子类没有,就访问父类的
  • 子、父类都没有,代码报错!
    2.指定访问父类的成员:
  • 使用 super 访问
public class Fu {String str = "我是父类变量";public void show() {System.out.println("我是父类的show方法");}
}public class Zi extends Fu {String str = "我是子类变量";public void show() {System.out.println("我是子类的show方法");}public void test() {//1.访问变量strSystem.out.println(str);//2.访问show方法show();**//3.指定访问父类的str属性和show方法**System.out.println(super.str);super.show();}
public class Demo {public static void main(String[] args) {//1.需求:按要求完成Zi类中的test方法//创建Zi类对象,调用test()方法Zi zi = new Zi();zi.test();}
}
//父类
public class Father {String field = "父类的和子类同名属性";public void method() {System.out.println("父类的和子类同名方法");}
}//子类
public class Son extends Father {String field = "子类的和父类同名属性";String ziField = "子类特有属性";public void method() {System.out.println("子类的和父类同名方法...");}public void use() {String ziField = "子类局部变量";//练习:按要求完成以下需求//1.访问子类的field属性System.out.println(field);//2.访问父类的field属性System.out.println(super.field);//3.访问ziField属性,此时发现方法中有一个成员变量和一个成员方法同名,此时需要用 this 来表明访问的是成员变量System.out.println(this.ziField);//4.访问ziField局部变量System.out.println(ziField);//5.访问method方法method();//6.访问父类的method方法super.method();}
}

小结

  1. 在子类方法中访问父类成员变量、成员方法遵循什么原则?
    就近原则:子类有就用子类的,子类没有就用父类的,父类没有就报错
  2. 如果子、父类中出现了重名的成员变量、成员方法,如何区分?
    super.父类成员 … this.本类成员

四.方法重写

  • 子类和父类有一模一样方法声明,但方法体可能不一样,此时子类方法会覆盖父类的方法(这种格式称为方法重写)

目标:掌握方法重写的特点和使用场景

### 实例
需求:在不影响B类继承使用Fu类show功能的前提下,让A类执行自己特有的show功能:"A类特有的show方法"
1.在子类A中,写一个和父类Fu一模一样的show方法(子类A重写了父类Fu的show方法)```java
public class Fu {public void show() {System.out.println("fu...show...");}
}
public class B extends Fu {}
public class A extends Fu {public void show() {System.out.println("A类特有的show方法");}
}
public class Demo01 {public static void main(String[] args) {A a = new A();//方法重写后,遵循就近原则a.show();B b = new B();b.show();}
}//执行结果:
//A类特有的show方法
//fu...show...

``

方法重写的注意事项

目标:了解方法重写的注意事项

  1. 重写方法的名称、形参列表必须和父类相同
  2. 子类重写的方法返回值类型,要小于等于父类方法的返回值类型(约定:父类大于子类)
  3. 子类重写父类方法时,访问权限必须大于或者等于父类 (private < 缺省 < protected < public)
  4. 父类私有方法,子类不能重写

方法重写的校验

@Override注解,标记一个方法是重写父类方法(语法检查)
需求:让SubClass类重写SuperClass类的各个方法

public class SuperClass {public void method1() {System.out.println("super...public...");}public A method2() {return new A();}protected void method3() {System.out.println("super...protected...");}void method4() {System.out.println("super...default...");}private void method5() {System.out.println("super...private...");}
}
public class SubClass extends SuperClass {//1.重写method1方法:保持方法名称、形参列表相同@Overridepublic void method1() {//public void method1(int age) {System.out.println("子类重写的method1");}//2.重写method2方法@Override//public Fu method2() {//注意:子类重写父类方法,返回值类型需要小于等于父类的public A method2() {return new A();}//3.重写method3、method4、method5方法@Overrideprotected void method3() {//注意:子类重写父类方法,访问权限要大于等于父类的//public void method3() {//void method3() {//private void method3() {System.out.println("子类重写的method3");}@Overridevoid method4() {//protected void method4() {//public void method4() {//private void method4() {System.out.println("子类重写的method4");}//@Override//注意:父类私有方法,子类不能重写private void method5() {System.out.println("子类自己的method5方法");}

继承关系下,构造器的访问特点

目标:了解继承关系中,构造器的访问特点
特点:访问构造器时,会先默认访问父类的空参构造器
原因:在子类的构造器第一行有一句隐藏的super();
在这里插入图片描述

  • super访问父类构造器
    super(); 用来访问父类空参数构造器
    super(参数); 访问父类有参数构造器
    在这里插入图片描述
    子类继承父类后构造器的访问特点是什么样的?
    子类中所有的构造方法默认都会先访问父类中__空参数构造方法

子类构方法第一行默认有一句__super()________
如果不想访问父类空参数构造器,可以使用___super(参数)_________ 访问父类有参数构造器
访问本类的构造器格式是:this()、this(参数)_____________
补充: this(),super() 都只能写在构造器的第 条语句

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

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

相关文章

防火墙基础及登录(华为)

目录 防火墙概述防火墙发展进程包过滤防火墙代理防火墙状态检测防火墙UTM下一代防火墙&#xff08;NGFW&#xff09; 防火墙分类按物理特性划分软件防火墙硬件防火墙 按性能划分百兆级别和千兆级别 按防火墙结构划分单一主机防火墙路由集成式防火墙分布式防火墙 华为防火墙利用…

命令行运行git reflog(reference log)报错的解决办法

文章目录 1. 检查 Git 是否已安装2. 检查 PATH 环境变量3. 重新安装 Git 在Git中&#xff0c; reflog的英文全称是 “ reference log”。意思是 引用日志&#xff08;参考日志&#xff09;。它记录了本地仓库中HEAD和分支引用所指向的提交的变更历史。这包括了你所有的提交&…

推荐3款免费电脑工具

Tools-Web Tools-Web是一个在线工具箱&#xff0c;提供丰富的工具和功能&#xff0c;适用于日常工作和学习。根据用户评价&#xff0c;Tools-Web的工具种类丰富且操作简单&#xff0c;是日常工作和学习的好帮手。该工具箱涵盖了开发运维、文本处理、图片处理、图表处理、随机工…

收银系统源码-收银台副屏广告

1. 功能描述 门店广告&#xff1a;双屏收银机&#xff0c;副屏广告&#xff0c;主屏和副屏同步&#xff0c;总部可统一控制广告位&#xff0c;也可以给门店开放权限&#xff0c;门店独立上传广告位&#xff1b; 2.适用场景 新店开业、门店周年庆、节假日门店活动宣传&#x…

2通道音频ADC解码芯片ES7243L、ES7243E、ES7243,用于低成本实现模拟麦克风转换为IIS数字话筒

前言&#xff1a; 音频解码芯片某创参考价格&#xff1a; ES7243L 500&#xff1a;&#xffe5;1.36 / 个 ES7243E 500&#xff1a;&#xffe5;1.66 / 个 ES7243 500&#xff1a; &#xffe5;1.91 / 个 其中ES7243L工作电压为1.8V&#xff0c;与其他两款的3.3V工作电压不同&…

九科bit-Worker RPA 内容学习

简介&#xff1a; 什么是RPA&#xff1f; RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;本质上是一种“AI数字员工”&#xff0c;针对企业中存在的大批量、重复性、机械化人工操作&#xff0c;通过模拟人的工作流程使之实现自动化。 b…

Redhat 安装 docker 网络连接超时问题

目录 添加阿里云的Docker CE仓库 更新YUM缓存 安装 Docker Engine 启动并设置Docker自启动 验证 Docker 安装 [userlocalhost ~]$ sudo yum-config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo 正在更新 Subscription Management 软件仓库…

c++之命名空间详解(namespace)

引例 在学习之前我们首先了来看这样一个情形: 在c语言下&#xff0c;我们写了两个头文件&#xff1a;链表和顺序表的。我们会定义一个type(typedef int type)方便改变数据类型&#xff08;比如将int改成char&#xff09;&#xff0c;来做到整体代换。 但是我们两个头文件里面…

运维锅总详解系统设计原则

本文对CAP、BASE、ACID、SOLID 原则、12-Factor 应用方法论等12种系统设计原则进行分析举例&#xff0c;希望对您在进行系统设计、理解系统运行背后遵循的原理有所帮助&#xff01; 一、CAP、BASE、ACID简介 以下是 ACID、CAP 和 BASE 系统设计原则的详细说明及其应用举例&am…

98.验证二叉搜索树——二叉树专题复习

递归&#xff1a; class Solution {// 判断二叉搜索树是否有效public boolean isValidBST(TreeNode root) {// 递归地检查以 root 为根的子树是否满足 BST 的性质// 同时定义一个范围 [Long.MIN_VALUE, Long.MAX_VALUE] 来约束节点的值return isValidBST(root, Long.MIN_VALUE…

SpringBoot拦截器

目录 一、拦截器快速入门 &#xff08;1&#xff09;什么是拦截器 &#xff08;2&#xff09;拦截器的使用步骤 1、定义拦截器 &#x1f340;preHandle() 方法 &#x1f340;postHandle() 方法 &#x1f340;afterCompletion() 方法 2、注册配置拦截器 二、拦截器详解…

中国剩余定理

模板代码&#xff1a; #include<bits/stdc.h> using namespace std; using ll long long; #define fi first #define se second const ll mod998244353; const int N2e510; #define int llint n,m[300],r[300]; int exgcd(int a,int b,int &x,int &y){if(b0){x…

如何用Vue3和Plotly.js打造交互式仪表盘

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 中使用 Plotly.js 创建指示器卡片 应用场景介绍 指示器卡片是一种用于可视化数据并提供关键见解的交互式组件。它们通常用于仪表板、分析应用程序和监控系统。Plotly.js 是一个流行的 JavaScript 库&a…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…

Face_recognition实现人脸识别

这里写自定义目录标题 欢迎使用Markdown编辑器一、安装人脸识别库face_recognition1.1 安装cmake1.2 安装dlib库1.3 安装face_recognition 二、3个常用的人脸识别案例2.1 识别并绘制人脸框2.2 提取并绘制人脸关键点2.3 人脸匹配及标注 欢迎使用Markdown编辑器 本文基于face_re…

无法下载 https://mirrors./ubuntu/dists/bionic/main/binary-arm64/Packages

ubuntu系统执行sudo apt update命令的时候&#xff0c;遇到如下问题&#xff1a; 忽略:82 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/universe arm64 Packages 错误:81 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/main arm64 Packa…

Oracle 19c 统一审计表清理

zabbix 收到SYSAUX表空间告警超过90%告警&#xff0c;最后面给出的清理方法只适合ORACLE 统一审计表的清理&#xff0c;传统审计表的清理SYS.AUD$不适合&#xff0c;请注意。 SQL> Col tablespace_name for a30 Col used_pct for a10 Set line 120 pages 120 select total.…

Vue 3 中集成 ECharts(附一些案例)

Vue 3 中集成 ECharts 的完全指南 引言 在现代Web开发中&#xff0c;Vue 3以其卓越的性能和灵活的Composition API赢得了广泛的关注。而ECharts&#xff0c;作为开源的一个使用JavaScript实现的强大可视化库&#xff0c;以其丰富的图表类型和高度可定制性成为了数据可视化的首…

EAI四个层次服务-系统架构师(二十六)

1、&#xff08;重点&#xff09;系统应用集成提供了4个不同层次服务&#xff0c;最上层服务是&#xff08;&#xff09;服务。 解析: EAI&#xff08;Enterprise Application Integration&#xff09;系统应用集成&#xff0c;相关概念。 实施EAI必须保证&#xff1a;应用程…

超详细版阿里云控制台环境配置+数据库配置

一、登录阿里云控制台 登录阿里云控制台&#xff0c;找到实例&#xff0c;切到阿里云服务器所在地址 &#x1f36d;不知道自己的服务器地址在哪边也没有关系&#xff0c;随便选择一个&#xff0c;查询不到记录的话会有以下提示&#xff0c;可以根据提示进行切换&#xff08;适…