【JavaSE】/*类和对象(上)*/

news2024/11/15 10:37:52

目录

一、什么是类,什么是对象

二、类和对象的关系

三、学习类和对象的目的

四、怎样创建一个类

4.1 语法形式

4.2 创建示例

示例一:日期对象

示例二:小狗对象

示例三:学生对象

4.3 注意事项

4.4 修改public修饰的主类名

示例一:Java文件中只有一个类 

示例二:Java文件中有多个类 

五、怎样示例化一个对象

5.1 语法格式

5.2 内存分析

5.3 对象的引用如何去访问非静态成员变量/方法 

六、非静态方法中的隐藏参数this

6.1 问题引入

6.2 介绍this

6.3 this特性

七、非静态成员变量的初始化方式

方式一:就地初始化非静态成员变量

方式二:在方法中使用对象的引用初始化非静态成员变量(注意一下,非静态成员被什么修饰了)

方式三:自己写一个成员方法初始化非静态成员(这个成员方法得写成非静态的,不然初始化不了非静态的成员变量)

方式四:构造方法初始化非静态成员(一般采用这种方式初始化!!!,构造方法别用static修饰!!!)

方式五:构造代码块初始化非静态成员(后面会讲什么是Java中的代码块)

八、构造方法

8.1 概念

8.2 特点

九、写个代码简单总结一下 


一、什么是类,什么是对象

一切实体皆可称为对象,例如:你、我、他、小狗、冰箱等。

类是用来描述对象的引用数据类型,它和C语言中的结构体类型类似。

二、类和对象的关系

① 类和int、double、boolean等一样,是一种数据类型,并不占用实际的内存空间。只有当用类实例化对象后,对象才会占用实际的内存空间,这些内存空间用于存放该对象的非静态成员变量。

② 一个类可以实例化多个对象。

三、学习类和对象的目的

学习类和对象的目的是为了更好的面向对象编程。

埋坑:什么是面向过程编程、什么是面向对象编程,它们分别有哪些特点和优缺点?

四、怎样创建一个类

4.1 语法形式

说明:

① 创建类要用到关键字class。

② 类名采用大驼峰的命名方式。

③ 类中一般会描述对象的两个方面:对象的属性 和 对象的行为(我们可以根据实际的需求自定义这两个方面是否写完整)。

4.2 创建示例

示例一:日期对象

class Date {
    public int year;
    public int month;
    public int day;
    
    public void setDate() {
        System.out.println(year + "年" + month + "月" + day + "日");
    }
}

示例二:小狗对象

class Dog {
    public String name;
    public int age;
    public String color;
    
    public void setDog() {
        System.out.println(name + " " + age + " " + color);
    }
}

示例三:学生对象

class Student {
    public String name;
    public int age;
    public int classroom;

    public void setStudent() {
        System.out.println(name + " " + age + " " + classroom);
    }
    
    public void learn () {
        System.out.println(name + " 正在学习...");
    }
}

4.3 注意事项

0. Java文件名采用大驼峰的方式命名。

1. 此处先用采用public修饰成员变量和成员方法,各修饰限定符的具体作用后面会细致讲。

2. 类只能被public修饰或不被修饰,不被修饰的类只具有包访问权限。

3. 一个Java文件中最多只能有一个public修饰的类,这个类称为主类(除主类外,其他的类都不能被public修饰,否则会报错)。主类的类名要与Java文件名保持一致。

4. 通常在一个Java文件中我们只会写一个类。使用ideal创建一个Java文件后,编译器会在该Java文件中自动生成主类。

5. 不要轻易修改public修饰的主类的类名,如果非要修改,可以通过开发工具修改(具体操作见下面的4.4)。

6. 成员变量在没有初始化之前会有一个默认值(也就是说成员变量被直接使用时,不会因为未被初始化而报错,不过我们通常会在创建类时写构造方法去初始化成员变量):基本数据类型除boolean类型的变量默认值是false外,其余类型的变量默认值都是0值;引用数据类型的默认值都是null。

