java类和对象(上)

前言:

不知道大家有没有将java方法的使用熟记入心呢?如果没有的话,可以打开博主的上一篇博文阅读哦,在这里谢谢大家一路的陪伴。也希望我的内容能够帮到你更快的掌握java语言的学习。接下来我们要讲的是java类和对象。让我们整理一下心情开冲吧,加油,兄弟们!!!!

本期目录:

1. 面向对象的初步认知
2. 类定义和使用
3. 类的实例化
4.this的使用

1. 面向对象的初步认知

1.1 什么是面向对象

Java 是一门纯面向对象的语言 (Object Oriented Program ,简称 OOP) ,在面向对象的世界里,一切皆为对象。 向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情 。用面向对象的思想来涉及程序,更符合人 们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

1.2 面向对象与面向过程

1. 例如传统洗衣服过程:
传统的方式: 注重的是洗衣服的过程 ,少了一个环节可能都不行。
而且不同衣服洗的方式,时间长度,拧干方式都不同,处理起来就比较麻烦。如果将来要洗鞋子,那就是另一种放方式。
按照该种方式来写代码,将来 扩展或者维护起来会比较麻烦
2. 现代洗衣服过程
面向对象方式来进行处理,就不关注洗衣服的过程 ,具体洗衣机是怎么来洗衣服,如何来甩干的,用户不用去关 心,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可, 通过对象之间的交互来完成的
注意: 面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。

2. 类定义和使用

2.1 简单认识类

类是用来对一个实体 ( 对象 ) 来进行描述的 ,主要描述该实体 ( 对象 ) 具有哪些属性 ( 外观尺寸等 ) ,哪些功能 ( 用来干啥 ) ,描述完成后计算机就可以识别了。

2.2 类的定义格式

类是一种用户自定义的数据类型,它描述了一组具有相同属性和行为的对象。通常,类的定义包括以下几个部分:

  1. 类名:用于标识这个类,应该具有描述性且符合命名规范。
  2. 属性:也称为成员变量,描述了类的状态。例如,在一个 “学生” 类中,属性可能包括姓名、年龄、学号等。
  3. 方法:也称为成员函数,描述了类的行为。例如,在 “学生” 类中,方法可能包括学习、考试考试、参加活动等
java 中定义类时需要用到 class 关键字 ,具体语法如下
// 创建类
class ClassName {
filed  //字段(属性)或者成员变量
method ; // 行为 或者 成员方法
}

其中class定义类的关键字,ClassName为类的名字,{}中为类的主体。

类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法。
采用 Java 语言将洗衣机类在计算机中定义完成,经过 javac 编译之后形成 .class 文件,在 JVM 的基础上计算机就可以识别了。
注意事项
1.类名注意采用大驼峰定义
2.成员前写法统一为 public
3.此处写的方法不带 static 关键字

2.3 类的练习

2.3.1 定义一个狗类
要求:要有狗的名字,和狗的毛发颜色 以及狗的日常行为
2.3.2 定义一个学生类
注意事项:
1. 一般一个文件当中只定义一个类
2. main 方法所在的类一般要使用 public 修饰 ( 注意: Eclipse 默认会在 public 修饰的类中找 main 方法 )
3. public 修饰的类必须要和文件名相同
4. 不要轻易去修改 public 修饰的类的名称,如果要修改,通过开发工具修改 ( 给同学演示 )

3. 类的实例化

3.1 什么是实例化

定义了一个类,就相当于在计算机中定义了一种新的类型 ,与 int double 类似,只不过 int double java 语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的: PetDog 类和 Student 类。它们都是类 ( 一种新定 义的类型 ) 有了这些自定义的类型之后,就可以使用这些类来定义实例 ( 或者称为对象 )
用类类型创建对象的过程,称为类的实例化 ,在 java 中采用 new 关键字,配合类名来实例化对象。
注意事项 :
1.new 关键字用于创建一个对象的实例 .
2.使用 . 来访问对象中的属性和方法 .
3.同一个类可以创建对个实例 .

3.2 类和对象的说明

1. 类只是 一个 模型 一样的东西,用来对一个实体进行描述,限定了类有哪些成员 .
2. 类是一种自定义的类型 ,可以用来定义变量 .
3. 一个类可以实例化出多个对象, 实例化出的对象 占用实际的物理空间,存储类成员变量
4. 做个比方。 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图 ,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空 间。

