Java中类和对象
类和对象
- 面向对象的认识
- 类的定义和使用
- 1 类的定义
- 2 类的创建
- 3 类的实例化
- 构造方法
- 1 构造方法的概念
- 2 构造方法的注意事项
- this关键字
面向对象的认识
前言
何为面向对象何为面向过程呢?,C语言是最经典的面向过程的语言,但是C语言虽然可以解决一定的问题,但是在解决复杂的问题的时候,这时候编写会变得有些困难。这时候就要引出了面向对象语言的出现。
面向对象的定义
⾯向对象是解决问题的⼀种思想,主要依靠对象之间的交互完成⼀件事情。使用面向对象的方式更符合人的思考,尤其是对大型程序的设计、扩展和维护很好
Java就是一个面向对象的语言,在面向对象的世界,一切皆为对象
面向对象和面向过程都有自己的有优缺点,根据具体场景来进行进行使用
类的定义和使用
1 类的定义
在面向对象的语言中一切皆为对象,比如:生活中我们的电脑,我们并不需要关心其内部如何运行的,只需要关系如何使用电视机就行。
类是用来对一个实体进行描述的
例如:电脑
属性:颜色、品牌、大小、价格等等
功能:放视频、打字、玩游戏
这个电脑就像是一个类,会有一些属性和功能
2 类的创建
Java中创建需要使用到class关键字
class ClassName{ field; // 字段(属性) 或者 成员变量 method; // ⾏为 或者 成员⽅法
}
这里的ClassName就是类的名称,整个大括号就是类的全部
这里的field是类的成员变量,这里的method就是类的成员方法,相当于有哪些东西,有哪些功能
例如:
public class Computer {public String cpu; // cpupublic String memory; // 内存//被private修饰后只可以在这个类中使用public String screen; // 屏幕public void movie(){System.out.println("放视频");}public void game(){System.out.println("玩游戏");}
}

