当前位置: 首页 > news >正文

Java类和对象(1)

🐵本篇文章将会开始对类和对象的第一部分讲解


一、简单描述类和对象

对象可以理解为一个实体,在现实生活中,比如在创建一个建筑之前,要先有一个蓝图,这个蓝图用来描述这个建筑的各种属性;此时蓝图就是类,建筑就是对象,简单来说类是用来描述对象的

二、类的定义

类是我们自定义的类型,在定义类时要用到class关键字

class 类名 {

}

类中的内容由成员变量(或属性)和成员方法组成,在方法外、类内定义的变量称为成员变量(在方法内定义的变量是局部变量),下面定义一个日期类:

class Date {public int year;public int month;public int day;public void fun() {System.out.println("2023");}
}

注:此处成员变量均由public修饰,此处的成员方法不加static,这些后面会详细解释

之前说过一个文件只能有一个被public修饰的类,不要轻易去改这个类的名字,如要修改,见下图

这样修改被public修饰类的名字的前提是在该文件中只有一个类

三、 类的实例化

对象是一个实体,在产生实体之前,要先用类来描述这个实体,通过类创建对象的过程叫作类的实例化,在Java中采用new关键字配合类名来实例化对象

public static void main(String[] args) {Date d1 = new Date(); //通过new来实例化一个对象,Date是类名,d1是对象的引用d1.year = 2024; //通过.来访问对象的属性和方法d1.month = 1;d1.day = 1;
}

总结:使用new关键字创建对象,每创建一个对象,在内存中就会为对象开辟一块空间,在这块空间中存储的就是对象的属性,对象的属性是在类中定义的;通过.可以访问对象的属性和方法,而对象的引用指向这块内存空间,其类型就是我们创建的类(我们自定义的类型)

四、 类和对象的注意事项

1. 引用不能指向引用,引用只能指向对象

Dog dog1 = new Dog(); //Dog是一个类
Dog dog2 = new Dog();
dog1 = dog2; //这里让dog1指向dog2所指向的对象

创建完两个对象后,在堆区分别开辟了两块内存空间,dog1和dog2是对象的引用且分别指向这两块空间,执行完dog1 = dog2;这条语句后dog1和dog2都指向dog2指向的对象,而原来被dog1指向的对象的内存空间会被JVM回收

2. 一个引用只能指向一个对象

Dog dog3 = new Dog();
dog3 = new Dog();
dog3 = new Dog(); //dog3指向的是这个对象,前面两个对象没有被任何引用指向时会被JVM回收

3. 当对象的引用等于null时,意味着该引用不指向任何对象,并不是指向null对象

Dog dog4 = null;

五、练习:交换两个数的值

