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

目录

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

二、类和对象的关系

三、学习类和对象的目的

四、怎样创建一个类

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.mzph.cn/pingmian/15799.shtml

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

相关文章

信号量——多线程

信号量的本质就是一个计数器 在多线程访问临界资源的时候,如果临界资源中又有很多份分好的资源,那么就可以通过信号量来表示里面还有多少份资源,且每份资源只有一个线程可以访问 线程申请信号量成功,就一定有一份资源是你的&…

python机器学习及深度学习在空间模拟与时间预测

原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247628504&idx2&sn6fe3aeb9f63203cfe941a6bb63b49b85&chksmfa77a9e5cd0020f3aa4f01887e75b15096a182c2b5b42c1044787aa285c650f1469a0ef28aec&token2124656491&langzh_CN&scene21#we…

网络模型—BIO、NIO、IO多路复用、信号驱动IO、异步IO

一、用户空间和内核空间 以Linux系统为例,ubuntu和CentOS是Linux的两种比较常见的发行版,任何Linux发行版,其系统内核都是Linux。我们在发行版上操作应用,如Redis、Mysql等其实是无法直接执行访问计算机硬件(如cpu,内存…

勒索软件分析_Conti

0. Conti介绍 勒索软件即服务(Ransomware as a Service,RaaS)变体 Conti 推出还不到两年,已经进行了第七次迭代。Conti被证明是一种敏捷而熟练的恶意软件威胁,能够自主和引导操作,并具有无与伦比的加密速度…

详细分析Element中的Drawer(附Demo)

目录 前言1. 基本知识2. Demo2.1 基本用法2.2 不同方向2.3 自定义大小2.4 嵌入表单2.5 嵌套抽屉 3. 实战4. Element Plus(Drawer) 前言 对于该组件针对Vue2比较多,而Element Plus中的Drawer针对Vue3比较多 此处的Demo主要偏向Vue2 后续的El…

探索 Mistral 新发布的具有原生函数调用功能的 7B 模型【附notebook文件】

引言 Mistral 发布了新版的 7B 模型,这次更新引入了原生函数调用功能。对于开发者和 AI 爱好者来说,这一更新极具吸引力,因为它增强了模型的功能和实用性。在这篇博客中,我们将深入探讨这些新功能,展示如何使用该模型…

小程序-修改用户头像

1、调用拍照 / 选择图片 // 修改头像 const onAvatarChange () > { // 调用拍照 / 选择图片 uni.chooseMedia({ // 文件个数 count: 1, // 文件类型 mediaType: [image], success: (res) > { console.log(res) // 本地临时文件路径 (本地路径) const { tempFilePath } …

wordpress主题模板兔Modown 9.1开心版附送erphpdown v17.1插件

Modown 9.1开心版是一款模板兔开发的wordpress主题可,持续更新多年,优秀的资源下载类主题该模板基于Erphpdown,可以销售软件、视频教程、文章等等,通过主题和插件结合可以实现付费下载、付费阅读等功能,配合模板兔的一…

数组-下一个排列

一、题目描述 二、解题思路 1.反向遍历当前排列,比如 排列A[a,b,c,d,e,f...] ,当遍历到e时,说明以 a,b,c,d,e为前缀的排列中不存在A排列的下一个排列。 2.把e(位置设为idx)和后面的元素作比较: 2.1 如果有…

【数据结构(邓俊辉)学习笔记】二叉树02——遍历

文章目录 0.概述1. 先序遍历1.1 递归版1.1.1 实现1.1.2 时间复杂度1.1.3 问题 1.2 迭代版11.3 迭代版21.3.1 思路1.3.2 实现1.3.3 实例 2. 中序遍历2.1 递归形式2.2 迭代形式2.2.1 观察2.2.2 思路(抽象总结)2.2.3 构思 实现2.2.4 分摊分析 3. 后序遍历3…

网络原理 一

一、协议 网络通信中,协议是非常重要的概念. 协议进行了分层,此处就是按照这几层顺序来介绍每一层中的核心协议. 应用层,就对应着应用程序,是程序员打交道最多的一层,调用系统提供的 网络api 写出的代码都是基于应用层的. 应用层这里当然也有很多现成的协议,但更多的还是,程…

JVM(三)

在上一篇中,介绍了JVM组件中的类加载器,以及相关的双亲委派机制。这一篇主要介绍运行时的数据区域 JVM架构图: JDK1.8后的内存结构: (图片来源:https://github.com/Seazean/JavaNote) 而在运行时数据区域中&#…

Vivado报错集合

Synth 8-5535 报错代码 [Synth 8-5535] port <clk_0> has illegal connections. It is illegal to have a port connected to an input buffer and other components. The following are the port connections : Input Buffer:Port I of instance clkin1_ibufg(IBUF) i…

SwiftUI中List的样式及使用详解(添加、移动、删除、自定义滑动)

SwiftUI中的List可是个好东西&#xff0c;它用于显示可滚动列表的视图容器&#xff0c;类似于UITableView。在List中可以显示静态或动态的数据&#xff0c;并支持垂直滚动。List是一个数据驱动的视图&#xff0c;当数据发生变化时&#xff0c;列表会自动更新。 针对List&#x…

树莓派4B 有电但无法启动

试过多个SD卡&#xff0c;反复烧系统镜像都无法启动。接HDMI显示器没有信号输出&#xff0c;上电后PWR红灯长亮&#xff0c;ACT绿灯闪一下就不亮了&#xff0c;GPIO几个电源脚有电&#xff0c;芯片会发热&#xff0c;测量多个TP点电压好像都正常。 ……

华为造车布局全曝光,对标奔驰、迈巴赫等

文 | Auto芯球 作者 | 雷慢 这一刻&#xff0c;我承认我格局小了&#xff0c; 就在刚刚&#xff0c;余承东曝光了华为智选车的布局计划&#xff0c; 华为问界、智界、享界等&#xff0c;将全面对标奔驰、迈巴赫、劳斯莱斯等车系&#xff0c; 这布局&#xff0c;确实是世界…

揭秘《庆余年算法番外篇》:范闲如何使用维吉尼亚密码解密二皇子密信

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

【yolov10】使用自己的数据集训练目标检测模型

【yolov10】使用自己的数据集训练目标检测模型 一、anaconda安装二、环境配置三、数据集制作1、labelimg的安装2、使用labelimg 四、正片1、下载yolov10源码2、数据集目录3、训练4、推理 一、anaconda安装 直接参考前一篇博客&#xff1a; https://blog.csdn.net/m0_71523511/…

击穿盲点——【网络安全】社会工程学中的网络欺骗

社会工程学起源于上世纪60年代左右&#xff0c;是一种通过人际交流的方式来获得情报的非技术渗透手段。这种手段无需过多技术要求&#xff0c;却非常有效&#xff0c;目前已成为危害企业网络安全的重大威胁之一。著名黑客凯文米特尼克在《反欺骗的艺术》中曾提到&#xff0c;人…

SpringBoot+Vue开发记录(七)-- 跨域文件与Restful风格

本篇文章的主要内容是关于项目的跨域配置和给项目添加restful风格接口。 重点是文件粘贴 文章目录 一、 跨域二、Restful风格1. 什么是restful风格&#xff1f;2. 项目文件结构3. 新建文件4. 在Controller中进行修改 一、 跨域 跨域问题暂时也就那样&#xff0c;解决方法就是…