Java--初识类和对象
前言
本篇讲解Java类和对象的入门版本。
学习目的:
1.理解什么是类和对象。
2.引入面向对象程序设计的概念
3.学会如何定义类和创建对象。
4.理解this引用。
5.了解构造方法的概念并学会使用考虑到篇幅过长问题,作者决定分多次发布。
面向对象的引入
Java是一门面向对象的程序设计语言。那么面向对象具体是啥意思呢?
面向对象(Object-oriented)更多是一种思维模式,它替换了原有的面向过程的思考方式,转为了面向对象。这种编程思想强调了将问题分解为对象的集合,对象有各自的属性和方法,对象与对象之间又有信息传递和行为协助。
- 总结:解决问题的重心由拆分步骤,改变成拆分成对象,对象和对象的协作上。编程思维模式的转变
面向过程编程
如果你先前学过任何一门面向过程的编程语言,比如C语言。回忆一下,先前解决问题是不是研究解决一个问题的过程是怎样的?
它的重点在于如何完成任务,要实现哪些功能的函数,函数接收参数返回值,执行一系列的逻辑结构过程,然后才是研究数据应该采用什么数据结构存储,最后输出正确的结果。
面向过程首先考虑的是如何处理数据即算法,其次是数据如何存储(数据结构)。
面向对象编程
面向对象编程(Object-Oriented Programming)简称OOP.它是一种以对象为中心的编程范式,对象有自己的状态行为,通过封装,继承,多态实现代码的模块化。实现对象与对象之间的协作和交互。
与面向过程对比,面向对象先考虑的是数据如何存储,将相关联的数据和方法包装成一个对象。其次考虑处理对象与对象之间。可以说先数据结构后算法,与面向过程反着来了。
生活化的示例
传统洗衣服(面向过程)
1.拿脏的衣物。
2.水槽装足够的水
3.加入洗衣粉
4.将脏衣服放入水槽
5.疯狂手搓
6.冲洗衣服
7.换水
8.继续冲洗衣服
9.拧干洗好的衣服
10.晾衣服。
现代洗衣服(面向对象)
确定对象 脏衣物,洗衣粉,洗衣机
我们人为交互
1.将脏衣物放入洗衣机
2.倒入洗衣粉。
3.设定洗衣机的程序。
洗完后,取出晾干就可以了。
整个都是三个对象的交互。洗衣机怎么洗的,内部怎么运作的?I don’t care.
总之我知道按照上面三步衣服就洗好了。
类和对象的概念
举个栗子,人就是一个类。人有姓名,年龄,身高,体重,家庭住址。但人的概念太抽象了,太广泛了。那么张三,小红,李华,你和我,就是具体的人了,我们也有上面的姓名身高年龄。
所以呢,*类是类型,蓝图,模板。*即上面例子中的人。那么后面的张三就是具体的人,就称为一个对象。人有的属性,张三也有。
所以,类可以描述对象,对象是类的实例化。
类
接下来正式介绍类
类(class)是构造( construct ) 对象的模板和蓝图, 由类构造对象的过程称为创建类的实例 ( instance ) 。
现在笼统的阐述类的特点,后面补充实例
类的特点:
1.属性(fileds):类可以定义成员变量。成员变量体现的是对象的属性(状态特征)。每个对象通过各自类的属性有自己的特点状态。
2.方法(methods):类内部可以定义成员方法,简称方法或者函数。方法定义了对象的行为,方法可以让对象执行某种特定的功能,更能完成对象与对象的协作。
3.类的实例化(instance):类本身只是一个模板,类似C中的结构体。只有实例化(构造对象),它内部的属性和方法才有意义。如何创建下面会给出例子。
4.构造方法(construct):这里先不提,往后看下去,后面会讲。
5.封装类,抽象类,继承,接口…………这里不提。其实作者也没懂完
现在可以定义一个类了
类的基本语法(目前掌握以下这些就够了)
class 类名{
//属性:成员变量//成员方法
}
1.class 类的关键字,定义一个类必须有。
2.类名:遵循标识符的命名规则,采用大驼峰命名法。
3.花括号别忘了,别漏了。
4.属性(成员变量):这里可以定义各种类型变量表示类的状态了。
5.成员方法:定义类的行为与操作。
下面定义一个Dog类
public class Dog {
//成员变量public String name;public int age;//成员方法public void bark(){System.out.println("Ruff! Ruff!");}
}
上面我们定义这样一个类,该类有两个成员变量,分别是字符串name和int年龄。还有bark这样一个成员方法表示dog在叫的行为。
这里的public是访问修饰符,表示类,成员变量,成员方法的访问权限。
类的实例化
由类生成对象的过程叫做类的实例化
类在Java中为引用类型。
int double float为内置类型(基本数据类型),Java中与其相对的类型称为引用类型,数组字符串也是引用类型。引用类型也是自定义类型,类是用户自定义出来的类型。
Java中由类创建一个对象,要用到关键字new.
Dog dog=new Dog();
语法:
类名 变量名 = new 类名()
这里Dog就是先前定义的类了。
dog是这个类类型的变量名。
new “给我一个对象” 后面跟上Dog()就创建了一个属于Dog的对象了。
new后面其实跟着的是构造方法,这个稍后再说。
既然创建了对象,我们定然想到如何处理对象呢。
dog.age=1;dog.name="Bin";dog.bark();
通过圆点运算符(.)我们就可以访问对象的成员了和方法了。
这里对象继承了类的属性,这个实例化的dog也有了name和age,也能调用bark()方法了。
假设我们不对对象初始化操作,会出现问题吗?
不会,因为局部变量未初始化会被编译器报错警告。而对象的成员变量不在栈上而在堆上,未初始化会有对应的默认值。
Dog dog=new Dog();System.out.println(dog.name);System.out.println(dog.age);
对于引用类型,其默认值为null;内置类型就为相应的0值,int对于0,float对应0.0F,double对应0.0,另外boolean对应false。
我这里的dog在main方法内部创建,就是局部变量在栈上开辟一块空间,同时在堆上为这个对象开辟合适的空间保存对象的属性。这里的dog实际存储了对象在堆上的地址,dog就称为一个引用。通过引用,我们访问对象的成员。
对象
其实类那一部分已经说明完大部分对象的内容,这里稍作补充和总结。
对象有状态。这里的状态从代码来看就是成员变量的值不同,反过来就算同一个类的对象成员变量的值不同说明他们之间状态不同。
对象有行为。根据对象的状态,调用成员方法行为上不同,反之根据自身的行为(方法调用)也会影响自身状态。
对象有名字。每个对象应该有独立的标识符来区分不同
对象与对象之间独立。每个对象有自己的状态和行为。
认识this引用
关键字this
先定义如下一个类
里面的setData成员方法中的形参与成员变量名同名还能进行赋值吗?
public class Date {public int year;public int month;public int day;public void setDate(int year,int month,int day){year=year;month=month;day=day;}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}
}
public class Date {public int year;public int month;public int day;public void setDate(int year,int month,int day){year=year;month=month;day=day;}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}public static void main(String[] args) {Date date=new Date();date.setDate(2024,5,13);date.printByString();}
}
运行结果是怎样的呢?修改data对象的值了吗?
答案必然是没有!否则这里要说明的this干嘛呢。
很明显,这里setDate里形参和成员变量名重复了,左值的year究竟代表了成员变量还是形参呢?是形参。
所以,这里上述的赋值就是自我娱乐,对成员变量没有影响。因为调用方法时会在栈上开辟空间称作函数栈帧,此时局部变量(函数形参)优先使用。
这个时候就要用上this对setDate函数做出如下修改。
public void setDate(int year,int month,int day){this.year=year;this.month=month;this.day=day;}
这里的this相当于原来的date对象,很显然this.成员变量和方法参数区分开了。说明了这里左值同名的year,month,day是引用(data对象)的成员变量。避免出现同名时混淆的情况。
那么this是怎样知道它代表哪个引用呢?
实际上那个对象的引用在某个方法时会将这个引用当作函数参数传递过去。
实际的setDate写成下面这样。只不过我们写的时候省略了第一个参数罢了。
由此我们可以知道那个对象的引用在调用某方法时,这个this就代表谁了。
public void setDate(Date this,int year,int month,int day){this.year=year;this.month=month;this.day=day;}
这里的this由于就是date,它也可以调用自身的成员方法。
public class Date {public int year;public int month;public int day;public void setDate(Date this,int year,int month,int day){this.year=year;this.month=month;this.day=day;this.printByString();}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}public static void main(String[] args) {Date date=new Date();date.setDate(2024,5,13);}
}
this还有一个用处调用其它构造方法
构造方法
前面提过成员方法,那么构造方法和成员方法有什么区别呢?类比学习一下吧。
一般的成员方法格式:
返回值 方法名(参数列表){
//方法体
}
构造方法可以看作特殊的成员方法
第一,它没有返回值类型。
第二,它的方法名和它的类名一样。
即
构造方法格式:
返回值方法名类名(参数列表){
//方法体
}
public Date(){}
这就是一个简单的构造方法。
想到前面这个Date date=new Date();
new后面的 Date()不就是一个构造方法吗?哎奇怪,当时我们并没有创建这样的构造方法呀。
事实上,如果定义的类没有构造方法,编译器会默认给你上述的构造方法,这种构造方法是最简单的。没有带任何参数。
需要注意的是,如果你自己创造了一个构造方法,请严格按照你的构造方法创建对象,此时编译器不会在为你默认这么一个构造方法了。
下面给出一个带参数形式的构造方法。
public Date(int year,int month,int day){this.year=year;this.month=month;this.day=day;}
这样就可以在创建对象时同时初始化成员变量了。
构造方法同样支持重载。即上面两个构造方法可以同时存在一个Date类中。
public class Date {public int year;public int month;public int day;public void setDate(Date this,int year,int month,int day){this.year=year;this.month=month;this.day=day;this.printByString();}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}public Date(){}public Date(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public static void main(String[] args) {Date date=new Date(2004,12,8);date.printByString();}
}
最后总结一下构造方法:
1.构造方法名与类名相同。
2.无返回值类型,不要理解成返回值类型为void
3.创建对象时调用,且只能调用一次。
4.构造方法可以重载。(比如上面的构造方法在创建对象时可以选择不带参数,还可以选三个参数初始化的)
5.如果没有自定义构造方法,那么编译器默认会构造方法。
结尾
想不出来说什么了,太困了。嗯~
一无所有,或者赢下所有
相关文章:

Java--初识类和对象
前言 本篇讲解Java类和对象的入门版本。 学习目的: 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题,作者决定分多次发布。 面向对象的引入 J…...
SpringBoot如何实现动态数据源?
在Spring Boot中实现动态数据源主要涉及到创建和管理不同的数据源,并在运行时根据需要切换。这可以通过编程方式配置Spring的AbstractRoutingDataSource来完成。下面我会逐步介绍如何实现动态数据源,并给出代码示例。 第1步:添加依赖 首先&…...

win10安装mysql8.0+汉化
一、官网安装 MySQL 1. 在mysql官网进行下载页面 2. 下滑页面,选择 MySQL community download 3.下载windows版本 4.选择第二个download 5.不用登陆,no thanks,just start my download. 6.下载 二、安装 1. 双击安装 2. 选 Full->next 3…...

全网最全的Postman接口自动化测试!
该篇文章针对已经掌握 Postman 基本用法的读者,即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求的操作。 当前环境: Window 7 - 64 Postman 版本(免费版):Chrome App v5.5.3 不同版本页面 UI 和部分…...

Spring:了解@Import注解的三种用法
一、前言 在 Spring 框架中,Import 注解用于导入配置类,使得你可以在一个配置类中引入另一个或多个配置类,从而实现配置的模块化。这对于组织大型应用程序的配置非常有用,因为它允许你将配置分散到多个类中,然后再将它…...

