Java的编程之旅27——继承

1.继承的简介

继承是面向对象编程中的一个重要概念,指的是一个类可以继承另一个类的属性和方法。被继承的类称为父类或基类,继承这个父类的类称为子类或派生类。

通过继承,子类可以继承父类的属性和方法,使得子类具有相似的行为和特性。子类可以重写父类的方法,覆盖父类的行为,也可以添加新的属性和方法以扩展父类的功能。

继承提供了代码复用的机制,可以减少代码的冗余,并且使得代码更加可维护和扩展。此外,继承也是实现多态的基础,通过父类的引用可以调用子类的方法,实现不同对象的统一操作。


2.代码中的体现

定义一个名为“Person”的类,作为父类 

public class Person{String name;int age;public Person(){}public Person(String name ,int age){this.name = name;this.age = age;}public void eat(){System.out.println("人会吃~");}public void sleep(){System.out.println("人会睡~");}}

这段代码定义了一个名为Person的类。Person类包含了两个属性:name(姓名)和age(年龄)。类中定义了两个构造方法:一个无参构造方法和一个带有参数的构造方法,用于初始化name和age属性。

类中还定义了两个方法:eat(吃)和sleep(睡)。这两个方法是公共的(public),可以被其他类调用。eat方法输出了一个字符串,表示人会吃;sleep方法输出了一个字符串,表示人会睡。

这个Person类是一个基类,其他类可以通过继承这个类来继承其中的属性和方法。通过继承,子类可以使用Person类中定义的属性和方法,并可以根据需要进行扩展和修改。

定义一个名为“Teacher”的子类用来继承“Person”

public class Teacher extends Person{int teachAge;//构造方法public Teacher(){}public Teacher(int teachAge) {TeachAge = teachAge;}public Teacher(String name,int age,int teachAge){super(name, age);TeachAge = teachAge;}public void teach(){System.out.println("老师会教书");}
}

这段代码定义了一个名为Teacher的类,它继承自Person类。Teacher类有一个额外的实例变量teachAge,表示教学年龄。

代码中提供了三个构造方法:

  1. 无参构造方法:没有参数,什么也不做。
  2. 带参构造方法:接受一个int类型的teachAge参数,并将其赋值给Teacher类的实例变量teachAge。
  3. 带参构造方法:接受一个字符串name、一个int类型的age和一个int类型的teachAge参数,并将name和age传递给父类Person的构造方法进行初始化,同时将teachAge赋值给Teacher类的实例变量teachAge。

Teacher类还有一个公共方法teach(),它打印出"老师会教书"的消息。

这段代码实现了一个教师类,继承了人类,具有教学年龄的特征,并能够进行教学操作。

最后定义一个功能测试类

public class Test {public static void main(String[] args) {Person person = new Person("hh",22);System.out.println(person.name+","+person.age);person.eat();person.sleep();Teacher teacher = new Teacher("jj",56,12);System.out.println(teacher.name+","+teacher.age+","+teacher.TeachAge);teacher.eat();teacher.sleep();teacher.teach();}
}

输出结果: 

这段代码定义了一个名为Test的类,其中有一个main方法作为程序的入口点。

在main方法中,首先创建了一个Person对象,通过调用Person类的带参构造方法,传入字符串"hh"和整数22进行初始化。然后通过person对象访问其实例变量name和age,并将结果打印出来。接着调用person对象的eat()方法和sleep()方法,输出对应的消息。

接下来,创建了一个Teacher对象,通过调用Teacher类的带参构造方法,传入字符串"jj"、整数56和整数12进行初始化。然后通过teacher对象访问其父类Person中的name和age实例变量,以及Teacher类自身的TeachAge实例变量,并将结果打印出来。接着调用teacher对象的eat()方法和sleep()方法,输出对应的消息。最后通过调用teacher对象的teach()方法,输出"老师会教书"的消息。


3.super关键字的用法

1.定义一个名为“Father”的父类