4. this引用

4.1 为什么要有this引用

以上代码定义了一个日期类,然后 main 方法中创建了三个对象,并通过 Date 类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,没有任何问题。
但是细思之下有以下两个疑问:
1. 形参名不小心与成员变量名相同
public void setDay ( int year , int month , int day ){
year = year ;
month = month ;
day = day ;
}
那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了。
2. 三个对象都在调用 setDate printDate 函数,但是这两个函数中没有任何有关对象的说明, setDate 和printDate 函数如何知道打印的是那个对象的数据呢
一切让this引用来揭开这层神秘的面纱。

4.2 this的讲解

1.区分成员变量与方法参数或局部变量

当方法的参数或局部名称变量与该类的成员变量相同(即命名冲突)时,this可以用来区分它们。没有this时,方法内的局部变量和参数会覆盖同名的成员变量,从而导致难以访问成员变量

在这个例子中,this.name显式指代当前对象的成员变量,而name单独出现时指的是方法的参数。如果没有this存在,代码将无法区分这两个变量,成员变量name可能无法正确赋值。

2.在构造方法中调用另一个构造方法

this()用于同一类的构造方法之间相互调用。设计模式称为构造器链,它允许开发者通过调用这种其他构造函数来简化代码,提高代码复用性。

这里通过使用this(name, 0),避免了重复编写初始化逻辑。如果没有this,开发者必须手动将重复的代码写入在每个构造函数中。

3.方法链调用

this可以在方法中返回当前对象的引用,用于实现链式调用(方法链接)。这种设计使得多个操作可以在一条语句中连续执行,简化代码的调用并增强了可执行性。

如果没有this链式调用将无法实现,每次操作都需要单独调用,增加代码。

4.在内部类中引用外部类实例

当你使用内部类时,this指代的是当前内部类的对象。如果需要从内部类中访问外部类的对象,可以通过来外部类名.this显式引用外部类对象。没有this,访问外部类成员的逻辑会变得复杂。

如果没有OuterClass.this这个机制内部类将无法直接访问外部类的成员。

5.引用当前对象,防止隐藏当前对象

当方法内部需要引用当前对象时,this可以显式指代当前对象,避免对象引用被隐藏的情况。它使得代码更加明确,确保在复杂的上下文中正确操作当前对象的实例。

在上面的例子中,this指代当前对象的引用,可以帮助理解当前对象的操作上下文。

总结

this的主要存在是为了解决以下问题:

  1. 避免命名冲突:帮助区分方法的局部变量或参数与类的成员变量。
  2. 构造器链:使构造函数能够相互调用,简化代码结构。
  3. 链式调用:允许多种方法连续调用,简化操作。
  4. 内部类与外部类的引用:显式区分内部类与外部类的实例。
  5. 显式当前对象引用:防止代码中当前对象时的不一致,引入引用性和维护性。

4.3 this引用的特性

1. this 的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this 只能在"成员方法" 中使用
3. " 成员方法 " 中, this只能引用当前对象,不能再引用其他对象
4. this 成员方法 第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法, this 负责来接收
在代码层面来简单演示 ---> 注意:下图右侧中的 Date 类也是可以通过编译的

5. 对象的构造及初始化

5.1 如何初始化对象

通过前面知识点的学习知道,在 Java 方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
由上我们可以看出如果没有定义a的值,则会编译失败。 要让上述代码通过编译,非常简单,只需在正式使用 a 之前,给 a 设置一个初始值即可。如果是对象:
需要调用之前写的 SetDate 方法才可以将具体的日期设置到对象中。 通过上述例子发现两个问题:
1. 每次对象创建好后调用 SetDate 方法设置具体日期,比较麻烦,那对象该如何初始化?

2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

5.2 构造方法

5.2.1 概念

构造方法 ( 也称为构造器 ) 是一个特殊的成员方法, 名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

5.2.2 特性

1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 ( 相当于人的出生,每个人只能出生一次 )
4. 构造方法可以重载 ( 用户根据自己的需求提供不同参数的构造方法 )
上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。
5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
上述 Date 类中,没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法。
注意: 一旦用户定义,编译器则不再生成。
6. 构造方法中,可以通过 this 调用其他构造方法来简化代码
注意:
1.this(...) 必须是构造方法中第一条语句
2.不能形成环
7. 绝大多数情况下使用 public 来修饰,特殊场景下会被 private 修饰 ( 后序讲单例模式时会遇到 )

