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

初始Java篇(JavaSE基础语法)(5)(类和对象(上))

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客

目录

面向对象的初步认知

面向对象与面向过程的区别

类的定义和使用 

类的定义格式

类的实例化

this引用

什么是this引用?

this引用的特性

对象的构造及初始化

如何初始化对象(的成员变量)

构造方法 


本期我们就来学习面向对象。

面向对象的初步认知

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

面向对象与面向过程的区别

面向过程:注重的是过程;面向对象:注重的是对象。

例如:我们要吃饭了。首先,得找一个饭馆子,再点菜,最后再吃饭。

如果是面向过程的话,就需要关注这些过程:找饭馆子的过程,点菜,吃饭。

如果是面向对象的话,就需要关注这些对象:我们自己,饭馆子,菜。不需要关注过程了。

从这里就可以简单看出对象比过程要简单。

注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。

类的定义和使用 

类是用来描述对象的。

例如:一个学生就是一个对象(Java中一切皆对象),我们现在如果想要来描述这个学生的话,就得用类来描述。

类的定义格式

//class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
//类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。
//方法主要说明类具有哪些功能,称为类的成员方法。// 创建类
class ClassName{field; // 字段(属性) 或者 成员变量 :定义再类当中,方法外部的变量method; // 行为 或者 成员方法
}

 成员变量分为两种:一种是普通成员变量,一种是静态成员变量。

普通成员变量:public int age;      静态成员变量:public static int age;  

成员方法也分为两种:一种是普通成员方法,一种是静态成员方法。

普通成员方法:public void func()     静态成员方法:public static void func()

我们现在就来描述一个学生对象。

class Student {public String name;//名字public int age;//年龄public void func(){System.out.println("姓名:"+name+" 年龄:"+age);}
}

注意事项:类名注意采用大驼峰。定义成员前写法统一为public,后面会详细解释。此处写的方法不带 static 关键字,后面会详细解释。

练习:定义一个类:狗

class Dog{public String name;//名字public int age;//年龄public void func(){System.out.println(name+" :汪汪汪~~~");}
}