7. 关于main方法的补充说明:main方法是程序的入口,只能放在被public修饰的类中使用。main方法的书写规范:public static void main(String[] args) { //... };(为什么main方法要用static修饰?答:JVM在运行Java应用程序时,首先会调用main方法,调用时并不会自动实例化这个类的对象,而是通过类名直接调用main方法,因此需要用static修饰。)

4.4 修改public修饰的主类名

使用开发工具修改主类名称的注意事项:使用开发工具只能修改只存在一个类的Java文件中主类的名称,因为如果一个Java文件中有多个类,编译器不知道要改哪个类的类名(它并不会主动识别哪个是主类)。

示例一:Java文件中只有一个类 

示例二:Java文件中有多个类 

五、怎样示例化一个对象

5.1 语法格式

如果类被public修饰,则可以在任意的方法中,使用:类名 + 变量名 = new + 类名();即可创建一个对象。

如果类没有被任何修饰,则可以在该类所在的包下的任意方法中,使用:类名 + 变量名 = new + 类名();即可创建一个对象。

5.2 内存分析

上面代码在main方法中分别用new关键字实例化了两个Dog类型的对象,分别是dog1和dog2(它们是引用数据类型的变量,简称引用),它们里面存的是其所指向对象的地址,且dog1和dog2引用由于在方法中,故它们是局部变量,局部变量的内存在栈中开辟空间 (注意:成员变量和局部变量的生命周期、作用域是不同的)。Java中给对象所开辟的空间在堆区,用于提供对象存放非静态成员变量的数据每个对象都有自己独有的非静态成员变量,但并没有自己独有的成员方法,因为方法是用来调用的,并不需要开辟空间存放。综上有了如下所示的内存分布。

5.3 对象的引用如何去访问非静态成员变量/方法 

对象的引用+(.)+非静态的成员变量/方法。

 

六、非静态方法中的隐藏参数this

6.1 问题引入

问题一:在上文5.2中,我们知道了每个对象只有自己独有的静态成员变量,并没有自己独有的成员方法,因为方法并不需要开辟内存空间来存储,只需要调用即可。下图中第2、3个红色方框框起来的部分,dog1、dog2对象都在调用setDog这个非静态成员方法,而这个静态成员方法中并没有说明name,age,color到底是哪个对象的非静态成员变量,在执行代码的过程中编译器怎么知道name,age,color是哪个对象的非静态成员变量呢?

问题二:下图中第1、2个红色方框框起来的部分,dog1、dog2对象都在调用value这个非静态成员方法用于初始化非静态成员变量。当我们按照预期运行代码后,在屏幕上打印出来的结果,为什么会出现给非静态成员变量赋值并没有成功的情况?

 

6.2 介绍this

1. 在所有的非静态成员方法的参数列表中其实都隐藏了一个形参this,这个this和当前调用这个非静态成员方法的引用指向着同一个对象

2. 我们在非静态成员方法中对所有非静态成员变量/方法的调用,都是通过this去访问的。也就是说6.1中的问题二,在执行代码的过程中编译器是通过非静态成员方法参数列表中隐藏的形参this知道的name,age,color是哪个对象的非静态成员变量的。

3. 在非静态成员方法中this可以省略不写,编译器会自动补上。但这样特别容易出现6.1中的问题二出现的问题,即由于当非静态成员方法的形参名与非静态成员变量名不小心相同时,编译器采用局部变量优先的原则,value方法中所有的name、age、color代表的都是形参name、age、color而没有代表非静态成员变量中的name、age、color的,所以造成了赋值并没有成功。因此建议,只要在非静态成员方法中调用非静态成员变量/方法时,都给非静态成员变量/方法前加一个this相当于明确说明了非静态成员变量是哪个对象的,非静态成员方法是哪个引用在调用(这个this和当前调用这个非静态成员方法的引用指向着同一个对象)。

4. 总之:非静态成员变量/方法在被调用时,得指明是谁在调用 (对象的引用/this)。

 

6.3 this特性

1. this的类型:哪个引用调用的非静态成员方法this就和哪个引用的类型一致。

2. this只能在非静态成员方法中使用,静态成员方法中的参数列表中并没有隐藏参数this

3. 在非静态的成员方法中,this引用只能找到所指向对象的成员变量/方法(但并不推荐去找静态的成员变量/方法,因为静态的成员变量/方法并不依赖于对象,这种找法合法但不合理),不能找到其他对象的成员变量/方法。

4. this引用是非静态成员方法的第一个隐藏的形式参数,在非静态成员方法执行时,编译器会负责将调用非静态成员方法的引用所指向的对象的地址传递给形参this。

5. 代码层面来简单演示--->注意:下图右侧中的Date类也是可以通过编译的。

七、非静态成员变量的初始化方式

方式一:就地初始化非静态成员变量

 

方式二:在方法中使用对象的引用初始化非静态成员变量(注意一下,非静态成员被什么修饰了)

 

方式三:自己写一个成员方法初始化非静态成员(这个成员方法得写成非静态的,不然初始化不了非静态的成员变量)

 

方式四:构造方法初始化非静态成员(一般采用这种方式初始化!!!,构造方法别用static修饰!!!)

 

方式五:构造代码块初始化非静态成员(后面会讲什么是Java中的代码块)

 

八、构造方法

8.1 概念

1. 方法:返回类型 + 方法名称 + 参数列表 { //方法体... };

    构造方法:方法名称(和所在类的类名一致) + 参数列表 { //方法体... };

2. ① 一般情况下使用public修饰构造方法特殊场景下会被private修饰(后序讲单例模式时会遇到)

    ② 构造方法的名字与所在类的类名一致,没有返回值类型,设置为void也不行。

    ③ 构造方法在实例化对象时由编译器自动调用,并且在每一个对象的生命周期中只会调用一次。

    ④ 构造方法是一种特殊的成员方法,构造方法的作用就是对对象中的成员变量进行初始化(静态成员变量也可以,只要该构造方法没有被static修饰)注意它不负责给对象开辟空间

8.2 特点

 构造方法可以重载(我们可以根据自己的需求创建出拥有不同参数个数的构造方法)

     ps:我们可以使用开发工具生成所有可能构成的构造方法,步骤如下图。

② 如果没有显示定义构造方法,则编译器会在实例化对象时调用系统自动生成的一个没有参数的构造方法,所以没有显示定义构造方法就运行代码时,编译器并不会报错。

③ 如果已经显示定义了构造方法,则编译器不会再提供系统生成的不带参数的构造方法(编译器只救急不救穷!!!),如果此时想使用不带参数的构造方法就得自己去写了。例如,下图中自己已经定义了带参数的构造方法,在示例化对象时,new的后面如果没有给构造方法传参数,就会报错,因为此时类中只显示定义了带参数的构造方法,并没有定义不带参数的构造方法,编译器也没有提供不带参数的构造方法。

④ 可以通过this(...);在一个构造方法中调用其他的构造方法来简化代码。

     注意1:this(...)所在的地方必须是构造方法中第一条语句。

 

注意2:使用this();不能形成环,否则会报错。

九、写个代码简单总结一下 

 本篇文章已完结,谢谢支持哟 ^^ !!! 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day06:Flex 布局

目标:熟练使用 Flex 完成结构化布局 一、标准流 标准流也叫文档流,指的是标签在页面中默认的排布规则,例如:块元素独占一行,行内元素可以一行显示多个。 二、浮动 1、基本使用 作用:让块元素水平排列。 …

如何学习计算机网络(超详细,方法论)

分享一下学习计算机网络的方法论 首先是看视频: 这里我推荐中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版》课程 课程目标_哔哩哔哩_bilibili 教材采用神书《计算机网络(自顶向下方法)》,授课风格更偏向实…

The view model in Acise

在FreeCAD中,借助于Boost Signals2实现了业务层、显示层的分层,但整个FreeCAD Gui层却采用了Coin3D进行渲染,很难进行在这方面进行扩展。 相较之下,在SALOME中,可以为不同的Module指定特定的ViewModel,支持…

uniapp App去除iOS底部安全区域白边

未设置的情况下,iOS底部安全区域白边 如图: 去除方法: 在 mainfest.json 中加入一下代码: "safearea" : {"bottom" : {"offset" : "none"} }, 去除效果展示:

翻译AnyDoor: Zero-shot Object-level Image Customization

摘要 本研究介绍了AnyDoor,这是一款基于扩散模型的图像生成器,能够在用户指定的位置,以期望的形状将目标对象传送到新场景中。与为每个对象调整参数不同,我们的模型仅需训练一次,就能在推理阶段轻松地泛化到多样化的对…

能找伴侣的相亲婚恋平台有哪些?6款值得信赖的恋爱交友软件体验测评

在这个超快节奏的社会里,好多人都忙着搞事业和搞钱,却把终身大事给忽略了。但是随着年龄越来越大,来自长辈和社会的压力也越来越大,因此网络上的相亲交友软件,就成了大多数单身贵族的脱单首选了。下面就来给大家讲讲我…

C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程

前言:有时候远程服务器的进程你想偷偷去围观一下有哪些,或者对一些比较调皮的进程进行封杀,或者对一些自己研发的服务进行远程手动启动或者重启等,又不想打开远程桌面,只想悄咪咪地执行,那也许下面的文章会…

重开之数据结构(二刷)

引言: 由于前段时间学习效率不高,导致后面复习前面数据结构没有一个大纲,因此打算重新来学习以下数据结构,期望再次把数据结构学透,并有深刻的印象.并且记录每一次的学习记录 以便于后续复习 二分查找 需求:在有序数组arr内,查找target值 如果找到返回索引位置如果找不到返回…

详细分析Element中的MessageBox基本知识(附Demo)

目录 前言1. 基本知识2. Demo2.1 确认框2.2 警告框2.3 对话框 3. this.$confirm 前言 详细知识推荐阅读:详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版) MessageBox则常用于Vue2 1. 基本知识 MessageBox 是 Element UI 提供…

《欢乐钓鱼大师》辅助:新手钓鱼全新攻略大全!

《欢乐钓鱼大师》是一款充满趣味和挑战的钓鱼游戏。在游戏中,玩家不仅可以体验钓鱼的乐趣,还可以通过不同的钓鱼竿和鱼卡来提升自己的钓鱼技能。为了帮助新手和老玩家更好地体验游戏,本文将为您提供详细的游戏攻略。 1. 游戏目标 在《欢乐钓…

window环境下QT5开发环境的搭建

1、安装visual Stusio 15 生成工具2012 2、安装Visual studio Enterprise 2017 3、Visual studio Enterprise 2017安装完成之后, 修改:选择桌面调试,如下: 4、打开QTcreator,选项中,配置编译器&#xff…

详细分析tcping的基本知识以及用法

目录 前言1. 安装配置2. 基本知识3. Demo 前言 针对ping的基本知识推荐阅读:详细分析ping的基本知识以及常见网络故障的诊断(图文解析) 1. 安装配置 针对Window的下载如下: 安装路径:tcping官网 下载tcping.exe&a…

2024最新 Jenkins + Docker实战教程(一) - Jenkins介绍及安装

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

pytorch笔记:torch.nn.Flatten()

1 介绍 torch.nn.Flatten(start_dim1, end_dim-1) 将一个连续的维度范围扁平化为一个张量 start_dim (int)要开始扁平化的第一个维度(默认值 1)end_dim (int)要结束扁平化的最后一个维度(默认值 -1) 2 举例 input torch.ra…

PyTorch基础(22)-- torch.chunk()方法

分享一下自己目前在维护的Github项目,由于本人博士阶段接触了一个全新的研究方向-----使用机器学习、强化学习、深度学习等方法解决组合优化问题,维护这个项目的目的: (1)记录自己阅读过的paper,同时分享一…

Attention相关问题笔试解析。

Attention相关问题笔试解析。 题目描述一:【选择】题目描述二:【简答】题目描述三:【代码】Scaled Dot-Product Attention:下面是用PyTorch实现的一个Attention机制的代码。这个实现包括一个简单的Scaled Dot-Product Attention机…

多模态交互式 AI 代理的兴起:探索 Google 的 Astra 和 OpenAI 的 ChatGPT-4o应用

OpenAI的发展 聊天GPT-4o 和 谷歌的阿斯特拉 标志着交互式人工智能代理的新阶段:多模式交互式人工智能代理的兴起。这次旅程开始于 Siri 和 Alexa的,它将语音激活的人工智能带入主流用途,并通过语音命令改变了我们与技术的交互。尽管有影响&a…

Rolla‘s homework:Image Processing with Python Final Project

对比学习Yolo 和 faster rcnn 两种目标检测 要求 Image Processing with Python Final Project Derek TanLoad several useful packages that are used in this notebook:Image Processing with Python Final Project Project Goals: • Gain an understanding of the object …