Java基础:类的详细说明

Java是一门面向对象的编程语言,所谓的面向对象,简单的说,就是在软件开发过程中,用各种各样的对象实现所需功能。

对象就好像是现实世界中不计其数的物体,根据物体的性质可以将其进行分门别类:石头、锤子、房子、汽车、空气、土地、大树等等。

同样,在Java世界中,一个对象必定属于某一个类,一个类下可以有无数个对象。

对同一类对象的性质和功能进行抽象描述的就是类class类就是对象的种类

不过,和现实世界中的分门别类不同,现实世界的类是抽象的、是虚拟的,是人类大脑思维的结果,先有实际存在的物体,后有人类对其分类。而在Java世界,必须先有类的定义,然后创建对象

一,类的作用

类的主要作用是作为一种蓝图或模板,用于实例化对象。

它定义了对象的状态(即数据成员,如变量)和行为(即成员方法,如函数)。

通过类,我们可以实现代码的复用、封装和抽象,进而提高软件的可维护性和可扩展性。

二,类如何声明

1,定义格式

基本的类定义格式如下:

[访问修饰符] class 类名 {// 成员变量(属性)[修饰符] 数据类型 变量名;// 构造函数[修饰符] 类名([参数列表]) {// 初始化代码}// 成员方法(行为)[修饰符] 返回类型 方法名([参数列表]) {// 方法体}
}
```java
// 类的定义
public class Person {// 成员变量private String name;private int age;// 默认构造函数public Person() {System.out.println("默认构造函数被调用");}// 有参构造函数public Person(String name, int age) {this.name = name;this.age = age;System.out.println("有参构造函数被调用");}// 成员方法public void displayInfo() {System.out.println("Name: " + name + ", Age: " + age);}
}

2,类的访问修饰符及其作用

我们知道,方法的访问修饰符有四种:

  • public:表示可以被任何其他类访问
  • private:限制访问权限仅限于定义它的类内部
  • protected:允许同一包内的类以及所有子类访问
  • 默认(无修饰符):仅对同一包内的类可见

需要注意的是,类的访问修饰符只有两种

  • public:表示可以被任何其他类访问,public类名必须和文件名一致
  • 默认(无修饰符):仅对同一包内的类可见,其他包下的类访问时会报错,如DefaultClass
    在这里插入图片描述
    在这里插入图片描述
注意:一个文件多个类

一个Java源文件可以包含多个类,但有以下限制:

  • 只能有一个public类,且该类的名称必须与文件名相同
  • 其他非public类可以有多个,但它们只能在同一包内访问,本质是默认类
最佳实践:一个文件定义一个类

3,类命名的最佳实践

在Java编程中,类名的选择不仅关乎代码的可读性和维护性,也是遵循编程规范的重要体现。以下是一些关于Java类名的最佳实践原则:

  • 驼峰命名法:始终使用驼峰命名法(CamelCase),即每个单词的首字母大写,其余字母小写,不使用下划线。例如,MyClass,而不是my_class

  • 明确性:类名应当直接、明了地反映出类的功能或所代表的实体。避免使用模糊的名称,如ManagerUtilData,而应该具体到实际的管理对象、工具用途或数据类型,如UserManagerTextUtilityWeatherData

  • 名词优先:由于类通常代表实体、对象或抽象概念,因此类名最好是名词或名词短语,避免使用动词。如果需要表达行为或操作,这应该体现在方法名上。

  • 避免缩写:除非是广泛认可的缩写(如URL、HTML),否则尽量避免使用缩写,因为缩写可能会造成理解上的困难。全称更有利于代码的自解释性,如使用ApplicationSettings而非AppSet

  • 一致性:在整个项目或组织中保持类命名的一致性。一旦确定了某种命名规则或模式,应在其间保持一致,比如是否使用复数形式表示集合类(如UsersList vs UserList)。

  • 区分抽象类与接口:虽然在语法上没有硬性规定,但可以通过命名来暗示一个类是抽象的(如AbstractLogger)或者是一个接口(通常以I开头,如ILogger,但这更多是C#中的习惯,在Java中并不常见)。

  • 长度适中:类名应该足够长以表达其含义,但也要避免过长以至于阅读不便。找到一个平衡点,通常情况下,三到四个单词组成的名称是比较合理的。

  • 遵循框架或库的命名约定:如果你的项目依赖于特定的框架或库,最好遵循它们推荐的命名约定,以保持代码风格的一致性。

三,类的构成部分

类主要由以下三部分构成:

  • 成员变量:描述类的属性,可以是基本数据类型或对象引用
  • 构造函数:用于初始化对象,创建对象时自动调用
  • 成员方法:定义类的行为,可以操作成员变量,实现特定功能

四,成员变量

Java类中的成员变量代表了类的属性或状态,变量存储了对象的数据。

1,如何声明成员变量

成员变量的声明包括访问修饰符、可选的其他修饰符(如static、final)、变量类型和变量名。基本语法如下:

[访问修饰符] [其他修饰符] 类型 变量名;

[]包裹的部分表示可选,语法上可有可无。

2,访问修饰符

成员变量的访问修饰符和方法的访问修饰符一致:

  • public:任何地方都能访问,包括在本类,同包下其他类,不同包下的类

  • protected:同包内及子类可以访问,注意,不同包下的子类可以直接访问父类的protected变量,但不能通过父类的对象访问protected变量
    在这里插入图片描述

  • private:仅在定义它的类内部可以访问

  • 不写(默认):仅在同一个包内的类可以访问

在这里插入图片描述

3,其他修饰符

  • static:表明这是一个类变量,属于类本身,而不属于类的某个实例,类中定义的static变量,在其他类中可以通过类名直接访问,不需要先创建类的对象

在这里插入图片描述

  • final:表示变量的值一旦设定就不能再改变,即常量,修改final类型的变量会在编译时报错
    在这里插入图片描述

4,类型:指定变量的数据类型,可以是基本数据类型(如int, double)或引用类型(如String, Object

5,变量名的最佳实践

  • 见名知意:变量名应清楚地表达其存储的信息或目的,如firstName而非fn
  • 驼峰命名:每个单词首字母大写,如studentName
  • 避免缩写:除非是广为人知的缩写,否则应完整拼写,如numberOfStudents而非numStds
  • 区分大小写:Java是区分大小写的,确保命名准确无误
  • 避免保留字和关键字:不要使用Java的保留字作为变量

6,成员变量的最佳实践

  • 封装:尽可能使用private访问修饰符来隐藏类的内部实现细节,通过公共的getter和setter方法来控制对成员变量的访问。

  • 最小权限原则:给成员变量赋予最小必要的访问权限,减少耦合度和潜在的错误。

  • 初始化:考虑为成员变量提供合适的默认值,特别是在没有构造函数的情况下。

  • 使用final关键字:当成员变量的值不应改变时,使用final关键字将其声明为常量。

五,构造函数

1,定义

构造函数是一种特殊的方法,用于初始化新创建的对象。

构造函数的两个规范:

  • 构造函数的名称必须与类名完全相同
  • 没有返回类型(即使是void也不行,void修饰后就成为普通成员方法)
    在这里插入图片描述

2,类别

  • 默认构造函数:默认构造函数也称为无参构造函数,可以在类中显式声明,也可以缺省。如果类中没有显式定义任何构造函数,编译器会自动提供一个无参的默认构造函数,且这个默认构造函数的函数体是空的
  • 有参构造函数:可以接收参数,用于初始化对象时设置初始值

代码示例

// 类的定义
public class Person {// 成员变量private String name;private int age;// 默认构造函数public Person() {System.out.println("默认构造函数被调用");}// 有参构造函数public Person(String name, int age) {this.name = name;this.age = age;System.out.println("有参构造函数被调用");}// 成员方法public void displayInfo() {System.out.println("Name: " + name + ", Age: " + age);}
}// 主类进行测试
public class Main {public static void main(String[] args) {// 使用无参构造函数创建对象Person person1 = new Person();// 使用有参构造函数创建对象Person person2 = new Person("Alice", 30);person1.displayInfo(); // 输出默认值或空值,取决于成员变量的初始化person2.displayInfo(); // 输出:Alice, 30}
}

3,构造函数有什么用?

构造函数通常用于创建对象进行一些初始化工作。

比如银行账户类BankAccount,这个类需要记录账户持有者的名字、账号以及初始余额。

显然一个银行账户创建时,就应该明确这个账户的所有者、账号、初始余额,构造函数中可以完成相应的初始化工作:

public class BankAccount {private String accountHolderName; // 账户持有者名字private String accountNumber;     // 账号private double balance;           // 余额// 无参构造函数public BankAccount() {this("未知", "0000000000", 0.0); // 调用另一个构造函数进行初始化}// 带参数的构造函数,用于初始化账户信息public BankAccount(String accountHolderName, String accountNumber, double balance) {// 进行参数有效性检查if (accountHolderName == null || accountNumber == null || accountNumber.isEmpty() || balance < 0) {throw new IllegalArgumentException("非法的账户信息");}// 初始化成员变量this.accountHolderName = accountHolderName;this.accountNumber = accountNumber;this.balance = balance;}// 其他方法,如存款、取款等略...// Getter和Setter方法略...
}public class Main {public static void main(String[] args) {// 使用无参构造函数创建默认账户BankAccount defaultAccount = new BankAccount();System.out.println(defaultAccount.getAccountHolderName()); // 输出:未知// 使用带参数的构造函数创建账户try {BankAccount myAccount = new BankAccount("张三", "1234567890", 1000.0);System.out.println(myAccount.getAccountHolderName()); // 输出:张三System.out.println(myAccount.getBalance());          // 输出:1000.0} catch (IllegalArgumentException e) {System.out.println(e.getMessage());}}
}

在这个例子中,BankAccount类定义了两个构造函数:一个是无参构造函数,它默认初始化账户持有者名为“未知”,账号为一串零,余额为0;另一个构造函数接受三个参数,用于初始化账户的具体信息。

在带参数的构造函数中,还包含了对输入参数的合法性检查,如果提供的参数不合法(如负数余额),则抛出异常,阻止创建不合法的账户对象。

六,成员方法

点击这里查看成员方法的详细说明

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

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

相关文章

服务案例|网络攻击事件的排查与修复

LinkSLA智能运维管家V6.0版支持通过SNMP Trap对设备进行监控告警&#xff0c;Trap是一种主动推送网络设备事件或告警消息的方式&#xff0c;与SNMP轮询&#xff08;polling&#xff09;不同&#xff0c;具有以下几点优势&#xff1a; 1. 实时监控与快速响应 SNMP Trap能够实时…

如何在操作系统中合并 PDF 文件?不同系统有不同的方法

Windows 系统 在 Windows 系统中想要合并 PDF 文件我们可能需要借助一些第三方的软件或者浏览器的插件。 我们可以在 Google 浏览器中的 Chrome 应用商店中输入“Merge pdf”这样就可以搜索到在线合并 PDF 文件的插件&#xff0c;只需要下载到浏览器中就可以直接使用。当然 Ed…

【Unity Shader入门精要 第11章】让画面动起来(二)

1. 顶点动画的原理 顶点动画的原理是&#xff0c;在顶点着色器中按照一定的规则或函数计算得到一段偏移量对顶点进行移动&#xff0c;最后将改变位置后的顶点变换到裁剪空间进行后续的渲染工作。 可见&#xff0c;与纹理动画只是改变从纹理中哪一部分开始显示图案不同&#x…

visual studis 安装教程

1、下载软件 2、直接安装。根据自己的需求选择需要的模板类型。 如果是.net环境&#xff0c;可以选择.net项目&#xff1b; 如果是c环境&#xff0c;可以选择c项目模板&#xff0c;多个模板可以同时并存。 3、选择C模板&#xff0c;然后重新启动项目。 我是小路&#xff0c;一枚…

使用小猪APP分发打造高效的App封装工具

你是否曾经因为App封装和分发的复杂性而头疼不已&#xff1f;在这个移动应用迅速发展的时代&#xff0c;开发人员不仅需要专注于应用的功能和用户体验&#xff0c;还必须面对繁琐的封装和分发过程。幸运的是&#xff0c;小猪APP分发www.appzhu.cn正好为我们提供了一个简便而高效…

手绘任意波

更多内容&#xff0c;请访问我的网站&#xff1a;https://jiangge12.github.io/ 上位机发送手绘波形数据&#xff0c;下位机接收并输出。 支持 STM32 STC arduino Pico 等多种单片机&#xff0c;内置或外置 DAC 实现。

【学习Day1】计算机基础

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 1.1 中央处理单元CPU 中央处理器&#xff08;CPU&#xff0c;central processing unit&…

在全志H616核桃派开发板上进行音频配置的方法详解

耳机口​ 核桃派板载的3.5mm音频输出口&#xff0c;该接口有一定的输出功率&#xff0c;可以使用耳机或者带功放的扬声器都可以播放声音。 查看音频设备​ 可以使用下面指令来查看音频信息&#xff1a; aplay -l音频播放测试​ 播放系统自带wav音频文件测试, 下面指令的au…

控制台生产厂家生产流程详解

控制台生产厂家的生产流程是一个复杂而精细的过程&#xff0c;它涉及多个环节&#xff0c;从原材料的准备到最终产品的出厂检验&#xff0c;每一步都至关重要。以下是控制台生产厂家的一般生产流程&#xff1a; 厂家会根据客户的需求和市场趋势进行产品设计。设计师会综合考虑控…

闪电加载:Hexo博客性能优化全攻略

巴索罗缪大熊 前言 这些年积累了很多前端性能优化的知识点和思路&#xff0c;日常工作很少涉及技术层极限优化&#xff0c;近期终于一点点把博客独立搭建并部署了&#xff0c;对之前的一些技术点进行了深度探索&#xff0c;最终结果也达到了预期效果&#xff0c;由于水平有限&…

河北奥润顺达集团研究院PMO经理常江南受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 河北奥润顺达集团研究院PMO经理、研发部运营管理办负责人常江南先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“初建PMO的体系宣贯和人员培养实践总结”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xf…

如何利用云平台上更好地规划安全生产教育与培训

在平台上进行安全教育和培训&#xff0c;可以采取以下步骤和策略&#xff0c;以确保教育的有效性和参与度&#xff1a; 一、明确教育目标和培训内容 确定教育目标&#xff1a;明确希望员工通过培训达到的安全意识和技能水平。 制定培训内容&#xff1a;根据行业特点、岗位需求…

centos7安装python-gdal环境

python3 yum install python3 python3-pip -y gdal-3.6.2 参考编译postgis python安装gdal export CPLUS_INCLUDE_PATH/usr/local/gdal-3.6.2/include export C_INCLUDE_PATH/usr/local/gdal-3.6.2/include export LDFLAGS"-L/usr/local/gdal-3.6.2/lib64" pip3…

wordpress子比主题文章付费发卡插件

插件仅适用于子比主题 插件演示 免费下载 &#xff1a;子比主题文章付费发卡插件_麦田吧 如下图&#xff0c;添加卡密支持批量添加&#xff0c;按照卡号&#xff08;英文逗号/空格/—-&#xff09;密码的格式输入&#xff0c;一行一条&#xff0c;可以直接添加数据&#xff0…

​​人工智能_大模型083_大模型时代机遇02_提示词优化开发工具_立项_计量模式_真实需求_5why法---人工智能工作笔记0218

上一节我们提供了一个非常好用的提示词,优化开发的,调试工具 vellum 可以看到是这个工具 使用的时候,写完一段提示词,可以选择不同的模型,看看给出的效果情况 对应的模型非常多. ### 立项在立项阶段,要对这三个要素有初步的答案:1. 真实需求是什么? 2. 商业模式是什么? 3…

Tomcat端口配置和网页浏览

安装完成Tomcat后&#xff0c;到安装目录里看到内容如下&#xff1a; 各文件夹作用 bin&#xff1a;可执行文件&#xff08;启动文件startup.bat、关闭文件shutdown.bat&#xff09;conf&#xff1a;配置文件&#xff08;修改端口号&#xff1a;server.xml&#xff0c;建议将s…

[自动驾驶技术]-5 Tesla自动驾驶方案之算法(AI Day 2021)

有朋友问我&#xff0c;如何有效学习一个新技术。笔者这么多年的经验是&#xff1a;1&#xff09;了解国内外产业应用和标准法规现状&#xff0c;先建立宏观知识图谱及技术系统框架&#xff1b;2&#xff09;根据系统框架逐块进行深入研究&#xff08;横向、纵向&#xff09;&a…

【html+css(大作业)】二级菜单导航栏

目录 实现效果 代码及其解释 html部分 CSS部分 hello&#xff0c;hello好久不见&#xff01; 今天我们来写二级导航栏&#xff0c;所谓二级导航栏&#xff0c;简单来说就是鼠标放上去就有菜单拉出&#xff1a; 实现效果 代码及其解释 html部分 <!DOCTYPE html> &l…

嵌入式进阶——矩阵键盘

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 矩阵按键原理图按键状态检测单行按键状态检测多行按键状态检测 状态记录状态优化循环优化 矩阵按键 矩阵键盘是一种常见的数字输入…

Databend 开源周报第 146 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持 Expressio…