这样我们就创建好了一个类
注意事项:我们创建的时候类名采用大驼峰
这里定义类的方法和以前的同一个类中定义的方法有所不同这里没有stastic
类的名称和文件名相同
3 类的实例化
类相当于我们自己创造了一个新的类型,就像Java自带的int double等等自带的类型,
那我们如何使用这个类呢?
public class Dog{public String name;public int age;public void eat(){System.out.println(name+"吃饭");}}
上面我们创建了一个Dog类
我们用类的类型来创建对象的过程,这就成为类的实例化,这里Java需要使用new关键字,来创建
例如:我们使用上面的Dog类来进行创建(两个放在不同的文件夹)
public class Test {public static void main(String[] args) {Dog dog = new Dog();Dog dog1 = new Dog();dog.age = 3;//初始化System.out.println(dog.age);System.out.println(dog.name);}
}

运行结果如下

我们发现一个问题,这里我们创建了Dog类型的变量,但是我们没有初始化,为什么没有出错呢,那是因为类中如果没有初始化,他们会默认初始化,就像Java中的数组一样
| 类型 | 默认值 |
|---|---|
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0 |
| float | 0.0f |
| double | 0.00 |
| char | /u000 |
| boolean | false |
| String | null |
new来实例化对象
. 来访问类的变量 /方法
一个类可以实例化多个对象
实例化出的对象占⽤实际的物理空间,存储类成员变量
构造方法
1 构造方法的概念
构造⽅法(也称为构造器)是⼀个特殊的成员⽅法,名字必须与类名相同,在创建对象时,由编译器⾃动调⽤,并且在整个对象的⽣命周期内只调⽤⼀次。
class Date{public int year;public int month;public int day;//方法public void date(int year,int month ,int day){this.year = year;this.month = month;this.day = day;System.out.println("方法被执行了");}//构造方法public Date(int year,int month,int day){this.year = year;this.month = month;this.day = day;System.out.println("构造方法被执行了");}public void printdate(){System.out.println(year+"/"+month+"/"+day);}public static void main(String[] args) {Date date1 = new Date(2000,3,12);date1.date(2000,3,21);date1.printdate();}
}
运行结果如下
可以看出这里的构造方法是在创建一个新对象的同时,进行了传递,后面又调用了方法,构造方法中的值被方法覆盖了

构造方法与类的方法的区别

2 构造方法的注意事项
1 构造方法名字必须与类名相同,没有返回值类型
例如:我们以上面的Date类进行举例

这时候我们Date的构造方法有了void返回类型,编译器就会报错,不可以有类型
2 创建对象的同时编译器会自动调用构造方法,这里参数要和构造方法大小和类型相同,并且一个对象只会调用一次构造类型

上面我们创建一个Date类型的话,我们在new新对象的时候必须和Date传参保持一致否则会报错
就像下面这样会报错

但是我们发现一个问题,我们在new新对象的时候都要引用构造类型,但是以前我们并没有编写Date构造方法,然而并没有报错为什么呢?

是因为以前我们没有编写构造方法,编译器会给我们生成一个默认没有参数的构造方法,这样我们在new新的对象的时候没有报错
那为什么上面我们调用不带参数的为什么报错了呢,不是说编译器会帮我们写吗,这是因为如果我们已经写了构造方法编译器就不会默认生成不带参数的了,上面这样的必须和编写的构造方法参数一致
我们即想要无参类型又想要有参类型,该怎么做呢
3 构造方法构成重载,构造方法也可以像普通的方法一样构成重载
class Date{public int year;public int month;public int day;//构造方法public Date(int year,int month,int day){this.year = year;this.month = month;this.day = day;System.out.println("三个参数构造方法被执行了");}public Date(){System.out.println("无参的构造方法被执行");}public Date(int year){this.year = year;System.out.println("一个参数的构造方法被执行");}public void printdate(){System.out.println(year+"/"+month+"/"+day);}public static void main(String[] args) {Date date1 = new Date();//无参Date date2 = new Date(2000,3,21);//3个参数Date date3 = new Date(2000);//一个参数}
}

从上面我们可以看出,这里构成了重载,不同的进入了不同的构造方法,这样我们可以自己创建需要几个对象的构造方法,直接调用就行
构造方法的名称与类名必须相同
构造方法没有返回类型
构造方法只在new创建一个新的对象的时候进行调用
构造方法可以构成重载
this关键字
this关键字的使用
this.成员变量 //访问对象的成员变量
this.成员⽅法 //访问对象的成员⽅法
this(参数列表)//类中调用类的构造方法
public class Date{public int year;public int month;public int day;//方法public void date(int year,int month ,int day){this.year = year;this.month = month;this.day = day;//this访问成员方法this.printdate();}public void printdate(){System.out.println(year+"/"+month+"/"+day);}public static void main(String[] args) {Date date1 = new Date();Date date2 = new Date();date1.date(2000,3,21);}
}
运行结果如下
这里我们使用this调用的成员方法

如果把this关键字去掉的话,并且这里的形参和实参相同,我们会发现一个问题,这里的传参好像并没有传进去
这里的还是类中默认值0 这里是因为是将类中的数据对应赋值,并不是我们所传入的参数
所以这里相当于 给他们都赋值为 0默认值

this引⽤指向当前对象(成员⽅法运⾏时调⽤该成员⽅法的对象),在成员⽅法中所有成员变量的操作,都是通过该引⽤去访问
this.year = year;this.month = month;this.day = day;这样的话就可以正常的赋值了,是因为这里表示的是当前对像被引用
this只能在类的方法中使用
像这样就是错误的使用this,this不可以在类外使用,只能在类中方法中使用

this访问构造方法
public class Date{public int year;public int month;public int day;//方法public Date(){//调用三个参数的构造方法this(2000,3,11);}public Date(int year,int month ,int day){this.year = year;this.month = month;this.day = day;//this访问成员方法this.printdate();}public void printdate(){System.out.println(year+"/"+month+"/"+day);}public static void main(String[] args) {Date date1 = new Date();}
}
运行结果如下
这样我们可以在Date方法调用三个参数的构造方法

但是我们要注意这里的this语句要放在第一行
如果不放在第一行就会报错

把this放在第一行就不会报错了
this的类型:对应类类型引⽤,即哪个对象调⽤就是哪个对象的引⽤类型
this只能在"成员⽅法"中使⽤在,只能引用当前对象
this如果引用类中的构造类型必须放在第一句
this不可以在类外使用
到这里就结束了,希望对大家有所帮助,欲知后事如何,请听下回分解
相关文章:
Java中类和对象
类和对象 面向对象的认识类的定义和使用1 类的定义2 类的创建3 类的实例化 构造方法1 构造方法的概念2 构造方法的注意事项 this关键字 面向对象的认识 前言 何为面向对象何为面向过程呢?,C语言是最经典的面向过程的语言,但是C语言虽然可以解决一定的问…...
文本组件+Image组件+图集
Canvas部分知识补充 元素渲染顺序 以Hierarchy参考 下方物体在上方物体前显示 子物体在父物体前显示 下方物体永远在前显示,无论上方的层次结构 资源导入 绝对路径:C:\Windows\Fonts下的许多字体可以用做UIText的字体资源 图片导入: 1.图…...
Audacity 技术浅析(一)
Audacity 是一个开源的音频编辑工具,虽然它主要用于音频编辑和处理,但也可以通过一些插件和功能实现基本的音频生成功能。 1. Audacity 的音频生成基础 Audacity 的音频生成主要依赖于其内置的生成器、效果器以及 Nyquist 编程语言。这些工具允许用户创…...
PyCharm 2019.1.3使用python3.9创建虚拟环境setuptools-40.8.0报错处理
目录 前置: 一劳永逸方法(缺最后一步,没有成行) step one: 下载高版本的pip、setuptools、virtualenv的tar.gz包 step two: 进入PyCharm安装目录的 helpers 目录下 step three: 下载并安装grep和sed命令,然后执行 …...
敏捷开发在中小团队中的应用与挑战:实战指南与避坑手册
文章目录 敏捷开发在中小团队中的应用与挑战:实战指南与避坑手册引言:为什么中小团队更需要敏捷?一、敏捷开发适配中小团队的底层逻辑1.1 中小团队的典型特征1.2 敏捷开发的价值放大器效应 二、敏捷实施的五大实战步骤2.1 团队定制化改造&…...
服务器部署RocketMQ----Docker方式
拉取镜像并创建docker network 按照官方文档提供的方式拉取镜像:docker pull apache/rocketmq:4.9.6 创建一个docker网络:docker network create rocketmq 启动NameServer以及Broker 启动NameServer # 启动NameServer docker run -d --name rmqnames…...
【推荐项目】052-用水监控管理系统
052-用水监控管理系统 介绍 用水监控管理系统 springboot java vuejs jdk1.8 当然,以下是一个简洁的用水监控管理系统的功能模块划分,基于Spring Boot(JDK 1.8)后端和Vue.js前端: 用水监控管理系统功能模块 后端&…...
零基础上手Python数据分析 (2):Python核心语法快速入门
写在前面 场景:每周销售数据报表整理 任务描述: 你需要每周从多个Excel文件中汇总销售数据,计算各项指标(销售额、订单量、客单价等),并生成周报。Excel操作痛点: 文件太多,手动打开复制粘贴,效率低下,容易出错。 多个Excel文件,每个都要打开、筛选、复制数据,重复…...
大模型MCP协议与Function Calling:构建更智能的AI生态系统
随着大型语言模型(LLM)的快速发展,如何高效地将这些模型与外部数据源、工具和服务进行集成,成为了一个亟待解决的问题。Anthropic推出的Model Context Protocol(MCP协议)和Function Calling技术为此提供了有…...
【C++】RAII机制
什么是RAII机制? RAII(Resource Acquisition Is Initialization)是 C 中的一种重要编程范式,用于管理资源(如内存、文件句柄、网络连接等)的生命周期。 RAII 的核心思想是:资源的获取与初始化绑…...
游戏引擎学习第160天
回顾和今天的计划 我们没有使用任何游戏引擎和库,完全靠我们自己,使用的是老式的编程方式。 我们已经构建了很多内容,游戏引擎开发也慢慢接近尾声。现在我们已经接近完成了所有为支持游戏开发所需要的工作,接下来将逐步过渡到游戏…...
Webpack 知识点整理
1. 对 webpack 的理解?解决了什么问题? Webpack 是前端工程化领域的核心工具,其核心定位是模块打包器(Module Bundler),通过将各类资源(JS、CSS、图片等)视为模块并进行智能整合…...
从零搭建微服务项目Pro(第2-2章——JSR303自定义文件校验+整合至微服务公共模块)
前言: JSR 303,即 Bean Validation,是 Java EE 6 中的一项子规范,旨在为 Java Bean 提供一种标准化的数据验证机制。它通过注解的方式,允许开发者在 Java 类的字段或方法上直接定义验证规则,从而将验证逻辑…...
如何用URDF文件构建机械手模型并与MoveIt集成
机械手URDF文件的编写 我们用urdf文件来描述我们的机械手的外观以及物理性能。这里为了简便,就只用了基本的圆柱、立方体了。追求美观的朋友,还可以用dae文件来描述机械手的外形。 import re def remove_comments(text):pattern r<!--(.*?)-->…...
uv pip install -r requirements.txt-报错,python版本过低
升级Python版本(推荐) browser-use0.1.40 需要 Python ≥3.11,但你的环境是 Python 3.10.12。升级Python版本是最直接的解决方案: 安装Python 3.11: 使用 pyenv(Linux/macOS):pyenv…...
【训练细节解读】文本智能混合分块(Mixtures of Text Chunking,MoC)引领RAG进入多粒度感知智能分块阶段
喜欢本文可以在主页订阅专栏哟 核心创新:双重评估指标与混合分块架构: 第一章:检索增强生成(RAG)技术演进与分块挑战 1.1 RAG架构的核心演变 检索增强生成(Retrieval-Augmented Generation)…...
招聘信息|基于SprinBoot+vue的招聘信息管理系统(源码+数据库+文档)
招聘信息管理系统 目录 基于SprinBootvue的招聘信息管理系统 一、前言 二、系统设计 三、系统功能设计 5.1系统功能模块 5.2管理员功能模块 5.3企业后台管理模块 5.4用户后台管理模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…...
HCIA-AI人工智能笔记1:大模型技术演进与发展历程
一、大模型发展的技术演进图谱 timelinetitle 大模型发展关键里程碑1958 : 感知机模型诞生(Frank Rosenblatt)1986 : BP反向传播算法(Rumelhart)2012 : AlexNet开启深度学习时代2017 : Transformer架构提出(《Attenti…...
躲藏博弈中的策略优化:整合历史数据、概率论与博弈论
躲藏博弈中的策略优化:整合历史数据、概率论与博弈论 一、引言 躲藏博弈(Hiding Games)作为一类特殊的博弈模型,广泛存在于军事对抗、网络安全、商业竞争甚至日常生活中。其核心在于一方(躲藏者)试图避免被另一方(寻找者)发现,双方各自选择…...
C语言,记录一次局部变量被意外修改的问题
背景:单片机开发过程中,我在函数体内(begin_face_record)定义了一个局部变量data_length,在使用的时候,该局部变量一直别改变,每次调用其他函数,例如c库里面的函数memcpy,不知什么情况data_length值就会被改变。 1、源码分析 void main(void) { init_gpio();init_fa…...
机器学习——正则化、欠拟合、过拟合、学习曲线
过拟合(overfitting):模型只能拟合训练数据的状态。即过度训练。 避免过拟合的几种方法: ①增加全部训练数据的数量(最为有效的方式) ②使用简单的模型(简单的模型学不够,复杂的模型学的太多&am…...
在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别
在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述: picker 是微信小程序中的原生组件,通常用于选择单项或多项值,如时…...
向量数据库对比以及Chroma操作
一、向量数据库与传统类型数据库 向量数据库(Vector Storage Engine)与传统类型的数据库如关系型数据库(MySQL)、文档型数据库(MongoDB)、键值存储(Redis)、全文搜索引擎࿰…...
Python Matplotlib面试题精选及参考答案
绘制函数 y2x5 在区间 [1,10] 的折线图,设置标题和坐标轴标签 要绘制函数 y 2x 5 在区间 [1, 10] 的折线图,并设置标题和坐标轴标签,可借助 Python 的 matplotlib 库来实现。以下是详细的实现步骤与代码示例。 首先,要导入 mat…...
FiddlerScript学习笔记
参考官方文档:https://www.fiddlerbook.com/fiddler/dev/scriptsamples.asp json // 反序列化 static function jsonDecode(str : String){return Fiddler.WebFormats.JSON.JsonDecode(str).JSONObject; } // 序列化 static function jsonEncode(jsonObject : Obje…...
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-5.1 uboot顶层Makefile分析-VSCode工程创建
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
Linux内核IPoIB驱动中的RSS队列选择机制分析
摘要 本文深入分析了Linux内核中InfiniBand over Ethernet(IPoIB)驱动程序的发送队列选择函数ipoib_select_queue_sw_rss的实现。该函数通过复杂的条件编译和逻辑分支,实现了基于软件的接收端扩展(RSS)功能,确保网络流量在多队列环境下的高效分发,提升网络性能和吞吐量…...
js数组遍历十种方法
在JavaScript中,数组遍历可以有多种方法。以下列举了10种常用的数组遍历方式: For 循环 let array [1, 2, 3, 4, 5]; for (let i 0; i < array.length; i) {console.log(array[i]); }For-of 循环(ES6) let array [1, 2, 3, …...
OTP单片机调试工具之—单线数据编码
OTP单片机调试工具在实现过程中离不开单线数据的传输,那么使用哪一种方式的数据编码会比较好呢? 我所了解的主要有以下三种: 1.UART(串口),这种方式在单片机和pc之间进行传输都非常常见,效率比较…...
SWPU 2022 新生赛
webdog1__start if (isset($_GET[web])) {$first$_GET[web];if ($firstmd5($first)) md5 自等 web0e215962017 (md5后也是 0e) 登入后得到提示,robots.txt 访问 f14g.php 返回包里发现 hint > if (isset($_GET[get])){$get$_GET[get];if(!strs…...