5.3 默认初始化

在上文中提出的第二个问题:为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?

要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:
Date d = new Date ( 2021 , 6 , 9 );
在程序层面只是简单的一条语句,在JVM 层面需要做好多事情,下面简单介绍下:
1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题
比如:多个线程同时申请对象, JVM 要保证给对象分配的空间不冲突
4. 初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
5. 设置对象头信息 ( 关于对象内存模型后面会介绍 )
6. 调用构造方法,给对象中各个成员赋值

5.4 就地初始化

在声明成员变量时,就直接给出了初始值。
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

结语:

在 Java 的世界里,类与对象就像是构建宏伟程序大厦的基石。

 

类,是蓝图,是模板,它定义了一种事物的属性和行为规范。通过精心设计的类,我们可以将现实世界中的各种概念和实体抽象出来,转化为代码中的可操作对象。它为我们提供了一种组织和管理代码的方式,使得程序更加清晰、易于维护和扩展。

 

对象,则是类的具体实例,是真实存在于程序运行时的实体。每个对象都拥有自己独立的状态和行为,可以与其他对象相互交互,共同完成复杂的任务。对象的存在让我们能够在程序中模拟现实世界的各种情况,创造出丰富多彩的应用场景。

 

当我们深入理解和熟练运用类与对象时,就像是掌握了一把强大的魔法钥匙,可以打开通往高效编程和创新解决方案的大门。无论是开发小型的工具软件,还是构建庞大的企业级应用系统,类与对象都是我们最可靠的伙伴。

 

在未来的编程旅程中,让我们继续探索类与对象的奥秘,不断提升我们的编程技能,创造出更加精彩的软件世界。

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

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

相关文章

最新Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版图文教程

CleanMyMac X mac版下载是一款功能更加强大的系统优化清理工具,软件只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉,节省宝贵的磁盘空间。CleanMyMac X for mac相比于 CleanMyMac3来说,功能增加了不少,比如新增…

Java并发 - AQS之CountDownLatch

文章目录 基本使用源码分析awaitcountDowngetCount 可重置的CountDownLatch总结 CountDownLatch是一个多线程同步工具类,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。主要用来解决一个线程或多个线程等待另外多个线程的场景。 初始化需…

在Linux中搭建WordPress并实现Windows主机远程访问

WordPreWordPress是一个基于PHP开发的开源平台,适用于在支持PHP与MySQL数据库的服务器上搭建个性化博客或网站。同时,它也能够作为功能强大的内容管理系统(CMS)被广泛应用。 虚拟机:VirtualBox 虚拟机安装&#x1f449…

win10中mysql数据库binlog恢复

win10中mysql数据库binlog恢复 昨天有朋友江湖救急,说测试库里的表不小心删除更新了数据。这里也复习下binlog数据恢复,当然需要一定的条件:首先mysql开启binlog,然后每天需要备份对应的数据库 1 单库单表准备 在恢复数据前&am…

QT开发--文件的读写操作

第十三章 文件的读写操作 Qt提供两种读写纯文本文件的方法: 1、直接使用 QFile 类的IO功能; 2、结合 QFile 和 QTextStream,利用流(Stream)进行操作。 13.1 文件读操作 13.1.1 使用QFile类 Qt封装了QFile类,方便我们对文件进行操…

鸿蒙OS启动流程

启动流程(基于openharmony4.1) 系统上电加载内核后,按照以下流程完成系统各个服务和应用的启动: 内核加载init进程,一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。init进程启动后,会挂载tmpfs,…

bat脚本banenr

飞出个未来班得 echo off echo .-. echo ( ) echo - echo J L echo ^| ^| echo J L echo ^| ^| echo J L echo …

MySQL-表相关(DDL DML)

文章目录 表的基本操作表的创建表的删除 MySQL中的数据类型整数类型浮点数类型定点数类型日期和时间类型字符串类型charvarchartext 二进制类型 DDL语句查看建表语句修改表名新增字段修改字段(名类型)修改字段(仅类型)删除字段 DML语句insert 增delete 删truncate 语句update 改…

