【java基础】自定义类
文章目录
- 基本介绍
- 自定义类
- 字段
- 方法
- 构造器
- main方法
基本介绍
什么是类这里就不过多赘述了,这里来介绍关于类的几个名词
- 类是构造对象的模板或蓝图
- 由类构造对象的过程称为创建类的实例
- 封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式
- 对象的数据称为实例字段
- 操作数据的过程称为方法
下面再来说明一些对象的三个主要特性
- 对象的行为(behavior)一可以对对象完成哪些操作,或者可以对对象应用哪些方法?
- 对象的状态(state)一当调用那些方法时,对象会如何响应?
- 对象的标识(identity)一如何区分具有相同行为与状态的不同对象?
在本篇文章中,不会涉及到继承和接口,只会讲解任何定义最基本的类
自定义类
最简单的自定义类的形式如下
class ClassName{filed1filed2...constructor1constructor2...method1method2...}
我们可以发现一个类就是由字段、方法、构造器组成的(不是必须的)。
下面我就定义了一个简单的People类
class People {// 字段String name;int age;// 构造器public People(String name, int age) {this.name = name;this.age = age;}// 方法@Overridepublic String toString() {return "People{" +"name='" + name + '\'' +", age='" + age + '\'' +'}';}
}
下面来对字段,构造器,方法来进行逐个的介绍
字段
以上面的People为例子,我们定义了如下2个属性
String name;int age;
可以发现这和我们定义普通变量的写法是一样的,只不过我们在方法里面定义变量的作用域为当前所在的代码块,而类字段的作用域为整个类。
对于类字段,我们还可以使用修饰符来进行修饰,表示访问范围。可以不写,也可以用private,public,protected来进行修饰。
String name1;private String name2;protected String name3;public String name4;
对于这几个的细节,这里不进行说明。我们只需要记住,类字段一般都是使用private进行修饰即可。使用private表示该字段只能在本类进行使用
这里我们还要进行说明的一点是可以看见上面的代码只进行了定义,并没有初始化。如果我们没有初始化直接使用其实也是可以的,因为类在进行创建的时候会进行默认的初始化,给一个默认值。默认值的规则如下
- 基本类型默认值是0
- 布尔类型默认值是false
- 引用类型默认值是null
方法
以上面People中的toString方法为例子,@Override先进行忽略
@Overridepublic String toString() {return "People{" +"name='" + name + '\'' +", age='" + age + '\'' +'}';}
可以发现,方法由4部分组成,分别是方法修饰符,返回类型,方法名称,参数列表,代码块
- 方法修饰符:可以不写,也可以是private,protected,public。对于具体细节,这里不做说明,现在只需要记得方法使用public修饰就表示可以在其他类进行使用就行了
- 返回类型:这个是由自己决定的,可以按照自己的需求返回任何类型,我们返回使用的是return语句。当然也可以不进行返回,如果没有返回值,那么就使用void进行修饰
- 方法名称:这个就是自己来进行编写了,但是这里给出建议,方法的命名最好要能够体现出方法的作用
- 参数列表:上面的方法并没有参数列表,但是方法是可以有参数的,如果有参数,那么在调用方法的时候就需要传入对应的参数才行,这些参数可以在方法中进行使用
- 代码块:我们就是在里面编写自己的代码,如果有返回值,最后的语句一定要为return
有了方法的一些基本概念,我们再来看上面定义的toString方法,该方法就是使用public进行修饰,表示其他类可以进行调用,返回类型是一个字符串,名称为toString,没有参数,最终会返回People的name和age。
需要说明的是name和age我们并没有定义,为什么能够使用呢?其实上面在类字段中我们已经说过了,类字段的作用域是整个类,方法也在同一个类中,所以当然能够使用啊
上面说明了类字段一般都是private,只能够当前类里面使用,如果其他类想访问或者修改怎么办呢?其实这就是通过get和set来进行的,get一般是获取特定类字段的值,set一般是设置类字段的值,例子如下
public String getName() {return name;}public void setName(String name) {this.name = name;}
一般get,set后面都是跟着类字段的名称,这样容易理解该方法的意思
构造器
在使用java的时候,使用new关键字创建对象大家应该都使用过。使用new创建对象其实就是通过构造器完成的。
我们还有使用上面People里面的构造器进行说明
// 构造器public People(String name, int age) {this.name = name;this.age = age;}
构造器其实也是一个方法,但是这个方法比较特殊,并不需要写返回类型,并且名称还和类名是一样的,这些都容易理解,不容易理解的是以下内容
this.name = name;this.age = age;
其实,this代表的就是当前这个对象,是一个隐式对象。this.name就是当前这个类里面的name字段,当然我们可以不用写this。但是这里的情况比较特殊,因为传入的参数名称也叫做name,如果我们不写this,那么上面的语句就会变成如下情况
name = nameage = age
是不是很奇怪?如果不写this,那么编译器怎么知道你写的name是参数上的name还是类字段的name呢,其实根据最近的原则,name代表的就是参数上的name,this.name就是类字段的name。
对于构造器,我们可以给定多个,只需要参数的类型或者个数有区别就行,用专业术语来说就是重载
public People(String name) {this.name = name;}public People() {}
如果一个构造器没有参数,那么这个构造器就叫无参构造器,如果我们类里面一个构造器也不写,那么类就会存在一个默认的无参构造器。如果写了构造器,那么无参构造器就不会默认存在,需要显示的声明才行。
对于构造器的使用,其实就是在new的时候才会进行调用,根据new时传入的参数,匹配相应的构造器
People people = new People("tom",1);People people1 = new People();People people2 = new People("jack");
main方法
这个大家应该都很熟悉,main方法的形式如下
public static void main(String[] args) {}
main方法就可以看作是一个固定写法,不对任何对象进行操作,实际上,在启动程序的时候还没有构建起任何对象。静态的main方法将执行并构建起程序所需要的对象。
每个类都可以有一个main方法。main方法就是程序运行的入口,可以执行,常用于测试
相关文章:
【java基础】自定义类
文章目录基本介绍自定义类字段方法构造器main方法基本介绍 什么是类这里就不过多赘述了,这里来介绍关于类的几个名词 类是构造对象的模板或蓝图由类构造对象的过程称为创建类的实例封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现…...

