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

java基础知识——13.类与对象

这篇文章,我们来介绍java中的类与对象

目录

1.面向对象的介绍

2.类的设计与使用

2.1 类和对象

2.1.1 如何定义类

2.2 类的注意事项

3.封装

3.1 private关键字

4.this关键字

5.构造方法

6.标准JavaBean

7.对象内存图

8.成员变量与局部变量


1.面向对象的介绍

下面,我们来对面向对象思想进行一下说明。

面向对象就是写程序的套路面向:拿、找;对象:能干活的东西;面向对象编程:就是拿东西过来做对应的事情。

下面举例说明:

问:为什么用面向对象?

答:这与我们生活中的实际思维有关。在实际生活中中,当我们需要解决一个问题时,我们一般就会去找能解决这个问题的人或物,即找能解决问题的对象。所以使用面向对象编程可以使程序更简单更易理解

问:面向对象编程学些什么?

答: 学习获取已有的对象并使用;学习自己设计对象并使用

2.类的设计与使用

下面,我们来学习类与对象的设计和使用

2.1 类和对象

类(设计图):是对象共同特征的一种描述,是一种抽象

对象:是真实存在的具体东西

在java中,必须先设计类,再new出对象

2.1.1 如何定义类

下面,我们来学习一下如何定义类

定义类的基本格式如下:

 public class 类名 {//成员变量(代表属性,一般为名词)//构造器(见下方)//成员方法(代表行为,一般为动词)//内部块(后面奖)//内部类(后面讲)}

实例如下:

创建对象的方法

类名 对象名 = new 对象名()

实例如下:

使用对象的方法:

访问属性:对象名.成员变量

访问行为:对象名.方法名(...)

2.2 类的注意事项

javabean类:用来描述一类事物的类,里面不写main方法

测试类:编写main方法的类,我们可以在测试类中创建Javabean类的对象并进行赋值使用

注意事项:

  1. 类名首字母建议大写、英文、有意义,满足驼峰命名法,不能使用关键字,满足标志符规定
  2. 一个代码文件中可以定义多个类,但是只能有一个类是public修饰的,public修饰的类名必须是java代码的文件名
  3. 类的成员变量完整的定义格式为:修饰符 数据类型 变量名 = 初始化值;但是我们定义类的时候一般不赋值,系统会指定默认值

3.封装

面向对象的三大特征:封装,继承,多态

封装的原则:对象代表什么,就封装对应的数据,并提供数据对应的行为。

解释:

上面的话其实不太好理解。下面用具体实例的说明一下封装

例如:需求:人画圆,请对这个对象进行面向对象的设计。首先,我们肯定知道,画圆是一个方法。那么请问,画圆这个方法是放在人这个类中还是圆这个类中?答案是放在圆这个类中。这就是封装,下面提供两种解释。解释一:画圆需要知道圆的半径等相关数据,而这些数据在哪呢?在圆这个类中,所以就把这个方法放到圆这个类中。这也是上面所说的:对象代表什么,就封装对应的数据,并提供数据对应的行为。解释二:我们来分析一下这个题目,人画圆,涉及到两个事务:人和圆,我们按照封装的思想,一个类中只包含这个类的所有共同属性,也就是只包含这个类的东西,人这个类就包含人的东西,圆这个类就包含圆的东西,画圆,归根结底还是落在圆这件事务上,所有画圆就放到圆这个类中。说白了,封装,就是把相互纠缠的事物彻底分开,彼此打包组装起来,A是A,B是B,尘归尘,土归土,互不干扰;如有需要,进行调用,如何调用,后面会讲。

封装的好处:

  1. 让程序变的简单,干什么事,找什么对象,直接调用对象的方法
  2. java封装了需要方法类,便于我们的使用

3.1 private关键字

private:

  1. 是一个权限修饰符
  2. 可以修饰成员(成员变量和成员方法)
  3. 被其修饰的成员只能在本类中访问

如下图所示:

问:那怎么访问被private修饰的成员呢?

答:通过访问器与修改器

如下图所示:

set方法:给成员变量赋值,方法用public修饰

get方法:对外提供成员变量的值 ,方法用public修饰

这也是封装的一部分!!!

除了这个private关键字,还有public,default,protected

后面把这部分内容讲完了,会讲一下java这四大权限修饰符

4.this关键字

首先,我们来看一段代码:

如上图的第9行和第10行,第9行方法的参数中有关参数,名为brand,与我们类的成员变量重名了。那么就出现了问题,你在这个方法中调用brand变量,到底调用的是哪一个呢?不知道(实际上调用的是参数brand),当然,我们也可以不讲这个参数命名为brand,可以换个名字,但是我们java的命名规则为见名知意,所以也就只能命名为这个了。那么怎么办呢?

为了解决上述的问题,java引入了this关键字

在讲this关键字之前,我们先讲一下成员变量与局部变量

成员变量:定义在类中方法外的变量

局部变量:定义在方法中或方法内的变量

当成员变量与局部变量重名时,我们如果调用这个变量,有一个原则叫就近原则,意思是谁离调用出近就用谁。根据就近原则,我们可以知道,如果我们在上述代码的第十行中写brand,它调用的就是方法中的参数brand。为了调用我们的成员变量,this关键字就起作用了。

简单来说就是,在一个类中,this就代表这个类的对象,我们在this后面可以点出这个类的所有成员变量和成员方法,this相当于是测试类中的这个类的实例化对象

this的本质:方法调用者的地址值

解释:我们知道,你创建一个类,你只是创建了一个模板,你并不能使用它,要使用它就必须初始化它,即创建它的对象。OK,你现在创建了它的对象了,这个对象有地址,你通过这个对象来调用这个类中的方法。假设,你调用的这个方法中有一个this关键字,此时,当代码执行到这条语句时,系统就会把你的对象的地址赋给this,然后this进行一系列的操作。就是这么简单。这就是this的本质,是方法调用者(即对象)的地址值。

5.构造方法

构造方法也叫构造器,构造函数

作用:在创建对象的时候给成员变量进行初始化的(创建时赋值的)

构造方法的格式

      修饰符 类名(参数){方法体}

特点:

  1. 方法名与类名相同,大小写也一致
  2. 没有返回值类型,连void都没有
  3. 没有具体的返回值(不能由return语句) 

执行时机:

  1. 创建对象时由虚拟机调用,不能手动调用构造方法
  2. 每创建一次对象,就会调用一次构造方法

实例如下图所示:

第9——第17行,三个方法全为构造方法。

注意:当我们设计完类的时候,系统会默认给我设置无参的构造方法,当时,一旦我们手写了构造方法,那么原本的无参构造方法就会被覆盖

6.标准JavaBean

下面来说一下标准的javabean,前面说过一点,但是不具体,这里具体说一下;

标准Javabean的要求

  1. 类名要见名知意
  2. 成员变量使用private修饰
  3. 提供至少2个构造方法:无参构造方法,带全部参数的构造方法
  4. 成员方法:提供每个成员变量的访问器与修改器;如果还有其他的行为也应该写上

下面来看一下一个标准的javabean类:


public class User {private String name;private int age;private String IdNumber;private String address;public User(){}public User(String name, int age, String idNumber, String address) {this.name = name;this.age = age;IdNumber = idNumber;this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getIdNumber() {return IdNumber;}public void setIdNumber(String idNumber) {IdNumber = idNumber;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

7.对象内存图

下面,我们来介绍一下对象的内存图

内容回顾:

java的内存分配为:栈,堆,方法区,本地方法栈,寄存器

栈中存方法和方法中的内容,堆中存new出来的,方法区中放一个类的字节码文件(即当我们要用一个类的时候,这个类的字节码文件就会被加载到方法区中),本地方法栈和寄存器与硬件有关,不多赘述。

下面,我们根据代码来讲解一下吧

当我们在测试类中输入红框中的代码,并运行时,JVM至少要做以下7件事:

  1. 加载class文件(即等号左边的User)
  2. 申明局部空间变量 (即等号右边的LiSi)
  3. 在堆中开辟一块空间(即等号右边的new)
  4. 默认初始化(对堆中对象初始化)
  5. 显式初始化(对堆中对象初始化)
  6. 构造方法初始化
  7. 将堆中空间的地址赋值给等号左边的局部变量LiSi(即等号的作用)

下面,我们就对上面的代码进行一下内存分析:

这图画的很清楚了,大家可以参考这图来理解

8.成员变量与局部变量

成员变量:类中方法外的变量

局部变量:方法里面的变量

如下图所示:

成员变量与局部变量的区别:

相关文章:

java基础知识——13.类与对象

这篇文章,我们来介绍java中的类与对象 目录 1.面向对象的介绍 2.类的设计与使用 2.1 类和对象 2.1.1 如何定义类 2.2 类的注意事项 3.封装 3.1 private关键字 4.this关键字 5.构造方法 6.标准JavaBean 7.对象内存图 8.成员变量与局部变量 1.面向对象的…...

北邮22信通:(10)第三章 3.2栈的实现

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 上一篇文章: 北邮22信通:(9)实验1 题目六:模拟内存管理(搬运官方代码)_青…...

Vue3之使用js实现动画

概述 动画的实现其实不仅可以使用CSS的方式实现,而且还可以使用js的方式实现,二者有啥区别呢?CSS更加注重动画的展现,性能更好,而js的方式性能稍微差点,但是可以在动画执行的每一个过程中做些额外的操作。…...

金三银四,你准备好面试了吗? (附30w字软件测试面试题总结)

不知不觉,已是3月下旬。最近有很多小伙伴都在跟我谈论春招面试的问题,其实对于面试,我也没有太多的经验,只能默默地把之前整理的软件测试面试题分享给Ta。今天就来大致的梳理一下软件测试的面试体系(每一部分最后都有相…...

【C语言学习】数组

数组(Array)就是一些列具有相同类型的数据的集合,这些数据在内存中依次挨着存放,彼此之间没有缝隙。 数组不是C语言的专利,Java、C、C#、JavaScript、PHP 等其他编程语言也有数组。 C语言数组属于构造数据类型。一个…...

ElasticSearch序列 - SpringBoot整合ES:根据指定的 ids 查询

文章目录1. ElasticSearch 根据 ids 查询文档2. SpringBoot整合ES实现 ids 查询1. ElasticSearch 根据 ids 查询文档 ① 索引文档,构造数据 PUT /my_index/_doc/1 {"price":10 }PUT /my_index/_doc/2 {"price":20 }PUT /my_index/_doc/3 {&qu…...

Spark SQL实战(08)-整合Hive

1 整合原理及使用 Apache Spark 是一个快速、可扩展的分布式计算引擎,而 Hive 则是一个数据仓库工具,它提供了数据存储和查询功能。在 Spark 中使用 Hive 可以提高数据处理和查询的效率。 场景 历史原因积累下来的,很多数据原先是采用Hive…...

堆(数据结构系列11)

目录 前言: 1.优先级队列概念 2.堆的概念 3.堆的存储方式 4.堆的创建 5.创建堆的时间复杂度 6.堆的插入和删除 6.1堆的插入 6.2堆的删除 结束语: 前言: 上一次博客中小编主要与大家分享了 二叉树一些相关的知识点和一些练习题&…...

算法训练第四十二天|01背包问题 二维 、01背包问题 一维、416. 分割等和子集

动态规划part0401背包问题 二维01 背包二维dp数组01背包完整c测试代码总结01背包问题 一维一维dp数组(滚动数组)一维dp01背包完整C测试代码416. 分割等和子集题目描述思路01背包问题总结01背包问题 二维 视频链接:https://www.bilibili.com/…...

Java-如何使用Java将图片和文字拼接在一起(并非是给图片加水印)

之前有遇到一个问题 问题背景:项目中,有一个功能,管理端可以将客户创建的小程序码下载到本地,方便客户将对应门店的小程序码打印出来并张贴到门店,做门店的引流和会员入会。 具体问题:当小程序码的数量较少…...

Metasploit入门到高级【第三章】

来自公粽号:Kali与编程预计更新第一章:Metasploit 简介 Metasploit 是什么Metasploit 的历史和发展Metasploit 的组成部分 第二章:Kali Linux 入门 Kali Linux 简介Kali Linux 安装和配置常用命令和工具介绍 第三章:Metasploi…...

枚举的使用

Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。1 问题如何在类中使用枚举,例如枚举出一年的四个季度,并且通过迭代枚举…...

Python进阶语法

1.1 Python进阶语法 1.1.1 交换变量 一行代码快速交换两个变量&#xff0c;无需创建临时变量。 from icecream import ica 2 b 4 a, b b, a ic(a, b)ic| a: 4, b: 2 1.1.2 链式比较 from icecream import ica 97 if 90 < a < 100:ic(a)ic| a: 97 1.1.3 初始化列表…...

Pyspark_结构化流4

Pyspark 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase Hi…...

Linux cmp 命令

Linux cmp 命令用于比较两个文件是否有差异。 当相互比较的两个文件完全一样时&#xff0c;则该指令不会显示任何信息。若发现有所差异&#xff0c;预设会标示出第一个不同之处的字符和列数编号。若不指定任何文件名称或是所给予的文件名为"-"&#xff0c;则cmp指令…...

Python入门到高级【第五章】

预计更新第一章. Python 简介 Python 简介和历史Python 特点和优势安装 Python 第二章. 变量和数据类型 变量和标识符基本数据类型&#xff1a;数字、字符串、布尔值等字符串操作列表、元组和字典 第三章. 控制语句和函数 分支结构&#xff1a;if/else 语句循环结构&#…...

C语言中(i++)+ (i++)真的每次都等于3吗?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言结论证明首先&#xff0c;登场的是我们的VC6.0&#xff08;还有Linux&#xff09;最后一位&#xff0c;我使用了小熊猫C&#xff08;还有Clion&#xff09;请添加…...

Cursor,程序员的 AI 代码编辑助手

相信大家都或多或少地听说过、了解过 chatGPT &#xff0c;半个月前发布的 GPT-4 &#xff0c;可谓是 AI 赛道上的一个王炸 那么今天咸鱼给大家分享一个开源的 AI 代码编辑器——Cursor&#xff0c;让各位程序员在编程之路上一骑绝尘 &#x1f603; 介绍 Cursor 是一个人工智…...

基于XML的自动装配~

基于XML的自动装配之场景模拟&#xff1a; 自动装配&#xff1a;根据指定的策略&#xff0c;在IOC容器中匹配某一个bean&#xff0c;自动为指定的bean中所依赖的类类型或者接口类型赋值 之前我们学过的依赖注入&#xff0c;我们在为不同属性赋值时&#xff0c;例如类类型的属性…...

完全二叉树的4种遍历方式

一张二叉树的图 1&#xff0c;二叉树的特点 每个点p的左儿子是p*2,右儿子是p*21&#xff0c;可以分别表示为p<<1与p<<1|1节点的序号是从左到右&#xff0c;从上到下增加的每个点至多2个儿子&#xff08;屁话&#xff08;bushi&#xff09;&#xff09; 2&#xff…...

【vue2】使用elementUI进行表单验证实操(附源码)

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;vue使用elementUI进行表单验证实操&#xff08;附源码&#xff09; 【前言】我们在构建一…...

JUC之阻塞队列解读(BlockingQueue)

目录 BlockingQueue 简介 BlockingQueue 核心方法 1.放入数据 2.获取数据 入门代码案例 常见的 BlockingQueue ArrayBlockingQueue(常用) LinkedBlockingQueue(常用) PriorityBlockingQueue SynchronousQueue LinkedTransferQueue LinkedBlockingDeque 小结 Bloc…...

LCHub:ChatGPT4和低代码来临,程序员面临下岗?

一个网友吐槽道: “ 建站出来了,你们说程序员会失业。 低代码出来了,你们说程序员会失业。 Copilot出来了,你们说程序员会失业。 Chatgpt出来了,你们说程序员会失业 虽然这只是网友的吐槽,但却引起了小编的好奇。为何程序员那么容易被新技术取代?今天小编打算跟大家…...

【Node.js】Express框架的基本使用

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 目录 初识Express Express简介 什么是Express 进一步理解 Express Express能做什么 Express的基本使用 …...

使用docker 和 kubnernetes 部署单节点/多节点 kafka 环境

参考资料 https://kafka.apachecn.org/documentation.html#configuration kafka的broker有三个核心配置 broker.idlog.dirszookeeper.connect docker启动单节点kafka环境 启动zookeeper 可配置的环境变量&#xff0c;https://gallery.ecr.aws/bitnami/zookeeper $ docker …...

Linux使用:环境变量指南和CPU和GPU利用情况查看

Linux使用&#xff1a;环境变量指南和CPU和GPU利用情况查看Linux环境变量初始化与对应文件的生效顺序Linux的变量种类设置环境变量直接运行export命令定义变量修改系统环境变量修改用户环境变量修改环境变量配置文件环境配置文件的区别profile、 bashrc、.bash_profile、 .bash…...

深入浅出 SSL/CA 证书及其相关证书文件(pem、crt、cer、key、csr)

互联网是虚拟的&#xff0c;通过互联网我们无法正确获取对方真实身份。数字证书是网络世界中的身份证&#xff0c;数字证书为实现双方安全通信提供了电子认证。数字证书中含有密钥对所有者的识别信息&#xff0c;通过验证识别信息的真伪实现对证书持有者身份的认证。数字证书可…...

Compose(1/N) - 概念 基本使用

一、概念 1.1 解决的问题 APP展示的数据绝大多数不是静态数据而是会实时更新&#xff0c;传统的命令式UI写法更新界面繁琐且容易同步错误。1.2 Compose优势 由一个个可组合的Composable函数&#xff08;可看作是一个Layout布局&#xff09;拼成界面&#xff0c;方便维护和复用…...

2023高质量Java面试题集锦:高级Java工程师面试八股汇总

人人都想进大厂&#xff0c;当然我也不例外。早在春招的时候我就有向某某某大厂投岗了不少简历&#xff0c;可惜了&#xff0c;疫情期间都是远程面试&#xff0c;加上那时自身也有问题&#xff0c;导致屡投屡败。突然也意识到自己肚子里没啥货&#xff0c;问个啥都是卡卡卡卡&a…...

MySQL多表查询 子查询效率(DQL语句)

多表关系 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a; 一对多(多…...