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

目录

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

二、为什么要学习类和对象

三、初识面向过程和面向对象编程 

四、如何定义类

4.1 语法形式

4.2 定义示例

示例一:定义一个描述学生的类

示例二:定义一个描述冰箱的类

示例二:定义一个描述狗的类

4.3 修改public修饰的主类名称

五、如何实例化一个对象

5.1 语法形式

5.2 实例化的对象在内存中的分析

5.3  如何通过对象的引用访问对象的成员变量和对应类的成员方法

5.4 类和对象的关系

六、this引用

6.1 为什么了解this引用

6.2 什么是this引用

​6.3 this引用的特性

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

方式一:

方式二:

方式三:

方式四:

方式五:

八、构造方法

8.1 概念

8.2 特性


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

1. 一切实体皆可称为对象,例如:冰箱、小狗、学生等。

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

二、为什么要学习类和对象

答:是为了更好的面向对象编程

三、初识面向过程和面向对象编程 

四、如何定义类

4.1 语法形式

说明:(class、类名、如何修饰类、在Java文件中定义几个类,main方法、怎么修改主类名,类中写些什么,成员变量有默认值)

1. 定义类要用到class关键字

2. 类名采用大驼峰的形式。

3. 注意一下,类前面的修饰只会出现两种情况:① public修饰 ② 无修饰。

4. 一个源文件中最多有一个public修饰的类,且这个类的类名要与Java源文件名保持一致,这个被public修饰的类又称为主类。

5. 通常一个Java文件中只会写一个类,使用ideal集成开发环境创建一个Java文件后,编译器会在该Java文件中自动生成一个主类框架。

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

7. 不要轻易修改public修饰的主类名称,如果非要修改,可以通过开发工具修改(具体操作见下面的 <4.3 修改public修饰的主类名称> 中的内容)。

8. 定义类时一般会对对象的两个方面进行描述(也可根据实际需要自行决定是否要将这两个方面描述完整):一个是对象的属性,另一个是对象拥有的行为。通常我们会把属性称为成员变量,行为称为成员方法。 

9. 成员变量在没有初始化之前都会有一个默认值(也就是说成员变量可以不初始化就可以直接使用而不报错):基本数据类型除boolean类型的默认值是false外,其余的默认值都是0值,引用数据类型的默认值都是null

10. 此处我们在定义成员变量、成员方法时为什么均采用public修饰,以及定义成员方法时为什么没有用static修饰,看到后面就会理解了。

4.2 定义示例

示例一:定义一个描述学生的类

class Student {String name;int age;double score;public void set() {System.out.println(name + " " + age + "" + score);}public void eat() {System.out.println(name + "正在吃饭...");}
}

示例二:定义一个描述冰箱的类

class WashMachine {public String brand; // 品牌public String type; // 型号public double weight; // 重量public double length; // 长public double width; // 宽public double height; // 高public String color; // 颜色public void washClothes(){ // 洗衣服System.out.println("洗衣功能");}public void dryClothes(){ // 脱水System.out.println("脱水功能");}public void setTime(){ // 定时System.out.println("定时功能");}
}

示例二:定义一个描述狗的类

class Dog {public String name;//名字public String color;//颜色public void barks() {System.out.println(name + ": 旺旺旺~~~");}public void wag() {System.out.println(name + ": 摇尾巴~~~");}
}

4.3 修改public修饰的主类名称

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

五、如何实例化一个对象

5.1 语法形式

1. 实例化对象要用到new关键字。

2. 在方法中(注意一下,这里并没有限定在哪个方法中哈),写上类名 + 变量名 = new 类名();就可以实例化出一个对象了。

5.2 实例化的对象在内存中的分析

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

5.3  如何通过对象的引用访问对象的成员变量和对应类的成员方法

对象+(.)+成员变量/成员方法

5.4 类和对象的关系

1. 类只是一个模型,用来对一个实体进行描述,限定。

2. 类是一种自定义的类型,可以用来定义变量。

3. 一个类可以实例化出多个对象类不占内存空间,实例化出的对象占用实际的内存空间,用于存储对象的成员变量。 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子。设计图只设计出需要什么东西,但是并没有实体的建筑存在。类只是描述了对象会有哪些特征,并没有正真的对象存在,不会占用实际的内存空间。

六、this引用

6.1 为什么了解this引用

问题一:在下图中使用对象的引用调用非静态的成员方法时(红色框起来的部分),非静态成员方法的参数中并没有关于对象的描述,编译器怎么知道非静态成员方法中下图中绿色部分指的是哪个对象的成员变量?

 

问题二:当非静态成员方法的形参名与成员变量名不小心相同时为什么这样赋值,使用日期类中的printDate方法打印出来的结果会发现赋值没有成功?

6.2 什么是this引用

1. this引用和当前调用成员方法的引用指向的是同一个对象