7、STM32 FSMC驱动SRAM
本次使用CubeMx配置FSMC驱动SRAM,XM8A51216 IS62WV51216 原理图: 注意:FSMC_A0必须对应外部设备A0引脚 一、FSMC和FMC区别 FSMC:灵活的静态存储控制器 FMC:灵活存储控制器 区别:FSMC只能驱动静态存储控制器(如&…...

七、虚拟机栈
虚拟机栈出现的背景 1.由于跨平台性的设计,Java的指令都是根据栈来设计的,不同平台CPU架构不同,所以不能设计为基于寄存器的。 2.优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同…...
Linux其他常用命令
Linux其他常用命令查找文件find 命令功能非常强大,通常用在特定目录下搜索符合条件的文件如果省略路径,表示在当前文件夹下查找之前学习的通配符,在使用 find 命令时同时可用演练目标1.搜索桌面目录下,文件名包含1的文件find Desk…...

一次性打包学透 Spring
不知从何时开始,Spring 这个词开始频繁地出现在 Java 服务端开发者的日常工作中,很多 Java 开发者从工作的第一天开始就在使用 Spring Framework,甚至有人调侃“不会 Spring 都不好意思自称是个 Java 开发者”。 之所以出现这种局面…...
1080T、2080T、4070T显卡的深度学习性能测试和结论
先说结论: 4070T显卡FP32的训练和推理速度跟3090应该基本类似。但由于显存12G偏低,4070T不太适合如今的深度学习模型训练(新手列外,大部分模型都能训练起来,耗电也相对很低),更适合测试最新的一…...

SpringBoot搭建SpringMVC项目
前言据我的了解,现在不管是大公司或是小公司,如果使用java开发一个web项目,大部分都会选择使用SpringBoot,关于Springboot的好处,就不在这里过多赘述,总之Springboot有一套完整的生态,从项目构建…...
Prescriptive Analytics for Flexible Capacity Management
3 本节根据Netessine等人(2002年)和Bassok等人(1999年)对我们解决的容量规划问题进行了正式描述。考虑一家以pi(I1,…,I)的单价提供I服务的公司。在每个计划周期t∈{1,……...

超简单的待办事项列表管理器todo
什么是 todo ? todo 是一个自托管的 todo web 应用程序,可让您以简单且最少的方式跟踪您的 todo。📝 老苏觉得和之前介绍的 KissLists 比较像 文章传送门:最简单的共享列表服务器KissLists 官方提供了 Demo 演示站点:https://tod…...

在C#中初测OpencvSharp4
一、配置OpenCV 首先,我们新建一个工程,然后就是给这个工程配置OpenCV了,最简单的方法还是Nuget,来我们右键一个Nuget: 打开Nuget后,你可以直接输入OpenCVSharp4来查找,当然,如果你…...
洛谷P1123 取数游戏(C++)(DFS)
目录 1.题目 题目描述 输入格式 输出格式 输入输出样例 说明/提示 2.AC 1.题目 题目描述 一个N \times MNM的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻88个格…...
Python Qt6快速入门-嵌入PyQtGraph图表
嵌入PyQtGraph 文章目录 嵌入PyQtGraph1、PyQtGraph介绍2、创建PyQtGraph小部件3、绘图样式配置3.1 背景颜色3.2 线条颜色、线宽和样式配置3.3 线标记(Line Markers)3.4 绘制标题3.5 轴标题3.6 图例(Legends)3.7 轴范围限制3.8 绘制多组数据3.10 画布清空4、更新数据5、总结1、…...

Mac电脑_GitHub提交项目至仓库
第一步(准备工作): Mac 电脑自带 git , 无需安装 1. 创建一个项目 demo1 在 github 上 2. 创建 ssh 密钥 打开终端: ssh-keygen -t rsa -C "your_emailyouremail.com" 此处输入两次密码, 直接…...

Android自定义View实现横向的双水波纹进度条
效果图:网上垂直的水波纹进度条很多,但横向的很少,将垂直的水波纹改为水平的还遇到了些麻烦,现在完善后发布出来,希望遇到的人少躺点坑。思路分析整体效果可分为三个,绘制圆角背景和圆角矩形,绘…...

Python 之 Pandas 分组操作详解和缺失数据处理
文章目录一、groupby 分组操作详解1. Groupby 的基本原理2. agg 聚合操作3. transform 转换值4. apply二、pandas 缺失数据处理1. 缺失值类型1.1 np.nan1.2 None1.3 NA 标量2. 缺失值处理2.1 查看缺失值的情形2.2 缺失值的判断2.3 删除缺失值2.4 缺失值填充在开始之前ÿ…...

【人工智能 AI】什么是人工智能? What is Artificial Intelligence
目录 Introduction to Artificial Intelligence人工智能概论 What is Artificial Intelligence? 什么是人工智能?...

17、触发器
文章目录1 触发器概述2 触发器的创建2.1 创建触发器语法2.2 代码举例3 查看、删除触发器3.1 查看触发器3.2 删除触发器4 触发器的优缺点4.1 优点4.2 缺点4.3 注意点尚硅谷MySQL数据库教程-讲师:宋红康 我们缺乏的不是知识,而是学而不厌的态度 在实际开发…...

内核并发消杀器(KCSAN)技术分析
一、KCSAN介绍KCSAN(Kernel Concurrency Sanitizer)是一种动态竞态检测器,它依赖于编译时插装,并使用基于观察点的采样方法来检测竞态,其主要目的是检测数据竞争。KCSAN是一种检测LKMM(Linux内核内存一致性模型)定义的数据竞争(data race)的工…...

蓄水池抽样算法
蓄水池抽样,也称水塘抽样,是随机抽样算法的一种。基本抽样问题有一批数据(假设为一个数组,可以逐个读取),要从中随机抽取一个数字,求抽得的数字下标。常规的抽样方法是,先读取所有的…...

数据结构预算法之买股票最好时机动态规划(可买卖多次)
一.题目二.思路在动规五部曲中,这个区别主要是体现在递推公式上,其他都和上一篇文章思路是一样的。所以我们重点讲一讲递推公式。这里重申一下dp数组的含义:dp[i][0] 表示第i天持有股票所得现金。dp[i][1] 表示第i天不持有股票所得最多现金如…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...