简要介绍三大脚本语言 Shell、Python 和 Lua
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 脚本语言是一种用于自动化操作系统任务和应用程序功能的编程语言。它们通常用于编写小到中等规模的程序,以提高任务执行的速度和效率。在众多脚本语言中,Shell、Python 和 Lua 是…...

第 397 场 LeetCode 周赛题解
A 两个字符串的排列差 模拟:遍历 s s s 记录各字符出现的位置,然后遍历 t t t 计算排列差 class Solution {public:int findPermutationDifference(string s, string t) {int n s.size();vector<int> loc(26);for (int i 0; i < n; i)loc[s…...

文件存储解决方案-阿里云OSS
文章目录 1.菜单分级显示问题1.问题引出1.苹果灯,放到节能灯下面也就是id大于1272.查看菜单,并没有出现苹果灯3.放到灯具下面id42,就可以显示 2.问题分析和解决1.判断可能出现问题的位置2.找到递归返回树形菜单数据的位置3.这里出现问题的原因…...

基于Java的飞机大战游戏的设计与实现(论文 + 源码)
关于基于Java的飞机大战游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313362 基于Java的飞机大战游戏的设计与实现 摘 要 现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communication &#x…...

Vue路由开启步骤
1.在控制台输入命令 //控制台下载安装npm add vue-router3.6.5 2.在main.js下导入并注册组件 import Vue from vue import App from ./App.vue//控制台下载安装npm add vue-router3.6.5 //导入 import VueRouter from "vue-router";//注册 Vue.use(VueRouter) con…...
【碎片知识】2024_05_15
char int long float double运算的时候是从低转到高的,表达式的类型会自动提升或者转 换为参与表达式求值的最上级类型. 关于代码的说法正确的是( ) #include <stdio.h> int main() {int x -1;unsigned int y 2;if (x > y){printf…...

彩虹聚合DNS管理系统
聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户,每个用户可分配不同的域名解析权限;支持API接口,支持获取域名…...

服务网格 SolarMesh v1.13 重磅发布
SolarMesh是行云创新推出的流量治理平台,它基于Istio,为部署在K8s集群上的应用提供全面的流量治理能力。 在之前的版本中,SolarMesh提供的能力有:流量视图,流量控制策略批量配置,API级别的流量数据采集和展…...

三大平台直播视频下载保存方法
终于解决了视频号下载的问题,2024年5月15日亲测可用。 而且免费。 教程第二部分,有本地电脑无法下载的解决方案。 第一部分:使用教程(正常) 第1步:下载安装包 下载迅雷网盘搜索:大海福利合集…...

OpenAI GPT-4o - 介绍
本文翻译整理自: Hello GPT-4o https://openai.com/index/hello-gpt-4o/ 文章目录 一、关于 GPT-4o二、模型能力三、能力探索四、模型评估1、文本评价2、音频 ASR 性能3、音频翻译性能4、M3Exam 零样本结果5、视觉理解评估6、语言 tokenization 六、模型安全性和局限…...

QTreeView学习 branch 虚线设置
1、方法一: #include <QStyleFactory> ui.treeView->setStyle(QStyleFactory::create("windows")); 2、方法二: QString strtyle2 R"( QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/TreeViewDe…...

C++ 日志库 log4cpp 编译、压测及其范例代码 [全流程手工实践]
文章目录 一、 log4cpp官网二、下载三、编译1.目录结构如下2.configure 编译3.cmake 编译 四、测试五、压测源码及结果1.运行环境信息2.压测源码3.压测结果 文章内容:包含了对其linux上的完整使用流程,下载、编译、安装、测试用例尝试、以及一份自己写好…...
python数据处理与分析入门-pandas使用(4)
往期文章: pandas使用1pandas使用2pandas使用3 pandas使用技巧 创建一个DF对象 # 首先创建一个时间序列 dates pd.date_range(20180101, periods6) print(dates)# 创建DataFrame对象,指定index和columns标签 df pd.DataFrame(np.random.randn(6,4), …...
操作系统-单片机进程状态问题(三态模型问题)
例题:在单处理机计算机系统中有1台打印机、1台扫描仪,系统采用先来先服务调度算法。假设系统中有进程P1、P2、P3、P4,其中P1为运行状态,P2为就绪状态,P3等待打印机,P4等待扫描仪。此时,若P1释放…...

Linux文件:重定向底层实现原理(输入重定向、输出重定向、追加重定向)
Linux文件:重定向底层实现原理(输入重定向、输出重定向、追加重定向) 前言一、文件描述符fd的分配规则二、输出重定向(>)三、输出重定向底层实现原理四、追加重定向(>>)五、输入重定向…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...