2. 在非静态的成员方法中对所有非静态的成员变量/成员方法的调用,都是通过this引用去访问的

3. 在所有的非静态成员方法的参数列表中其实都隐藏了形参this,例如上面的代码示例中,setDate方法的完整表示应该为:public void setDate(Date this, int y, int m, int d) { //... };

4. 上面的问题一,编译器怎么知道成员方法绿色部分指的是哪个对象的成员变量?答:是通过编译器自动传递的参数this知道的。

5. 上面的问题二,当成员方法的形参名与成员变量名不小心相同时,编译器采用局部变量优先的原则,类中的setDate方法中所有的year、month、day代表的都是形参year、month、day而不是成员变量中的year、month、day,所以造成了赋值并没有成功。

6. 建议在非静态的成员方法中调用非静态的成员变量/成员方法时,都给非静态的成员变量/成员方法前加一个this,相当于明确说明了这个非静态的成员变量/成员方法是哪个对象的

6.3 this引用的特性

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

2. this只能在非静态的成员方法中使用

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

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

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

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

方式一:

成员变量用public修饰,在main方法中采用引用+(.)+成员变量的方式初始化。

方式二:

在类中定义成员方法的形式初始化成员变量。

方式三:

在创建类时,就给成员变量初始化,但这种初始化方式没有什么意义,因为不可能所有对象的成员变量的值都是一样的。(这种初始化方式也叫,就地初始化)。

方式四:

利用构造方法,顺便初始化 。(下面会具体介绍构造方法是什么)。

方式五:

在类中利用构造代码块初始化。 (<类和对象(下)>会介绍Java中的代码块)

八、构造方法

8.1 概念

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

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

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

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

    ③ 在实例化对象时由编译器自动调用,并且在对象的生命周期内只调用一次

    ④ 构造方法是一种特殊的成员方法,构造方法的作用就是对对象中的非静态成员变量进行初始化,并不负责给对象开辟空间

8.2 特性

① 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)。

    例如上图代码中带参数的构造方法,和不带参数的构造方法就构成了方法的重载。

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

② 如果没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。 

③ 如果有自己定义的构造方法,编译器不会再提供不带参数的构造方法,如果此时又想使用不带参数的构造方法就得自己去写了。例如,下图中自己已经定义了带参数的构造方法,在示例化对象时,new的后面没有给构造方法传参数,就会报错。

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

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

 

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

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

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

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

相关文章

MySQL5个查询

# 总查询 EXPLAIN SELECT * FROM city; # 范围查询 EXPLAIN SELECT * from city where ID>5 and ID<20; #主键查询 EXPLAIN SELECT * from city where ID5; # 索引查询 EXPLAIN SELECT * from city where CountryCodeNLD; # 普通索引 EXPLAIn SELECT * from cit…

7 Series FPGAs Integrated Block for PCI Express IP核简介

7 Series FPGAs Integrated Block for PCI Express IP核是Xilinx公司7系列FPGA中集成的PCI Express&#xff08;PCIe&#xff09;IP核模块&#xff0c;是一个可扩展的、高带宽的、可靠的串行互联构建块&#xff0c;用于与Xilinx的Zynq-7000 SoC和7系列FPGA配合使用。它支持1-la…

【算法】栈——逆波兰表达式求值

题解&#xff1a;逆波兰表达式求值(栈算法) 目录 1.题目2.题意2.1逆波兰表达式2.2向零截断 3.题解4.总结 1.题目 题目链接&#xff1a;LINK 2.题意 这个题目种涉及一些概念&#xff0c;应当适当说一下。 2.1逆波兰表达式 即后缀表达式&#xff0c;是一种数学表达式的表达…

全自动机器学习AutoML高效预测时间序列

大家好&#xff0c;时间序列数据是许多现实世界问题的核心&#xff0c;例如预测能源消耗、气象预报、库存管理。传统上&#xff0c;使用专门的时间序列模型如Prophet来对此类数据进行建模和预测。然而&#xff0c;通过将时间序列数据转换为表格格式&#xff0c;可以利用更广泛的…

【全开源】多场馆场地预定小程序源码(ThinkPHP+FastAdmin+UniApp)

场馆场地预定小程序源码一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序&#xff0c;提供运动场馆运营解决方案&#xff0c;适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆&#xff08;高级版&#xff09;

如何将word插入的形状转成图片(高清)导出?

文章目录 前言&#xff08;不感兴趣可以直接看正文&#xff09;一、新建画布二、插入形状三、复制四、粘贴为图片五、另存为总结 前言&#xff08;不感兴趣可以直接看正文&#xff09; 因为我毕业论文里的图片刚开始使用画图软件画的&#xff0c;但到后期论文即将胶印的时候&a…

HarmonyOS interface router scale pageTransition SlideEffect.Left ArkTS ArkUI