public class Father {String name;int age;public Father() {}public Father(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(this.age+"岁的"+this.name+"会吃");}
}

这段代码定义了一个名为Father的类。Father类有两个实例变量name和age,代表父类成员中的姓名和年龄。

Father类有两个构造方法,一个是无参构造方法,一个是有参构造方法。无参构造方法不进行任何操作,而有参构造方法用于初始化父类成员的姓名和年龄。

Father类还有一个eat()方法,用于输出年龄和姓名,并打印一句话表示吃的动作。

2.定义一个名为“Child”的子类用来继承“Father”父类

public class Child extends Father{String name;int age;public Child() {}public Child(String name, int age) {this.name = name;this.age = age;}public Child(String name, int age, String name1, int age1) {super(name, age);this.name = name1;this.age = age1;}public void eat(){//所表达的是子类中的“xx岁的xx会吃”System.out.println(this.age+"岁的"+this.name+"会吃");//表达父类中的”xx岁的xx会吃“System.out.println(super.age+"岁的"+super.name+"会吃");//还可以用super关键字直接调用父类中的方法//super.eat();}
}

这段代码定义了一个名为Child的类,它继承自Father类。Child类也有两个实例变量name和age,但是它们与父类的name和age变量没有任何关系。

Child类有三个构造方法,一个是无参构造方法,一个是有两个参数的构造方法,另一个是有四个参数的构造方法。其中有两个参数的构造方法用于初始化子类自己的name和age变量,四个参数的构造方法不仅会调用父类的有参构造方法来初始化父类的name和age变量,还会初始化子类的name和age变量。

Child类也有一个eat()方法,但是与父类的eat()方法不同的是,它重写了父类的eat()方法。在重写的eat()方法中,首先输出子类自己的年龄和姓名,并打印一句话表示吃的动作。然后使用super关键字调用父类的age和name变量,并打印一句话表示父类的吃的动作。最后还可以使用super关键字直接调用父类的eat()方法。

3.定义一个测试类

public class Test {public static void main(String[] args) {Father father = new Father("老贺",40);father.eat();Child child = new Child("小贺",18);child.eat();}
}

注意:输出结果的后一行有点反常,这是因为只调用了Child类中的public Child(String name, int age)方法,而这是属于子类中的方法,和父类没有关系