前端学习-CSS的三大特性(十七)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 层叠性 继承性 行高的继承性 优先级 优先级注意点 权重叠加 总结 前言 引入css特性的学习 CSS 有三个非常重要的三个特性:层叠性、继承性、优先级。 层叠…

Android 第5种启动模式:singleInstancePerTask

Android 第5种启动模式:singleInstancePerTask 随着 Android 版本的更新,应用启动模式逐渐丰富。在 Android 12 中,新增了一种启动模式——singleInstancePerTask。它是继 standard、singleTop、singleTask 和 singleInstance 之后的第五种启…

纯css 轮播图片,鼠标移入暂停 移除继续

核心 滚动&#xff1a; animation: 动画名称 20s linear infinite normal;停止&#xff1a; animation: 动画名称 20s linear infinite paused; 完整例子&#xff1a; html: <div class"carousel-wrapper"><div class"carousel"><div cl…

chrome浏览器映射端口

chrome://inspect/#devices 方法2

mysql主从复制及故障修复

一、主MySQL数据库的配置 分别在三台主机&#xff08;chen2/10.110、chen3/10.120、chen4/10.130)中安装mysql数据&#xff0c;其中chen2/10.110作为主MySQL服务器&#xff0c;其余两台作为从MySQL服务器。 1、在主机上部署mysql数据库 详细的请看上一篇&#xff1a;mysql数据…

NewStarCTF2024-Week2-Web-WP

目录 1、复读机 2、你能在一秒内打出八句英文吗 3、遗失的拉链 4、谢谢皮蛋 plus 5、PangBai 过家家&#xff08;2&#xff09; 1、复读机 测了下存在 ssti 没什么说的 fenjing 秒了 2、你能在一秒内打出八句英文吗 每次出来的需要提交的内容都不一样 exp&#xff1a; …

CUDA 全局内存

全局内存在片外。 特点是&#xff1a;容量最大、延迟最大、使用最多 全局内存中的数据是所有线程可见的&#xff0c;Host端可见&#xff0c;且具有与程序相同的生命周期 动态全局内存 主机代码使用CUDA运行时API &#xff1a; cudaMalloc 声明内存空间&#xff1b; cudaFree…

MySQL【知识改变命运】07

MySQL 1&#xff1a;Group by 分组查询1.1&#xff1a;语法&#xff1a;1.2&#xff1a;练习 2&#xff1a;having⼦句3回顾&#xff1a;3&#xff1a;内置函数3.1 :⽇期函数 1&#xff1a;Group by 分组查询 可以根据某列&#xff0c;进行分组查询&#xff0c;比如学校里面的…

基于cloudreve(Docker应用)搭建网盘服务,用于目录的分享和在线预览。

文章目录 I 基于cloudreve(Docker应用)搭建网盘服务安装主要功能设置角色最大容量II 知识扩展:网盘类的文件预览需求背景: iOS可以直接预览PDF等常见格式文件,但是Android浏览器需要先下载文件,才能查看文件内容,因此需要搭建支持目录的分享和在线预览的MinIO文件服务提供…

数据安全存储系统的概念与原理

数据安全存储系统是一种综合性的数据保护方案&#xff0c;旨在确保数据的完整性、保密性和可用性。以下是对数据安全存储系统的详细介绍&#xff1a; 一、概念与原理 数据安全存储系统通过硬件、软件和网络等多个层面的保护措施&#xff0c;防止未经授权的访问、避免数据丢失或…

【MySQL 保姆级教学】表结构的操作(4)

表结构的操作 1. 定义和语法2. 创建表 CREATE2.1 创建表的本质2.2 表的存储引擎2.3 表的字符集和校验规则2.4 创建表实例 3. 查看表结构 DESC3.1 作用3.2 示例 4. 修改表结构 ALTER4.1 添加列 ADD4.2 修改列 MODIFY4.3 删除列 DROP4.4 更改列名 CHANGE 5. 修改表名 RENAME6. 删…

一次性解决vue3引入@jiaminghi/data-view需要手动修改node_modules下文件

修改文件1&#xff1a;node_modules\jiaminghi\data-view\lib\components\decoration6\src\main.vue 修改文件2&#xff1a; node_modules\jiaminghi\data-view\lib\components\decoration3\src\main.vue 修改前&#xff1a; 修改后&#xff1a; 通过打补丁的方式对引用库进行…