class Value {public int val;
}
public class Test {public static void main(String[] args) {//创建两个对象Value x = new Value();Value y = new Value();//对对象的属性进行赋值x.val = 10;y.val = 20;//交换swap(x, y);//打印System.out.println(x.val);System.out.println(y.val);}public static void swap(Value x1, Value y1) {int tmp = x1.val;x1.val = y1.val;y1.val = tmp;}
}

六、this引用

6.1 this讲解

this是指向当前对象的引用,举个例子:

class Date {public int year;public int month;public int day;public void setDate(int year, int month, int day) {this.year = year; //这里的this指向的就是d这个引用所指向的对象this.month = month;this.day = day;}
}
public class Test {public static void main(String[] args) {Date d = new Date();d.setDate(2023, 11, 11);}
}

上述代码中如果不加this,那么在setDate这个方法中就不能完成对成员变量赋值的目的,因为方法中的year、month、day都被认为是形参(名字和形参相同),形参是局部变量,局部变量优先;

this从何而来:实际上,每一个成员方法的第一个参数就是this引用,编译器会自动将调用这个方法的对象传给this,简而言之,谁调用这个方法谁就是this,上述代码中this和d都指向同一个对象

6.2 this注意事项

1. this只能在成员方法中使用

2. this.成员变量===>访问成员变量

3. this.成员方法===>访问当前类的成员方法

public void setDate(Date this, int year, int month, int day) {this.year = year;this.month = month;this.day = day;this.printDate();
}
public void printDate() {System.out.println(year+" "+month+" "+day);
}

4. this()===>调用当前类的构造方法 (接下来会讲)

5. this不能出现在静态方法内部(后面会讲)

七、 对象的构造和初始化

7.1 默认初始化

class Date {public int year;public int month;public int day;
}

成员变量在没有初始化时被使用,编译也会顺利通过,这是因为成员变量被定义后会被默认初始化为零值,上述代码的成员变量都被默认为0,boolean型变量被默认为false,char型变量被默认为'\u0000',引用型变量被默认为null

7.2 就地初始化

class Date {public int year = 2024;public int month = 1;public int day = 1;
}

就地初始化就是在声明成员变量时就赋初始值

7.3 构造方法

构造方法一般是用来初始化对象的,构造方法定义在类中,它也是一种成员方法,构造方法的方法名必须和当前类的名字相同,且没有返回值(注意:并不是返回值类型为void,而是在构造方法中没有返回值这一概念)

在使用new创建完对象后,编译器就会调用构造方法,如果我们自己没有写构造方法,那编译器也会去调用不带参数的默认的构造方法,默认的构造方法如下:

class Date {public int year;//默认的构造方法,该构造方法不会显示在编译器上但也可以自己写public Date() {}
}

也可以自己写构造方法,-构造方法可以写多个,那么当有多个构造方法时,实例化对象会调用合适的构造方法

class Value {public int val;public Value(int x) { //调用这个方法this.val = x;}public Value() {this.val = 20;}}
public class Test {public static void main(String[] args) {//只传一个参数,那就会调用有一个形参的构造方法Value v = new Value(20);}
}

通过this()来调用当前类的构造方法,注意this这条语句必须放在成员方法的第一句

class Value {public int val;public Value(int x) { //x = 20;this(); //必须放在第一句,否则编译会报错this.val = x;System.out.println(this.val);}public Value() {System.out.println("调用了这个构造方法");}
}

当我们写了构造方法后,编译器不会再调用默认的构造方法,该构造方法也需要我们自己去写

class Value {public int val;public Value(int x) {this.val = x;System.out.println(this.val);}
}public class Test {public static void main(String[] args) {Value v = new Value(20);Value v1 = new Value(); //这样编译会报错,必须写一个无参的构造方法}
}

🙉那么本篇文章到此结束,接下会继续对类和对象的相关知识进行讲解

相关文章:

Java类和对象(1)

🐵本篇文章将会开始对类和对象的第一部分讲解 一、简单描述类和对象 对象可以理解为一个实体,在现实生活中,比如在创建一个建筑之前,要先有一个蓝图,这个蓝图用来描述这个建筑的各种属性;此时蓝图就是类&a…...

百度上海智能研发中心一面

Prometheus告警机制原理 介绍hashmap和concurrentHashmap concurrentHashmap和hashmap如果线程1在遍历 另一个线程对这个map进行修改操作 会发生什么现象 对线程安全的理解 通过什么方法解决线程安全 除了上锁 CAS等还有其他手段 不用锁的话 (集合的类设计成一…...

硝烟后的茶歇 | 中睿天下谈攻防演练之邮件攻击溯源实战分享

近日,由中国信息协会信息安全专业委员会、深圳市CIO协会、PCSA安全能力者联盟主办的《硝烟后的茶歇广东站》主题故事会在深圳成功召开。活动已连续举办四年四期,共性智慧逐步形成《年度红蓝攻防系列全景图》、《三化六防“挂图作战”》等共性研究重要成果…...

Leetcode Hot 100之四:283. 移动零+11. 盛最多水的容器

283.移动零 题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] …...

景联文科技助力金融机构强化身份验证,提供高质量人像采集服务

随着社会的数字化和智能化进程的加速,人像采集在金融机构身份认证领域中发挥重要作用,为人们的生活带来更多便利和安全保障。 金融机构在身份验证上的痛点主要包括以下方面: 身份盗用和欺诈风险:传统身份验证方式可能存在漏洞&am…...

Spring Cloud LoadBalancer基础知识

LoadBalancer 概念常见的负载均衡策略使用随机选择的负载均衡策略创建随机选择负载均衡器配置 Nacos 权重负载均衡器创建 Nacos 负载均衡器配置 自定义负载均衡器(根据IP哈希策略选择)创建自定义负载均衡器封装自定义负载均衡器配置 缓存 概念 LoadBalancer(负载均衡器)是一种…...

剖析WPF模板机制的内部实现

剖析WPF模板机制的内部实现 众所周知,在WPF框架中,Visual类是可以提供渲染(render)支持的最顶层的类,所有可视化元素(包括UIElement、FrameworkElment、Control等)都直接或间接继承自Visual类。…...

计算机网络常见的名词解释

计算机网络常见的名词解释 1.应用层2.传输层3. 网络层4.链路层5. 无线网络和移动网络6.计算机网络中的安全 1.应用层 API (Application Programming Interface)应用程序编程接口HTTP (Hyper Text Transfer Protocol) 超文本传输协…...

Android Studio导入,删除第三方库

Android项目经常用到无私的程序员们提供的第三方类库。本篇博客就是实现第三方库的导入和删除。 一、导入第三方库 1、将需要的库下载到本地; 2、新建Moudle (1)File --- New Moudle (2)选择Android Library --- Next (3)填写Moudle名 --- Finish。一个新的Mou…...

生成指定长度的随机数字,用对方法精准提效数10倍!

生成指定长度的随机数字这一函数功能可能在以下情况下被使用: 密码生成:在需要生成随机密码时,可以使用该功能生成指定长度的随机数字作为密码。 随机数生成:在需要生成一定长度的随机数列时,可以使用该功能生成随机…...

Vue3 + Naive-ui Data Table 分页页码显示不全

当使用naive-ui 表格并且使用分页组件的时候 需要增加 remote...

机器学习中的决策阈值

什么是决策阈值? sklearn不允许我们直接设置决策阈值,但它允许我们访问用于进行预测的决策分数(决策函数o/p)。我们可以从决策函数输出中选择最佳得分并将其设置为决策阈值,并且将小于该决策阈值的所有那些决策得分值…...

mongodb导出聚合查询的数据

❗️❗️❗️在正文之前先要讲一个坑,就是mongoexport这个命令工具不支持导出聚合查询的数据,比如通过某某字段来分组 我查了一天关于mongoexport怎么来导出聚合查询的结果集,最终还是gpt给了我答案 😭 既然mongoexport不支持&…...

U-Mail信创邮件系统解决方案

近年来,在国家政策的大力引导和自身数字化转型需求驱动下,国产化成为国内数字化发展道路上的关键词,企业不断加强自主创新能力,进行信创建设,实现软硬件系统国产化替代,已成为大势所趋。邮件系统作为企业管…...

GUI:贪吃蛇

以上是准备工作 Data import javax.swing.*; import java.net.URL;public class Data {public static URL headerURLData.class.getResource("static/header.png");public static ImageIcon header new ImageIcon(headerURL);public static URL upURLData.class.getR…...

leaflet:个性化配置,利用Leaflet-Geoman绘制多种图形(136)

第136个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中个性化配置,利用Leaflet-Geoman绘制多种图形。 灵活地配置Leaflet-Geoman的属性,可以产生各种美妙的绘图效果。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方…...

【Shell脚本8】Shell printf 命令

Shell printf 命令 printf 命令模仿 C 程序库(library)里的 printf() 程序。 printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。 printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化…...

CSAPP第4章:RISC和CISC指令集

RISC和CISC指令集 IA32被称为复杂指令集计算机(CISC),与精简指令集计算机(RISC)相对。 从历史上看,先出现了CISC机器,计算机不断发展使指令集非常大。 RISC设计理念在80年代早期发展,使用更简单的指令集产生高效的代码。 许多加…...

【LeetCode】每日一题 2023_11_9 逃离火灾(bfs 练习)

文章目录 刷题前唠嗑题目:最长平衡子字符串题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode? 启动!!! 嗯?什么?今天是 hard?陷入沉思。。。先看看题吧 题目:最长平…...

flink1.18.0 自适应调度器 资源弹性缩放 flink帮你决定并行度

jobmanager.scheduler Elastic Scaling | Apache Flink 配置文件修改并重启flink后,webui上会显示调整并行度的按钮,他可以自己调整,你也可以通过webUI手动调整: 点击 之后: 调整完成后:...

网管小白必看:华为交换机端口OID索引值到底怎么查?一个命令搞定监控配置

华为交换机端口OID索引实战指南:从原理到监控配置全解析 为什么我们需要关注端口OID索引? 刚接触网络监控的新手工程师们,经常会遇到一个看似简单却让人抓狂的问题:监控系统里那些密密麻麻的端口流量数据,到底对应着机…...

【VSCode工业级调试适配指南】:20年嵌入式老兵亲授5大硬核配置技巧,让JTAG/SWD调试效率提升300%

更多请点击: https://intelliparadigm.com 第一章:VSCode工业级调试适配的底层逻辑与演进路径 VSCode 的调试能力并非基于独立运行的调试器,而是通过标准化协议与外部调试后端协同工作。其核心是 Debug Adapter Protocol(DAP&…...

3分钟掌握跨平台资源下载神器:res-downloader完整使用指南

3分钟掌握跨平台资源下载神器:res-downloader完整使用指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 还在为…...

小白必看!零技术、零代码,用Open Claw 1688接口搞定选品监控

作为一个电商小白,刚开始做无货源、小铺的时候,我真的被选品逼疯过——完全不懂代码,看到别人说“爬虫选品”“接口对接”就头大,生怕自己学不会;手动在1688翻款,每天翻一下午,眼睛都看花了&…...

别再折腾MCP2515了!手把手教你用ESP32内置TWAI外设实现CAN通信(附完整代码与500K波特率避坑指南)

ESP32内置TWAI外设实战:抛弃MCP2515的高效CAN通信方案 当我在智能家居控制项目中第一次尝试用ESP32连接汽车ECU时,MCP2515模块的SPI速率瓶颈让我头疼不已。直到发现ESP32内部沉睡的TWAI外设——这个被多数开发者忽视的硬件级CAN控制器,才真正…...

别再死磕Reduce Side Join了!用Map Side Join优化你的Hadoop数据处理流程(附完整代码)

突破性能瓶颈:Map Side Join在电商数据处理中的实战优化 当订单数据量突破千万级时,传统的Reduce Side Join开始显露出致命缺陷——我曾在一个深夜被报警电话惊醒,集群因OOM崩溃,而第二天早晨就是季度财报会议。这次事故让我彻底放…...

数据缺失值统计填补技术详解与实践指南

1. 缺失值统计填补技术概述在真实世界的数据分析场景中,数据缺失就像厨房里突然消失的调料瓶一样常见却又令人头疼。我处理过的医疗数据集缺失率高达37%,金融风控数据中也经常遇到20%以上的特征缺失。传统直接删除法不仅浪费数据资源,更会引入…...

【进程间通信】————匿名管道、模拟实现进程池

目录 1. 进程间通信 1.1 进程间通信的目的 1.2 进程间通信分类 2. 管道 3. 匿名管道 3.1 pipe函数 3.2 用 fork 来共享管道原理 3.3 从文件描述符角度理解 3.4 从内核角度理解 3.5 父子进程管道读写测试 3.6 管道特性 3.7 4种通信情况 3.8 管道的原子性 4. 进程…...

从零实现5大机器学习基础算法:Python代码与数学推导

1. 从零实现机器学习基础算法的必要性在机器学习领域,调用现成的库(如scikit-learn)固然方便,但真正理解算法本质的开发者都会选择自己动手实现一遍。这就像学习烹饪时,从切菜开始准备食材比直接使用预制菜更能掌握料理…...

数工-面试汇总

数据工程师面试四大块:Python 算法 SQL(重中之重) 大数据组件 (Hadoop/Spark/Hive) 数仓理论 八股阶段 1:基础恢复期(1~2 周・你现在立刻开始)Python复习:列表、字典、字符串、循环、函数刷题…...