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;另一个构造函数接受三个参数,用于初始化账户的具体信息。

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

六,成员方法

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机SCI期刊,IF=8+,专业性强,潜力新刊!

一、期刊名称 Journal of Big data 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;8.1 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$1990 三、期刊征稿范围 《大数据杂志》发表了关于…

dp秒杀优惠券

1、全局id生成器 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显受单表数据量的限制 场景分析&#xff1a;如果我们的id具有太明显的规则&#xff0c;用户或者…

在HTML和CSS当中运用显示隐藏

1.显示与隐藏 盒子显示:display:block;盒子隐藏: display:none:隐藏该元素并且该元素所占的空间也不存在了。 visibility:hidden:隐藏该元素但是该元素所占的内存空间还存在&#xff0c;即“隐身效果”。 2.圆角边框 在CSS2中添加圆角&#xff0c;我们不得不使用背景图像&am…

基于51单片机的DS18B20温度报警器

摘 要&#xff1a;单片机技术已经普及到我们生活&#xff0c;工作&#xff0c;科研&#xff0c;各个领域&#xff0c;已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度器&#xff0c;本温度计属于多功能温度计&#xff0c;可以设置上下报警温度&#xff0c;…

生产者延迟消息和重试机制

messageDelayLevel1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h 延迟消息级别public PutMessageResult putMessage(final MessageExtBrokerInner msg) {//事务消息处理if (tranType MessageSysFlag.TRANSACTION_NOT_TYPE|| tranType MessageSysFlag.TRANSACT…

静态测试---基于WorkList的活跃变量分析

本文主要用于记录在活跃变量分析实验中的报错及解决&#xff0c;涉及静态测试的详细原理内容较少&#xff0c;编译运行底层逻辑偏多。 一、实验要求 1&#xff09;使用llvm基于框架实现一个基于WorkList的活跃变量分析demo。变量在某个程序点有两种状态&#xff0c;live 或 dea…

如何用俄语预定酒店,柯桥外贸俄语培训

-Привет, Алекс! Как твои дела? 你好&#xff0c;阿列克斯&#xff01;你最近好吗&#xff1f; -Отлично! Я скоро уезжаю на 10 дней в Санкт-Петербург, но никак не могу найти там…

基于高光谱数据集的创新点实现-高斯核函数卷积神经网络

一、高光谱数据集简介 1.1 数据集简介 数据集链接在这:高光谱数据集(.mat.csv)-科研学术 数据集包含下面三个文件&#xff1a; 文件中包含.mat与.csv,145x145x220, 其实主要使用avirissub.csv文件&#xff0c;在代码上只是将mat文件转成了csv文件。具体avirissub.csv如下&am…

第二十四章多栏布局解决方案(什么是自适应?/)

什么是自适应? 指能使网页自适应显示在不同大小终端设备上新网页设计方式及技术.简单的来说自适应就是让同一个页面自动适应不同大小的设备&#xff0c;从而解决为不同设备提供不同版本的页面问题。 1&#xff0e;两列自适应 两列自适应布局是指左侧固定宽度&#xff0c;右…

小程序使用Canvas设置文字竖向排列

在需要使用的js页面引入js文件,传入对应参数即可 /** * 文本竖向排列 */ function drawTextVertical(context, text, x, y) {var arrText text.split();var arrWidth arrText.map(function (letter) {return 26;});var align context.textAlign;var baseline context.…

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

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

质量工具系列之Dependency-Track

项目开发中依赖了很多第三方开源工具&#xff0c;对于其版本&#xff0c;漏洞等因为时间或者是数量太多而无法关注到&#xff0c;Dependency-Track解决这些问题。 Dependency-Track 是一个开源组件分析平台&#xff0c;是开放网络应用安全项目&#xff08;OWASP&#xff09;的一…

【自动化运营】PlugLink 1.0开源版发布

什么是PlugLink&#xff1f; PlugLink&#xff0c;顾名思义&#xff0c;就是插件的链接。它旨在帮助个人和小微企业实现运营自动化&#xff0c;通过链接脚本、API、AI大模型等&#xff0c;实现全自动工作流程。你可以把PlugLink看作一个巨大的拼装积木&#xff0c;每一个插件都…

Java解析JSON并修改属性值:从JSON到JsonObject的逐层解析

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在Java中&#xff0c;可以使用各种库来解析和操作JSON数据。其中&#xff0c;Gson和Jackson是两个非常流行且功能强大的库。在这篇文章中&#xff0c;将使用Gson库来解析给定的JSON字符串&#xff0c;修改operationB…

加氢站压缩液驱比例泵放大器

加氢站压缩液驱液压系统的要求是实现换向和速度控制&#xff0c;对液压动力机构而言&#xff0c;按原理可区分为开式&#xff08;阀控&#xff09;- 节流控制系统和闭式&#xff08;泵控&#xff09;- 容积控制系统&#xff1a; 阀控系统 – 节流调速系统&#xff1a;由BEUEC比…

Sui新共识协议刷新了区块链交易速度的标准

Sui是提供业界领先性能和无限水平扩展的创新Layer 1区块链&#xff0c;今日在官推上宣布其最新共识协议Mysticeti已成功部署到测试网。这一重大突破将Sui测试网的共识时间减少了80%&#xff0c;至390毫秒&#xff0c;同时保持协议的行业领先吞吐量。这一令人印象深刻的演示证明…

英国金融时报:波场TRON出席康奈尔大学区块链会议

近日,康奈尔区块链大会的白金赞助商波场TRON在罗斯福岛的康奈尔大学科技校区(Cornell Tech)举办多项活动,消息得到英国金融时报,费加罗报和Benzinga等权威外媒报道,这全面彰显了波场TRON的领导力。大会吸引了包括学生、学者和行业领袖等在内的 800 多名参与者,凸显了波场TRON致…

【教程】Linux部署Android安卓模拟器

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 未完成&#xff0c; 先简单记录下指令。 docker-android https://github.com/budtmo/docker-android 检查系统是否支持&#xff1a; sudo apt instal…

【ARM+Codesys案例】树莓派+Codesys软PLC方案在包装行业灌装旋盖机的应用

ARM系列支持&#xff1a;全志T3、RK3568、树莓派 机型定义&#xff1a;双工位旋盖机 旋盖机主要适用于不同规格的材质及不同规格的盖、旋&#xff08;轧&#xff09;盖。适用螺旋盖、防盗盖、防撞盖、压入盖等。压力可方便调整&#xff0c;根据瓶盖大小设置取盖位。结构紧凑、…

【Springboot】注解@JsonIgnore、@TableField、@TableId

文章目录 1.JsonIgnore2.TableField(exist false)3.TableId 1.JsonIgnore 2.TableField(exist false) 新增一个字符串字段&#xff0c;并且这个字段是不用到数据库查询的 3.TableId Mybatis-plus 出现 WHERE null?&#xff0c;此时就要加这个注解。