注意事项: 1. 一般一个文件当中只定义一个类(推荐),虽然可以定义多个类,但是只能有一个类被public 修饰。 2. main方法所在的类一般(不是绝对(如下图1所示)要使用public修饰。(注意:Eclipse默认会在public修饰的类中找main方法) 3. public修饰的类必须要和文件名相同 4. 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改(如下图2所示)。 5. 每一个类都会生成一个对应的字节码文件(如下图3)。

 图1:

图2:

 当只有一个类时,就可以修改成功。

当有多个类时,就会修改失败。

修改同上步骤,但修改的结果不同。

图3:

在……out / production ……目录下。 

下面是怎么查看的视频

JavaSE篇(类和对象(上))怎么查看字节码文件-CSDN直播

类的实例化

我们在定义了一个类的同时就相当于创建了一种新的类型。和int,char一样,只不过int,char这些是Java的内置类型,而类是用户自定义的类型。既然创建了类型,我们就肯定会用这个类型来定义变量。举个简单的例子:我们拿到int类型,就可以使用int类型来创建一个变量 int a = 0;  同样这个类也是可以这样的,我们把用类定义一个变量的过程称为类的实例化(我们更喜欢说是用类创建对象的过程)

public class Test {public static void main(String[] args) {//java中使用new关键字,来配合类名实例化对象Student student = new Student();//通过new来实例化对象//通过 . 来访问类的属性和方法(功能)student.name = "张三";student.age = 18;student.func();}
}//创建一个类
class Student{//属性String name;int age;//功能(方法)public void func(){System.out.println("姓名:"+name+" 年龄:"+age);}
}

注意:一个类可以实例化多个对象。

可能会有小伙伴发现:类有点像我们C语言学过的结构体。没错这个类和结构体是非常类似的。

this引用

public class Test{public static void main(String[] args) {//实例化三个对象Date date1 = new Date();Date date2 = new Date();Date date3 = new Date();//设置时间date1.SetDate(2024,3,25);date2.SetDate(2024,3,26);date3.SetDate(2024,3,27);//打印结果,看看是否设置成功date1.PrintDate();date2.PrintDate();date3.PrintDate();}
}class Date{//属性public int year;public int month;public int day;//方法public void SetDate(int y, int m, int d){year = y;month = m;day = d;}public void PrintDate(){System.out.println(year+"/"+month+"/"+day);}}

上面是最终的打印结果,由此可知我们设置的时间是对的。

但是又有一些新的问题:

1. 如果我们在设置时间的方法的参数也是year month day ,那就会发生一些错误(打印的结果是全部是0,如下图所示) 

这是什么原因造成的呢?其实我们在C语言阶段已经学习过了(当全局变量与局部变量的变量名一样时,全局变量会被屏蔽,遵循局部变量优先原则) ,同样Java中也是如此,这里的year,month,day都是局部变量,那么也就是局部变量给局部变量赋值,因此得不到我们想要的结果(为什么是0呢?后面会有解释)。

2. PrintDate方法怎么知道自己要打印谁的值呢?其实这个是比较好解释的,因为前面有 对象. 来说明是在哪个对象下调用这个方法。

上述的所有问题都可以用 this 来解决。我们首先来说第二点,其实上面那个解释是没问题的,但如果我们用更底层的知识来解释的话,就是用this引用来解释。

什么是this引用?

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。

那上面的代码我们就可以改成下面:

public class Test{public static void main(String[] args) {//实例化三个对象Date date1 = new Date();Date date2 = new Date();Date date3 = new Date();//设置时间date1.SetDate(2024,3,25);date2.SetDate(2024,3,26);date3.SetDate(2024,3,27);//打印结果,看看是否设置成功date1.PrintDate();date2.PrintDate();date3.PrintDate();}
}class Date{//属性public int year;public int month;public int day;//方法public void SetDate(int year, int month, int day){//这个也就声明了是当前对象this.year = year;this.month = month;this.day = day;}public void PrintDate(){//即使能够识别,我们也要加上thisSystem.out.println(this.year+"/"+this.month+"/"+this.day);}}

注意:this引用指向的是调用成员方法的对象 。

this引用的特性

1. this的类型:对应类的类型引用,即哪个对象调用就是哪个对象的引用类型(谁调用this所在的方法,this就指向谁)。

2. this只能在"成员方法"中使用。

3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象。

4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法的对象的引用传递给该成员方法,this负责来接收。

因此我们以后调用成员方法或者成员变量时,都应该加上this。

对象的构造及初始化

如何初始化对象(的成员变量)

通过前面知识点的学习,我们知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败,但是我们用类创建的对象不初始化竟然不会报错(如下图:)。

这就是默认初始化。 

Date d = new Date(2021,6,9);

在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:

1. 检测对象对应的类是否加载了,如果没有加载则加载。

2. 为对象分配内存空间。

3. 处理并发安全问题 比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突。

4. 初始化所分配的空间 即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值。根据不同的类型会默认初始化不同的值(如下表)。

数据类型默认值
byte0
char'\u0000'
short0
int0
long0L
booleanfalse
float0.0f
double0.0
referencenull

如果我们想重新初始化时,初始化的方式就是 . 成员变量 ,再赋值就可以了。还有一种初始化就是在创建成员变量时,就直接给予初始值,这种初始化叫就地初始化。下面就是就地初始化:

构造方法 

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,没有返回值类型,即使是void也不行。在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。同样构造方法也可以对我们创建的对象进行初始化。那怎么调用这个方法呢?(如下图所示:)

由此可见:当我们实例化一个对象的时候,就自动地调用了这个构造方法。 那又有一个新的问题来了:当我们没有写构造方法的时候,但是我们依旧实例化了一个对象啊,那也会调用构造方法吗?没错,当我们没有提供任何构造方法时,编译器会自动给我们提供一个不带参数的构造方法;一旦我们自己写了构造方法之后,编译器就不再提供了

注意:1. 构造方法是可以被重载的。

2. 只有当调用完构造方法之后,对象才算被被创建成功了。 

3.在构造方法中可以通过this()来调用其它构造方法。

这个this()来调用其它构造方法的时候,有一些限制条件:(1)this()这条语句必须是在调用这条语句的构造方法的有效代码的第一行。

(2) 不能形成循环。

4. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰(后面会学习到) 

使用IDEA快速生成构造方法的步骤:

 下面是详细视频:

https://live.csdn.net/v/374793?spm=1001.2014.3001.5501

好啦!本期JavaSE类和对象(上)的学习就到此结束啦!我们下一期再一起学习吧!

相关文章:

初始Java篇(JavaSE基础语法)(5)(类和对象(上))

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 目录 面向对象的初步认知 面向对象与面向过程的区别 类的定义和使用 类的定义格式 类的实例化 this引用 什么是this引用? this引用…...

机器人---人形机器人之技术方向

1 背景介绍 在前面的文章《行业杂谈---人形机器人的未来》中,笔者初步介绍了人形机器人的未来发展趋势。同智能汽车一样,它也会是未来机器人领域的一个重要分支。目前地球上最高智慧的结晶体就是人类,那么人形机器人的未来会有非常大的发展空…...

MySQL MHA高可用数据库

文章目录 MySQL MHA高可用数据库搭建MySQL MHA模拟故障故障修复: MySQL MHA高可用数据库 MHA(MySQL High Availability)是一个开源的高可用解决方案,用于实现MySQL主从复制集群的故障自动切换。MHA的主要目的是确保MySQL数据库集…...

LVS(Layout versus schematic)比的是什么?

概述 LVS不是一个简单地将版图与电路原理图进行比较的过程,它需要分两步完成。第一步“抽取”,第二步“比较”。首先根据LVS提取规则,EDA 工具从版图中抽取出版图所确定的网表文件;然后将抽取出的网表文件与电路网表文件进行比较…...

从0开始搭建基于VUE的前端项目(三) Vuex的使用与配置

准备与版本 vuex 3.6.2(https://v3.vuex.vuejs.org/zh/)概念 vuex是什么? 是用作 【状态管理】的 流程图如下 state 数据状态,成员是个对象 mapState 组件使用this.$store.state.xxx获取state里面的数据 getters 成员是个函数,方便获取state里面的数据,也可以加工数据 ma…...

python统计分析——双样本均值比较

参考资料:python统计分析【托马斯】 1、配对样本t检验 在进行两组数据之间的比较时,有两种情况必须区分开。在第一种情况中,同一对象在不同时候的两个记录值进行相互比较。例如,用学生们进入初中时的身高和他们一年后的身高&…...

三台电机的顺启逆停

1,开启按钮输入信号是 电机一开始启动,5秒回电机2启动 ,在5秒电机三启动 关闭按钮输入时电机3关闭 ,5秒后电机2关闭 最后电机一关闭 2,思路开启按钮按下接通电机1 并且接通定时器T0 定时器T0 到时候接通电机2 并且开…...

彩虹外链网盘界面UI美化版超级简洁好看

彩虹外链网盘,是一款PHP网盘与外链分享程序,支持所有格式文件的上传,可以生成文件外链、图片外链、音乐视频外链,生成外链同时自动生成相应的UBB代码和HTML代码,还可支持文本、图片、音乐、视频在线预览,这…...

企业微信知识库:从了解到搭建的全流程

你是否也有这样的疑惑:为什么现在的企业都爱创建企业微信知识库?企业微信知识库到底有什么用?如果想要使用企业微信知识库企业应该如何创建?这就是我今天要探讨的问题,感兴趣的话一起往下看吧! | 为什么企业…...

【华为OD机试C++】合并表记录

《最新华为OD机试题目带答案解析》:最新华为OD机试题目带答案解析,语言包括C、C++、Python、Java、JavaScript等。订阅专栏,获取专栏内所有文章阅读权限,持续同步更新! 文章目录 描述输入描述输出描述示例1示例2代码描述 数据表记录包含表索引index和数值value(int范围的…...

uniapp中使用u-popup组件导致的弹框下面的页面可滑动现象

添加代码: touchmove.stop.prevent"()>{}"...

数字孪生|山海鲸可视化快速入门

哈喽,你好啊,我是雷工! 今天继续学习山海鲸可视化软件,以下为学习记录。 (一)新建项目 1.1、打开软件后,默认打开我的项目界面,初次打开需要注册,可以通过手机号快速注册。 点击“新建”按钮,新建一个项目。 1.2、根据项目需要选择一个快捷的项目模板,填写项目名称…...

C语言-malloc(申请函数)free(释放函数)

malloc和free的语法格式 malloc 函数是 C 语言标准库中的一个重要函数,用于动态分配内存。其语法如下: void *malloc(size_t size);这里的 void * 表示返回的是一个 void 类型的指针,实际上这个指针指向的是一个 char 类型的内存块。size_t …...

2024年150道高频Java面试题(十一)

21. 什么是 Java 中的内部类?它有哪些类型? Java 中的内部类是定义在另一个类内部的类。内部类能够访问其外部类的成员,包括那些声明为私有的成员。内部类是面向对象编程中的一个特色,可以用来逻辑上组织相关的类,并且…...

【MySQL】4.MySQL日志管理与数据库的备份和恢复

备份的目的只要是为了灾难恢复,备份还可以测试应用,回滚数据,修改和查询历史数据,审计等 日志在备份、恢复中起着重要作用 一、数据库备份的重要性 在生产环境中,数据的安全性至关重要 任何数据丢失都可能产生严重的…...

os模块篇(三)

专栏目录 文章目录 专栏目录os.putenv(key, value, /)os.setegid(egid, /)os.seteuid(euid, /)os.setgid(gid, /)os.setgroups(groups, /)os.setns(fd, nstype0)os.setpgrp()os.setpgid(pid, pgrp, /)os.setpriority(which, who, priority) os.putenv(key, value, /) os.puten…...

kvm虚拟机迁移--来自gpt

离线迁移 离线迁移KVM虚拟机主要涉及将虚拟机完全关闭,然后移动虚拟机的磁盘文件和配置文件到新的宿主机上,并在新宿主机上启动虚拟机。下面是具体的步骤和命令: 步骤 1: 关闭虚拟机 首先,在源宿主机上关闭目标虚拟机。确保虚拟…...

用Typora+picgo+cloudflare+Telegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南)

用TyporapicgocloudflareTelegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南) 前提:有github何cloudflare (没有的话注册也很快) 首先,是一个别人写的详细的配置流程,傻瓜式教程&am…...

鸿蒙TypeScript开发入门学习第3天:【TS基础类型】

1、TypeScript 基础类型 TypeScript 包含的数据类型如下表: 注意: TypeScript 和 JavaScript 没有整数类型。 2、Any 类型 任意值是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。 1、变量的值会动态改变时&…...

gitee 本地文件提交到仓库

一、准备工作 1.下载Git Bash Git Bash官网下载地址 http://www.git-scm.com/download/ 点此跳转 2.注册或登录gitee gitee官网地址 https://gitee.com/ 点此跳转 没有账号选择注册有账号的话直接登陆 3.在gitee中新建一个空的仓库 登陆成功后点进个人主页,点击…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...