 public void eat(){//所表达的是子类中的“xx岁的xx会吃”System.out.println(this.age+"岁的"+this.name+"会吃");//表达父类中的”xx岁的xx会吃“System.out.println(super.age+"岁的"+super.name+"会吃");//还可以用super关键字直接调用父类中的方法//super.eat();}

所以eat()方法中后一个语句输出的是父类中所定义的值,要想正常输出,则需要重新new一个child

对象,用来调用public Child(String name, int age, String name1, int age1) 这个构造方法

更改后的主函数: 

public class Test {public static void main(String[] args) {Father father = new Father("老贺",40);father.eat();Child child = new Child("小贺",18,"老贺",40);child.eat();}
}

输出结果


4.继承中的权限

在Java中,继承中的权限是通过访问修饰符来控制的。Java中有四种访问修饰符:public、protected、default和private。

  1. public:被public修饰的成员(字段、方法、构造方法等)可以在任何地方被访问,包括其他类、不同包中的类和子类。

  2. protected:被protected修饰的成员可以被同一个包中的类访问,也可以被不同包中的子类访问,但不能被不同包中的非子类访问。

  3. default:没有修饰符的成员(也称为包级访问)可以被同一个包中的类访问,但不能被不同包中的类访问。

  4. private:被private修饰的成员只能在同一个类中访问,不能被其他类或子类访问。

继承关系中,子类会继承父类的字段和方法。下面是不同访问修饰符下,子类对父类成员的访问权限:

  • public成员:子类可以访问父类的public成员。

  • protected成员:子类可以访问父类的protected成员,即使子类和父类不在同一个包中。

  • default成员:子类可以访问父类的default成员,但是要求子类和父类在同一个包中。

  • private成员:子类无法直接访问父类的private成员,只能通过父类的public/protected/default方法来间接访问。

需要注意的是,子类可以覆盖(重写)父类的方法,但是子类不能降低父类方法的访问权限。也就是说,如果父类的方法是public,那么子类重写该方法时也必须使用public修饰符。同样地,如果父类的方法是protected,子类重写该方法时可以使用protected或public修饰符,但不能使用private修饰符或不使用任何修饰符(default)。

这样设计的目的是为了保护类的封装性和安全性,子类只能通过继承和重写的方式来访问和修改父类的成员。

public class Fu {public String varPub = "我是公成员变量";private String varPri = "我是私有成员变量";protected String varPro = "我是受保护的变量";String varDef = "我是默认的变量";
}
public class Zi extends Fu{public void method(){System.out.println(this.varPub);//System.out.println(this.varPri);System.out.println(this.varPro);System.out.println(this.varDef);}
}
public class TS {public static void main(String[] args) {Fu fu = new Fu();System.out.println(fu.varPub);System.out.println(fu.varPro);System.out.println(fu.varDef);//System.out.println(fu.varPri);//除了private,其他权限都可在当前包内的其他类中都可访问System.out.println("============");Zi zi = new Zi();zi.method();//同包子类中,除私有权限外都可调用}
}

 在另一包内在定义一个子类

public class Zi extends Fu {public void method(){System.out.println(super.varPub);//System.out.println(super.varPri);System.out.println(super.varPro);//System.out.println(super.varDef);//不同包子类,只有公有和受保护变量可以被调用}
}
public class Ts {public static void main(String[] args) {Zi zi = new Zi();zi.method();}
}

 

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

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

相关文章

掌握BeautifulSoup4:爬虫解析器的基础与实战【第91篇—BeautifulSoup4】

掌握BeautifulSoup4:爬虫解析器的基础与实战 网络上的信息浩如烟海,而爬虫技术正是帮助我们从中获取有用信息的重要工具。在爬虫过程中,解析HTML页面是一个关键步骤,而BeautifulSoup4正是一款功能强大的解析器,能够轻…

2024年度中国5G随身WiFi品牌排行榜

【中国品牌网中国3C质量评测中心权威榜单联合发布】 第一名:格行 优势:作为随身WiFi行业的佼佼者,格行凭借其15年的物联网行业经验,在技术研发、产品创新及客户服务上均享有盛誉。其5G随身WiFi产品网络稳定,客户满意度…

行为树入门:ROS2 BehaviorTree.CPP Groot2安装与简单使用(有例程)

ROS2安装与学习及其topic学习 BehaviorTree.CPP编译与安装 和 Groot2安装 注意:《ROS2行为树(C行为树)BehaviorTree.CPP完全图形化开发,完美支持ROS2话题通信》这个例程实现的前提需要建一个sentry_interfaces::msg::RobotHP的m…

Spring Boot 笔记 029 用户模块

1.1 用户信息需要在多个链接使用,所以需要用pinia持久化 1.1.1 定义store import {defineStore} from pinia import {ref} from vue const useUserInfoStore defineStore(userInfo,()>{//定义状态相关的内容const info ref({})const setInfo (newInfo)>{i…

“IT行业职业发展的黄金之路:哪些证书能为你增光添彩?“

文章目录 每日一句正能量前言1、浙大计算机程序设计能力考试证书(PAT)2、全国计算机等级考试证书(NCRE)3、计算机技术与软件专业资格考试证书(软考)4、通信专业技术人员职业水平证书5、全国计算机应用水平考试证书(NIT…

MySQL学习Day19——索引的数据结构

一、为什么使用索引: 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教课书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据査找时,首先查看查询…

【深蓝学院】移动机器人运动规划--第6章 模型预测控制(MPC)与运动规划--笔记

0. Outline 1. Reactive Control(反应式控制) 控制学中的 “Reactive Control” 通常指的是一种控制策略,它依赖于系统对特定事件或变化的即时反应,而不是按照预定的计划或策略行动。这种控制往往是基于当前的传感器输入来做出决…

Mac 上游玩QQ飞车详细教程,IPA砸壳包资源下载安装

最近经过一番折腾终于在 MAC 上成功安装运行了 QQ 飞车,上图: 最后总结下来安装过程其实蛮简单的,但其中有很多卡点和坑所以浪费了很多的时间,特意整理本篇教程供大家参考 大体思路是这样的,先安装 playCover,该软件可…

PostMan使用自带js库base64编码、sha256摘要、环境变量的使用

目录 1、环境变量的使用2、base64编码、sha256摘要、以及脚本的使用3、脚本代码 在请求调试接口的过程中,因为要使用大量相同的参数,使用变量的方式能很大程度上减轻接口调用的工作量 版本说明:Postman for Windows,Version&#…

【Python笔记-设计模式】桥接模式

一、说明 桥接模式是一种结构型设计模式, 主要用于将抽象部分与它的实现部分分离, 从而能在开发时分别使用,使系统更加灵活,易于扩展。 (一) 解决问题 所有 组合类的数量将以几何级数增长 抽象和实现分离:桥接模式可…

数据结构day4

实现创建单向循环链表、创建结点、判空、输出、头插、按位置插入、尾删、按位置删除 loop_list.c #include "loop_list.h" loop_p create_head() {loop_p L(loop_p)malloc(sizeof(loop_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->le…

websocket了解下

websocket请求长啥样 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13 啥是websocket websocket是http的一种,服务器可以主动向客户端推送信息,…

进程 2月24日学习笔记

1.进程: 程序:存放在外存中的一段数据组成的文件 进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息(根据CPU占用率排序) PID:唯一识…

Linux---权限管理(ACL权限、特殊位和隐藏属性)

目录 1.ACT权限 1.1什么是ACT权限 1.2ACT图解 2.操作步骤 2.1添加测试目录、用户、组,并将用户添加到组 2.2修改目录的所有者和所属组 2.3设定权限 2.4为临时用户分配权限 2.4.1添加临时用户 2.4.2为临时用户分配特定权限 2.4.3查看目录权限,注…

NPM私服搭建(verdaccio)

官网地址:https://verdaccio.org/ 概述 Verdaccio 是一个流行的 Node.js 包管理器的代理工具,它允许您在本地或私有网络上轻松地创建和管理 npm 包仓库。通过 Verdaccio,开发团队可以建立自己的 npm 包仓库,以更好地控制和管理其依…

使用redisMQ-spring-boot-starter实现消息队列和延时队列

简介 redisMQ-spring-boot-starter是一个轻量级的、基于Redis实现的消息队列中间件,它有如下优点: 开箱即用,你几乎不用添加额外的配置支持消息队列、延时队列,并提供精细化配置参数提供消息确认机制支持虚拟空间,不…

C++ 学习之Map容器

C++ Map容器概念 C++的Map容器是一种关联容器,它提供了一种将键和值相关联的方式。它以键值对的形式存储数据,并根据键的顺序自动进行排序。 Map中的键是唯一的,而值可以重复。你可以使用键来访问对应的值,就像使用索引访问数组中的元素一样。 Map容器的特点如下: 按照…

一些可以参考的文档集合16

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5…

IDEA查询对应功能的快捷键

首先要知道快捷键的key叫什么,然后通过key来找到对应的快捷键 比如下面这个查找删除导入未使用的类 跳转 或者安装对应插件

可视化 RAG 数据 — 用于检索增强生成的 EDA

原文地址:Visualize your RAG Data — EDA for Retrieval-Augmented Generation 2024 年 2 月 8 日 Github:https://github.com/Renumics/rag-demo/blob/main/notebooks/visualize_rag_tutorial.ipynb 为探索Spotlight中的数据,我们使用Pa…