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

news2024/10/7 14:29:10

目录

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

二、类和对象的关系

三、学习类和对象的目的

四、怎样创建一个类

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/1697659.html

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

相关文章

css卡片翻转 父元素翻转子元素不翻转效果

css卡片翻转 父元素翻转子元素不翻转效果 vue <div class"moduleBox"><div class"headTitle"><span class"headName">大额案例</span></div><div class"moduleItem"><span class"module…

java 拦截器-用户无操作超时退出利用Redis

1、授权过滤&#xff0c;只要实现AuthConfigAdapter接口 2、利用Redis token超时时间&#xff0c;用户访问后台续时 效果 Component public class AuthFilter implements Filter {private static Logger logger LoggerFactory.getLogger(AuthFilter.class);Autowiredprivat…

《python编程从入门到实践》day39

# 昨日知识点回顾 创建主页、继承模版、显示特定主题页面 # view.py from django.shortcuts import render# 导入所需数据相关联的模型 from .models import Topic# Create your views here. def index(request):"""学习笔记的主页"""#…

GB报文中的Cseq值的注意点

一、 问题现象 【问题现象】NVR使用GB接三方平台发现倍速回放时&#xff0c; 【现场拓扑】现场拓扑如下 &#xff08;1&#xff09; NVR侧使用家用宽带的方式&#xff0c;通过国标跨公网接入三方平台。 图1.1&#xff1a;网络拓扑 二、 抓包分析 INVITE sip:420000004013200…

ABC354学习笔记

高桥有一棵植物&#xff0c;这个植物在第 0 0 0 天时高度为 0 c m 0\,\mathrm{cm} 0cm&#xff0c;此后的第 i i i 天&#xff0c;他的植物会增高 2 i c m 2^i\,\mathrm{cm} 2icm。 高桥身高为 H c m H\,\mathrm{cm} Hcm。 高桥想知道在第几天&#xff0c;他的植物的高度会…

grpc、多集群、多租户

gRPC和服务发现 一个A high-performance, open-source universal RPC framework&#xff0c;高性能、开源的通用 RPC 框架。使用protobuf 语言基于文件定义服务&#xff0c;通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端 Stub。移动端上面则是基于标准的 HTTP…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十三)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 我们&#xff0c;继续讲一…

如何将前端项目打包并部署到不同服务器环境

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站尚硅谷的前端讲师【张天禹老师】整理的&#xff0c;用于自己复盘&#xff0c;有需要学习的可以去b站学习原版视频&…

three.js判断物体在人的前面,还是后面

three.js判断物体在人的前面&#xff0c;还是后面 const player new THREE.Vectors(10, 0, 5); const mesh new THREE.Vectors(15, 0, 6);上面&#xff0c;两个变量分别表示&#xff0c;玩家的位置&#xff0c;物体的位置。 从这发现&#xff0c;当玩家和物体的角度关系 小…

网络协议——RTSP(简介、搭建RTSP服务器)

一、简介 1、什么是RTSP RTSP&#xff08;Real-Time Streaming Protocol&#xff0c;实时流传输协议&#xff09;是一种网络应用协议&#xff0c;旨在用于在互联网上进行娱乐和通信的实时流媒体的控制。它允许客户端远程控制媒体服务器上的流媒体播放&#xff0c;例如播放、暂…

决定新泽西州版图的关键历史事件

决定新泽西州版图的关键历史事件 1. *民地建立&#xff1a;1664年&#xff0c;新泽西成为英国*民地。该地区原为荷兰*民地的一部分&#xff0c;但同年根据英王查理二世的赐予&#xff0c;转归给了他的兄弟约克公爵&#xff08;后来的詹姆士二世&#xff09;&#xff0c;之后又被…

Matlab 结构光相移法(单频多相)

文章目录 一、简介1、基于点的测距2、基于条纹的测距二、条纹编码2.1 二进制编码2.2相移法三、实现代码参考文献一、简介 在介绍相移法之前,我们需要先了解一下为啥会有相移法,了解了其来龙去脉,则更容易去应用它。 1、基于点的测距 首先我们从点的测距开始,这有点类似于立…

C++笔试强训day33

目录 1.跳台阶扩展问题 2.包含不超过两种字符的最长子串 3.字符串的排列 1.跳台阶扩展问题 链接https://www.nowcoder.com/practice/953b74ca5c4d44bb91f39ac4ddea0fee?tpId230&tqId39750&ru/exam/oj 我是用动态规划解决的&#xff1a; #include <iostream>…

Oracle 并行和 session 数量的

这也就是为什么我们指定parallel为4&#xff0c;而实际并行度为8的原因。 insert create index&#xff0c;发现并行数都是加倍的 Indexes seem always created with parallel degree 1 during import as seen from a sqlfile. The sql file shows content like: CREATE INDE…

【傻呱呱】python安装phook3(Windows端)

前期准备 swig程序Visual Studio C 构建工具 配置swig程序 将下载好的“swig-4.2.1”压缩包解压到C盘从C盘打开“swig-4.2.1”文件夹并复制文件夹路径 在开始菜单里搜索“环境变量”&#xff0c;点击“编辑系统环境变量” 点击“环境变量” 找到“path”并双击 点击“新建” …

K8S认证|CKA题库+答案| 13. sidecar 代理容器日志

目录 13、使用 sidecar 代理容器日志 CKA v1.29.0模拟系统 下载试用 题目&#xff1a; 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、生成yaml文件 3&#xff09;、官网找模板 4&#xff09;、编辑yaml文件 5&#xff09;、应用yaml文件 ​6&…

吉林大学软件工程简答题整理

1.6种软件过程模型列举&#xff0c;及优缺点&#xff08;每个都从时间、质量、过程、本身特点去考虑&#xff09; 瀑布模型 优点缺点V模型 优点&#xff1a;缺点&#xff1a; 原型模型 优点&#xff1a;演化模型 建增模型 优点缺点螺旋模型 优点缺点喷泉模型 RUP、敏捷工程、…

kubernetes(Jenkins、kubernetes核心、K8s实战-KubeSphere、)

文章目录 1. Jenkins1.1. 概述1.1.1. 简单部署1.1.2. 自动化部署1.1.3. DevOps概述1.1.4. CI/CD概述 1.2. jenkins介绍及安装1.2.1. 安装1.2.2. 解锁jenkins1.2.3. 安装推荐插件1.2.4. 创建管理员用户1.2.5. 升级jenkins版本1.2.6. 安装额外插件blue ocean1.2.7. jenkins界面说…

Rust后台管理系统Salvo-admin源码编译

1.克隆salvo-admin后台管理系统源码: https://github.com/lyqgit/salvo-admin.git 2.编译 编译成功 3.创建mysql数据库与执行sql脚本 输入名称ry-vue 执行sql脚本 全部执行上面3个sql 修改数据库用户名与密码: 清理及重新编译 cargo clean cargo build 4.运行并测试 cargo…

【组合数学】常考试题答案

一、单项选择题&#xff08;每小题3分&#xff0c;共15分&#xff09; 1. 用3个“1”和4个“0”能组成&#xff08; &#xff09;个不同的二进制数字。 A. 35 B. 36, C. 37, D. 38 2. 整除300的正整数的个数为&#xff08;  &#xff09;。 A. 14…