&#x1f3ac;️create Component export default struct TitleBar {build(){Row(){Text(transition).fontSize(30fp).fontColor(Color.White)}.width(100%).height(8%).backgroundColor(#4169E1).padding({left:10})}}&#x1f39e;️interface export interface IList{ti…

EXPLAIN执行计划详解

EXPLAIN 是 MySQL 中的一个非常实用的命令&#xff0c;主要用于分析 SQL 查询语句的执行计划&#xff08;Query Execution Plan&#xff0c;QEP&#xff09;。通过这个命令&#xff0c;用户可以获取到数据库引擎如何执行特定的 SQL 语句的详细信息&#xff0c;这对于优化查询性…

DLRover:蚂蚁集团开源的AI训练革命

在当前的深度学习领域&#xff0c;大规模训练作业面临着一系列挑战。首先&#xff0c;硬件故障或软件错误导致的停机时间会严重影响训练效率和进度。其次&#xff0c;传统的检查点机制在大规模训练中效率低下&#xff0c;耗时长且容易降低训练的有效时间。资源管理的复杂性也给…

Codigger编码场景介绍(二):驾驶舱场景(Cockpit)

Codigger&#xff0c;一个专为开发人员设计的工具&#xff0c;致力于为不同的开发场景提供最佳的切换体验。Codigger囊括了多种场景&#xff0c;如传统场景、调试场景、设计器场景、驾驶舱场景以及纯净场景等。在上一篇文章中&#xff0c;我们介绍了传统场景模式&#xff0c;今…

数据结构_栈在括号匹配中的应用_代码

学习笔记 #include<stdio.h> #include<stdlib.h> #include<string.h>#define MaxSize 10 typedef struct{char data[MaxSize];int top; }SqStack;//初始化栈 void InitStack(SqStack &S){S.top 0; } //判断栈是否为空 bool StackEmpty(SqStack S){if (…

深度学习之基于YoloV5钢材微小缺陷检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 在钢材生产过程中&#xff0c;由于各种因素&#xff0c;钢材表面可能会出现微小缺陷&#xff…

DevOps实践:通过云效实现hexo自动构建部署发布

DevOps&#xff08;Development和Operations的组合词&#xff09;是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#xff09;、技术运营和质量保障&#xff08;QA&#xff09;部门之间的沟通、协作与整合。这是一种重视“软件开发人员&a…

如何科学制定个性化健康方案?

随着现代生活节奏的加快&#xff0c;慢性病已经成为困扰许多人的健康难题。在这个信息爆炸的时代&#xff0c;如何科学、有效地管理个人健康&#xff0c;成为了我们每个人必须面对的问题。今天&#xff0c;我们就来探讨一下如何通过一体化解决方案&#xff0c;科学制定个性化健…

接口自动化测试工具-----pytest

首先确保安装了Python环境&#xff0c;首先&#xff0c;你需要确保已安装 Python 和 Pip。如果还没有安装&#xff0c;可以从 Python 官方网站下载并安装最新版本的 Python。安装过程中请确保选中“Add Python to PATH”选项。 安装pytest:打开命令提示符&#xff08;Command …

水面漂浮物生活垃圾识别检测系统

水面漂浮物生活垃圾识别检测系统通过现场监控摄像机对河道湖面等水体进行实时监测&#xff0c;水面漂浮物生活垃圾识别检测系统借助智能视频分析技术和YOLO深度学习技术&#xff0c;系统能够自动识别和抓拍水面上的垃圾漂浮物。一旦系统检测到有垃圾漂浮在水面上&#xff0c;立…

深度学习之基于暗通道算法+卷积神经网络图像去雾可视化系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理领域&#xff0c;图像去雾技术一直是一个重要的研究方向。由于雾霾等天气条件的影响…

软件测试/测试开发丨学习笔记之Allure2测试报告

Allure2测试报告 1、使用 Allure2 运行方式-Python 1&#xff09;–alluredir 参数生成测试报告。 在测试执行期间收集结果 pytest [测试用例/模块/包] --alluredir./result/ (—alluredir这个选项 用于指定存储测试结果的路径)#生成在线的测试报告 allure serve ./result2…

解决Ubuntu无法使用root登录的问题

1、登录普通用户 2、使用vi编辑器打开/etc/pam.d/gdm-autologin并注释掉auth required pam_succeed_if.so user ! root quiet_success 3、使用vi编辑器打开/etc/pam.d/gdm-password并注释掉auth required pam_succeed_if.so user ! root quiet_success 4、注销用户重新用roo…

Windows部署Jar包到系统服务(Service)

使用WinSW工具 1、工具下载地址&#xff1a;https://github.com/winsw/winsw/releases 选择最新版本下载 根据机器32位或者64位分别下载exe&#xff0c;再下载sample-minimal.xml文件 2、修改文件名 将两个文件名称修改为服务名&#xff0c;如&#xff1a; test.exe 和 test…