【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,一经查实,立即删除!

相关文章

Python基础学习笔记(五)——选择结构与循环结构

目录 程序的组织结构条件选择结构1. 单分支结构2. 双分支结构3. 多分支结构4. 嵌套&#xff08;分支&#xff09;结构5. 无内容执行6. 条件表达式 循环结构1. 可迭代对象2. range()函数3. for循环语句4. while循环语句5. 结束语句 程序的组织结构 程序的组织结构主要有以下三种…

Flutter 中的 DraggableScrollableSheet 小部件:全面指南

Flutter 中的 DraggableScrollableSheet 小部件&#xff1a;全面指南 Flutter 提供了多种展示和交互数据的方式&#xff0c;其中 DraggableScrollableSheet 是一个功能丰富的组件&#xff0c;它允许用户通过拖拽操作来展开和隐藏一个可滚动的面板。这个小部件非常适合实现如评…

新媒体运营如何抓住热点? 沈阳新媒体运营培训

01.如何来寻找热点 热点之所以称为热点&#xff0c;就是它的实时性强&#xff0c;一般情况下我们将热点分为常规型热点和突发型热点&#xff08;社会型事件&#xff09;&#xff0c;但是对于新媒体运营来说&#xff0c;常规型热点是可以提前知晓的&#xff0c;可以预先策划的&…

树形结构-数据表模型

路径枚举模型 实现的无级树形列表 分类表 CREATE TABLE categories (name CHAR(10) NOT NULL,id CHAR(1) NOT NULL PRIMARY KEY,path VARCHAR(500) NOT NULL ); 加上 邻接表 的特性 CREATE TABLE categories (name CHAR(10) NOT NULL,id INT NOT NULL PRIMARY KEY,path VARC…

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;是一种数学表达式的表达…

.cjs 与 .js 后缀名,有什么不一样

.cjs 和 .js 后缀名在 Node.js 中表示不同的模块系统。主要区别在于它们分别使用 CommonJS 和 ECMAScript 模块系统。下面是它们的主要区别&#xff1a; .cjs&#xff1a;这个后缀名表示使用 CommonJS 模块系统。CommonJS 是 Node.js 最早采用的模块系统&#xff0c;它支持 re…

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

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

202103青少年软件编程(Python)等级考试试卷(四级)

第 1 题 【单选题】 10 个人站一列, 分苹果, 问第 10 个人分到多少个苹果, 他说比前面一个人多分到 2 个,依次往前, 都说比前面一个人多分到 2 个, 最后问第一个人, 他说分到 10 个苹果。 用以下函数求第 10 个人分到的苹果数, 则应补充选项为? ( ) def apple(n):…

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

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

Solved problem: The number of elements in the character array

Problem: 未解决的问题&#xff1a;字符数组中元素的个数-CSDN博客 Solution: Add \0 at the end of the character array More detailed content can be found in the link below. Sizeof and Length of character array-CSDN博客

如何将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…

GitLab的原理及应用详解(八)

本系列文章简介&#xff1a; 随着软件开发的不断进步和发展&#xff0c;版本控制系统成为了现代软件开发过程中不可或缺的一部分。而GitLab作为其中一种流行的版本控制工具&#xff0c;在软件开发领域享有广泛的应用。GitLab不仅提供了强大的版本控制功能&#xff0c;还集成了项…

echarts点击柱状图携带参数跳转页面

getBarCharts() {let that = thislet barWidth = 20let manColors = []let womanColors = []let nowTime = let lastTime = let option = {//提示框tooltip: {trigger: axis,formatter: function(p) {let div = `${p[0].name}<br/>${p[0].seriesName}:${p[0].value}<b…

EXPLAIN执行计划详解

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

【星海随笔】微信小程序(三)

网络数据请求 1.小程序中网络数据请求的限制 出于安全性方面的考虑,小程序官方对 数据接口的请求 做出了如下 两个限制: ① 只能请求 HTTPS 类型的接口 ② 必须将 接口的域名 添加到 信任列表 中 微信小程序只能请求 https 类型的接口 且需要请求的域名必须提前进行设置后,才可…

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

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

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

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