Java入门9 类和对象
1. 面向对象的初步认知1.1 什么是面向对象Java是一门纯面向对象的语言(Object Oriented Program简称OOP)在面向对象的世界里一切皆为对象。面向对象是解决问题的一种思想主要依靠对象之间的交互完成⼀件事情。用面向对象的思想来设计程序更符合人们对事物的认知对于大型程序的设计、扩展以及维护都非常友好。1.2 面向对象与面向过程传统洗衣服过程传统的方式注重的是洗衣服的过程少了一个环节可能都不行。 而且不同衣服洗的方式时间长度拧干方式都不同处理起来就比较麻烦。如果将来要洗鞋子那 就是另⼀种方式。 按照该种方式来写代码将来扩展或者维护起来会比较麻烦。现代洗衣服过程以面向对象方式来进行处理就不关注洗衣服的过程具体洗衣机是怎么来洗衣服如何来甩干的用户不用去关心只需要将衣服放进洗衣机倒⼊洗衣粉启动开关即可通过对象之间的交互来完成的。注意面向过程和面向对象并不是一门语言而是解决问题的方法没有那个好坏之分都有其专门的应用场景。2. 类定义和使用面相对象程序设计关注的是对象而对象是现实生活中的实体比如洗衣机。但是洗衣机计算机并不认识需要开发人员告诉给计算机什么是洗衣机。上图左侧就是对洗衣机简单的描述该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认知)但是这些简化的抽象结果计算机也不能识别开发人员可以采用某种面相对象的编程语言来进行描述比如Java语言。2.1 简单认识类类是用来对⼀个实体(对象)来进行描述的主要描述该实体(对象)具有哪些属性(外观尺寸等)哪些功能(用来干啥)描述完成后计算机就可以识别了。比如洗衣机它是⼀个品牌在Java中可以将其看成是⼀个类别。属性产品品牌型号产品重量外观尺存颜色...功能洗衣烘干、定时....在Java语言中如何对上述的洗衣机类来进行定义呢2.2 类的定义格式在Java中定义类时需要用到class关键字具体语法如下class ClassName{ //创建类 friend //属性或成员变量 method //行为或成员方法 }class为定义类的关键字ClassName为类的名字{}中为类的主体。类中包含的内容称为类的成员。属性主要是用来描述类的称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能称为类的成员方法。采用Java语言将洗衣机类在计算机中定义完成经过javac编译之后形成.class文件在JVM的基础上计算机就可以识别了。注意事项• 类名注意采用大驼峰定义• 成员前写法统⼀为public后面会详细解释• 此处写的方法不带static关键字.后面会详细解释2.3 练习• 定义一个Dog类大家可以思考一下哪些是Dog的属性哪些是Dog的行为参考代码如下• 定义⼀个学生类Student大家可以思考一下哪些是Student的属性哪些是Student的行为参考代码如下注意事项1. 一般一个文件当中只定义一个类2. public修饰的类必须要和文件名相同3. 不要轻易去修改public修饰的类的名称如果要修改通过开发工具修改3. 类的实例化3.1 什么是实例化定义了一个类就相当于在计算机中定义了一种新的类型与intdouble类似只不过int和double是java语言自带的内置类型而类是用户自定义了⼀个新的类型比如上述的PetDog类和Student类。它们都是类(⼀种新定义的类型)有了这些⾃定义的类型之后就可以使用这些类来定义实例(或者称为对象)。用类类型创建对象的过程称为类的实例化在java中采用new关键字配合类名来实例化对象。3.2 如何访问对象当中的成员注意事项• new关键字用于创建一个对象的实例.• 使用来访问对象中的属性和方法.• 同一个类可以创建多个实例.3.3 类和对象的再次理解1.类只是一个模型⼀样的东西用来对⼀个实体进行描述限定了类有哪些成员.2.类是⼀种自定义的类型可以用来定义变量.3. ⼀个类可以实例化出多个对象实例化出的对象占用实际的物理空间存储类成员变量4. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子类就像是设计图只设计出需要什么东西但是并没有实体的建筑存在同样类也只是⼀个设计实例化出的对象才能实际存储数据占用物理空间。4. this关键字4.1 为什么要有this引用如下代码定义了一个Date类Date类中包含3个属性分别是yearmonthday。分别使用setDay和 printDate对进行设置和打印日期。提出2个疑问1. 形参名不小心与成员变量名相同会发生什么public void setDay(int year, int month, int day){ year year; month month; day day; }首先要搞清楚括号里的year,month,day都是形参需要接收新的数据来填充。而类中方法外的year,month,day则是成员变量成员变量有对应的默认值比如当前三个属性都是int类型所以成员变量默认值都是0我们现在的目的就是想成员变量year 形参接收到的year如果没有this关键字Java程序就会优先把左右两边同名的year,month,day都当成形参就会变成形参year 形参year这样我们的成员变量就没有改变还是默认值0无法达到我们的目的。而this关键字就是将左边同名的year,month,day都标明是成员变量这样就可以解决同名导致的问题。4.2 this是什么this引用指向当前对象(成员方法运行时调用该成员方法的对象)在成员方法中所有成员变量的操作都是通过该引用去访问。只不过所有的操作对用户是透明的即用户不需要来传递编译器自动完成。此时通过指定this就能正确解决上述的2个问题了。这里之所以可以起作用关键点在于this代表的是当前对象的引用当前对象就是指哪个对象调用setDay2方法谁就是this引用4.3 this引用的特性1. this的类型对应类类型引用即哪个对象调用就是哪个对象的引用类型2. this只能在成员方法中使用3. 在成员方法非静态成员方法中this只能引用当前对象不能再引用其他对象4. this是“成员方法”第⼀个隐藏的参数编译器会自动传递在成员方法执行时编译器会负责将调用成员方法对象的引用传递给该成员方法this负责来接收5. this的使用总结this.成员变量 //访问对象的成员变量 this.成员方法 //访问对象的成员方法事实上我们也可以通过this来访问构造方法那么什么是构造方法呢5. 对象的构造及初始化5.1 如何初始化对象中的成员变量通过前面知识点的学习知道在Java方法内部定义一个局部变量时必须要初始化否则会编译失败。public static void main(String[] args) { int a; System.out.println(a); } // Error:(26, 28) java: 可能尚未初始化变量a要让上述代码通过编译非常简单只需在正式使用a之前给a设置一个初始值即可。如果是对象public static void main(String[] args) { Date d new Date(); d.printDate(); d.setDate(2021,6,9); d.printDate(); } // 代码可以正常通过编译需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题1. 每次对象创建好后调用SetDate方法设置具体日期比较麻烦那对象该如何初始化2. 局部变量必须要初始化才能使用为什么字段声明之后没有给值依然可以使用5.2 默认初始化public class Date { public int year; public int month; public int day; public static void main(String[] args) { // 此处a没有初始化编译时报错 // Error:(24, 28) java: 可能尚未初始化变量a // int a; // System.out.println(a); Date d new Date(); System.out.println(d.year); System.out.println(d.month); System.out.println(d.day); } }对于成员变量来说如果没有进行初始化会有一个对应的默认值默认值遵循如下规则5.3 就地初始化在声明成员变量时就直接给出了初始值。public class Date { public int year 1900; public int month 1; public int day 1; public Date(){ } public Date(int year, int month, int day) { } public static void main(String[] args) { Date d1 new Date(2021,6,9); Date d2 new Date(); } }5.4 构造方法初始化5.4.1 构造方法概念构造方法(也称为构造器)是⼀个特殊的成员方法名字必须与类名相同在创建对象时由编译器自动调用并且在整个对象的生命周期内只调用一次。5.4.2 构造方法注意事项1. 名字必须与类名相同2. 没有返回值类型设置为void也不行3. 创建对象时由编译器自动调用并且在对象的生命周期内只调用一次(相当于人的出生每个人只能出生一次)4. 构造方法可以重载用户根据自己的需求提供不同参数的构造方法)public class Date { public int year; public int month; public int day; // ⽆参构造⽅法 public Date(){ this.year 1900; this.month 1; this.day 1; } // 带有三个参数的构造⽅法 public Date(int year, int month, int day) { this.year year; this.month month; this.day day; } public void printDate(){ System.out.println(year - month - day); } public static void main(String[] args) { Date d new Date(); d.printDate(); }上述两个构造方法名字相同参数列表不同因此构成了方法重载。5. 如果用户没有显式定义编译器会生成⼀份默认的构造方法生成的默认构造方法⼀定是无参的。public class Date { public int year; public int month; public int day; public void printDate(){ System.out.println(year - month - day); } public static void main(String[] args) { Date d new Date(); d.printDate(); } }上述Date类中没有定义任何构造方法编译器会默认生成⼀个不带参数的构造方法。6. 构造方法中可以通过this调用其他构造方法来简化代码public class Date { public int year; public int month; public int day; public Date(){ this(1900, 1, 1); } // 带有三个参数的构造⽅法 public Date(int year, int month, int day) { this.year year; this.month month; this.day day; } }• this(...)必须是构造方法中第⼀条语句• 不能形成环的调用public Date(){ this(1900,1,1); } public Date(int year, int month, int day) { this(); }7. 绝大多数情况下使用public来修饰特殊场景下会被private修饰(后序讲单例模式时会遇到)6. 对象的打印如果我们直接打印对象的引用此时输出的结果为类路径名对象的hashcode值。public class Person { String name; String gender; int age; public Person(String name, String gender, int age) { this.name name; this.gender gender; this.age age; } public static void main(String[] args) { Person person new Person(Jim,男, 18); System.out.println(person); } }如果想要默认打印对象中的属性该如何处理呢答案重写toString方法即可public class Person { String name; String gender; int age; public Person(String name, String gender, int age) { this.name name; this.gender gender; this.age age; } Override public String toString() { return [ name , gender , age ]; } public static void main(String[] args) { Person person new Person(Jim,男, 18); System.out.println(person); } } // 输出结果[Jim,男,18]

相关新闻

Arduino-LMIC区域配置指南:EU868/US915/AU915等频段设置

Arduino-LMIC区域配置指南:EU868/US915/AU915等频段设置

Arduino-LMIC区域配置指南:EU868/US915/AU915等频段设置 【免费下载链接】arduino-lmic LoraWAN-MAC-in-C library, adapted to run under the Arduino environment 项目地址: https://gitcode.com/gh_mirrors/ard/arduino-lmic Arduino-LMIC是一款强大的LoR…

2026/10/18 14:46:12 阅读更多 →
SAE vs SAELens:为什么动态计算激活比缓存更适合大规模模型?

SAE vs SAELens:为什么动态计算激活比缓存更适合大规模模型?

SAE vs SAELens:为什么动态计算激活比缓存更适合大规模模型? 【免费下载链接】sae Sparsify transformers with SAEs and transcoders 项目地址: https://gitcode.com/gh_mirrors/sae/sae SAE(稀疏自动编码器)是提升大规模…

2026/10/20 4:47:14 阅读更多 →
cuPCL核心功能解析:ICP、NDT、滤波与分割的CUDA实现原理

cuPCL核心功能解析:ICP、NDT、滤波与分割的CUDA实现原理

cuPCL核心功能解析:ICP、NDT、滤波与分割的CUDA实现原理 【免费下载链接】cuPCL A project demonstrating how to use the libs of cuPCL. 项目地址: https://gitcode.com/gh_mirrors/cu/cuPCL cuPCL是一个基于CUDA加速的点云处理库,通过GPU并行计…

2026/10/19 13:05:56 阅读更多 →

最新新闻

多模态模型意图歧义破解:VisInteract交互搜索机制与工程实践

多模态模型意图歧义破解:VisInteract交互搜索机制与工程实践

1. 从“自作主张”说起:多模态模型到底缺了什么做过多模态大模型应用的人大概都有过这种体验:你给模型一张图,问它“这个东西怎么用”,它洋洋洒洒给你写了一大段,看起来头头是道,但仔细一读,它回…

2026/10/20 5:24:06 阅读更多 →
提示词工程实战:学会和AI把话说清楚的技术

提示词工程实战:学会和AI把话说清楚的技术

先聊个现象。最近一年,身边越来越多非技术背景的朋友开始频繁使用ChatGPT,但同一款工具,有人拿它几分钟产出一份结构完整的活动方案,有人却只能在“帮我写个文案”这种模糊指令里反复打转,最后抱怨AI“不够聪明”。差距…

2026/10/20 5:24:06 阅读更多 →
大模型与数据库集成实战:从Text-to-SQL到查询调度链路设计

大模型与数据库集成实战:从Text-to-SQL到查询调度链路设计

大模型和数据库集成这件事,听起来像是个技术组合题,但真正把它推到商业化场景里,你会发现架构设计远不止“接个API、调个向量库”那么简单。我这两年带着团队做了几个从原型到生产落地的项目,其中一个跨平台的业务问答系统最有代表…

2026/10/20 5:24:06 阅读更多 →
FIVM-RBF:特征重要性加权增强RBF神经网络的回归预测

FIVM-RBF:特征重要性加权增强RBF神经网络的回归预测

FIVM-RBF这名字听起来像论文标题,实际上拆开就是Feature Importance Weighting(特征重要性加权)RBF神经网络。简单说就是先算一下哪些输入特征对预测目标影响大,给它们加权,再送进径向基网络做非线性回归。很多人一看到"创新方法"就…

2026/10/20 5:24:06 阅读更多 →
多模态意图搜索:VisInteract交互式框架与工程实践

多模态意图搜索:VisInteract交互式框架与工程实践

1. 从“自作主张”说起:多模态模型到底缺了什么做过多模态应用的人大概都有过这种体验:你给模型一张图,问它“这个东西怎么用”,它洋洋洒洒给你写了一大段,看起来头头是道,但仔细一读,它回答的根…

2026/10/20 5:24:06 阅读更多 →
Unity Shader技巧:移动端伪次表面散射模拟实战

Unity Shader技巧:移动端伪次表面散射模拟实战

1. 为什么我要写一篇“假”的次表面散射先聊点实在的。在Unity里做皮肤、蜡烛、树叶、大理石这类材质时,大家第一反应都是上真正的次表面散射(Subsurface Scattering,SSS)——就是光打进去之后在物体内部散射、再从其他地方溢出来…

2026/10/20 5:23:05 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →