Java【类和对象】,你还没对象?我教你new一个!

news2025/7/20 13:07:27

文章目录

  • 前言
  • 一、初识面向对象
    • 1.什么是面向对象
    • 2.面向对象过程
  • 二、类的定义与使用
    • 1.什么是类
    • 2.如何定义类
    • 3.示例
  • 三、类的实例化
    • 1.什么是类的实例化
    • 2.类和对象的说明
  • 四、this引用
    • 1.为什么要有this引用
      • 第一种情况
      • 第二种情况
    • 2.什么是this引用
    • 3.this引用的特征
  • 五、对象的构造及初始化
    • 1.如何初始化对象
    • 2.构造方法
      • 1.概念
      • 2.特性
    • 3.默认初始化
    • 4.就地初始化
  • 总结


前言

相信小伙伴们应该都听过一句广为流传的玩笑话:“你还没对象?学Java自己new一个,一个不够就new两个”

我本人也在学习Java之前就被这句话勾起了兴趣,那么本篇就介绍什么是Java里的“对象”


提示:是正在努力进步的小菜鸟一只,如有大佬还有更妙的解法欢迎评论区讨论~ 废话不多说,直接上干货!

一、初识面向对象

1.什么是面向对象

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP)

在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好

看不懂?没关系,有个简单了解即可,会随着Java的学习慢慢深入理解的


2.面向对象过程

我们拿洗衣服来举例

传统的洗衣服方式:
拿盆子—放水—放衣服—放洗衣液—手搓—换水—放洗衣液—手搓—换水—拧干

而有了洗衣机的洗衣服方式:
把衣服丢进洗衣机里—放洗衣粉—启动洗衣机

传统的方式注重的是洗衣服的过程,少了一个环节可能都不行
而且不同衣服洗的方式,时间长度,拧干方式都不同,处理起来就比较麻烦。如果将来要洗鞋子,那就是另一种放方式
按照该种方式来写代码,将来扩展或者维护起来会比较麻烦

有了洗衣机的方式可以理解为有四个对象:人,衣服,洗衣液,洗衣机
用这种方式洗衣服,使用者不需要关心洗衣机的运行方式和工作原理,用户只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,通过对象之间的交互来完成,这就是面向对象的方式

面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景


二、类的定义与使用

面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机

但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机

在这里插入图片描述

上图的参数就是对洗衣机简单的描述,该过程称为对洗衣机对象( 实体 )进行抽象( 对一个复杂事物的重新认知 )

但是这些简化的抽象结果计算机也不能识别,开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语言

1.什么是类

Java中,类是用来对一个实体( 对象 )来进行描述的,主要描述该实体( 对象 )具有哪些属性( 外观尺寸等 ),哪些功能( 用来干啥 ),描述完成后计算机就可以识别了

例如修狗,动物界有那么多修狗,每一个修狗都有自己的各项参数,我们就可以把修狗当作一个类,这个类中可以有你家的修狗,也可以有我家的修狗,也可以有张三的修狗


2.如何定义类

在java中定义类时需要用到class关键字,具体语法如下

class ClassName{
	field; // 字段(属性) 或者 成员变量
	method; // 行为 或者 成员方法
}

class为定义类的关键字,ClassName为类的名字,{}中为类的主体。

类中包含的内容称为类的成员
属性:主要是用来描述类的,称之为类的成员属性或者类成员变量
方法:主要说明类具有哪些功能,称为类的成员方法

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("定时功能");
	}
}

注意事项 :
类名注意采用大驼峰定义
成员前写法统一为public,后面会详细解释
此处写的方法不带 static 关键字. 后面会详细解释

大驼峰:ILoveYou、GoodBye
小驼峰:iLoveYou、goodBye


3.示例

我们来简单定义一个狗类

class PetDog {
	// 成员属性
	public String name;//名字
	public String color;//颜色
	
	// 成员方法
	public void barks() {
		System.out.println(name + ": 旺旺旺~~~");
	}
	public void wag() {
		System.out.println(name + ": 摇尾巴~~~");
	}
}

再来简单定义一个学生类

class Student{
	// 成员属性
	public String name;
	public String gender;
	public short age;
	public double score;
	
	// 成员方法
	public void DoClass(){
		System.out.println("没想好写啥");
	}
	public void DoHomework(){
		System.out.println("没想好写啥");
	}
	public void Exam(){
		System.out.println("没想好写啥");
	}
}

注意事项:
一般一个文件当中只定义一个类( 如果有多个类,只能有一个public类 )
main方法所在的类一般要使用public修饰
public修饰的类必须要和文件名相同


三、类的实例化

1.什么是类的实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型

而类是用户自定义了一个新的类型,比如上述的:PetDog类和Student类

有了这些自定义的类型之后,就可以使用这些类来定义实例( 就是所谓的对象 )

用类这个类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

语法格式:

类名 对象名 = new 类名();

例如:我们把刚刚定义的狗这个类实例化出来(在main方法中)

public static void main(String[] args) {
	// 通过new实例化对象
	PetDog dog1 = new PetDog(); 
	// 对象 + .(点号)访问成员属性和成员方法
	dog1.name = "坦克";
	dog1.color = "粉色";
	dog1.barks();
	dog1.wag();
	
	PetDog dog2 = new PetDog();
	dog2.name = "飞猪";
	dog2.color = "绿色";
	dog2.barks();
	dog2.wag();
}

注意事项
new 关键字用于创建一个对象的实例
使用对象 + .( 点号)来访问对象中的属性和方法.
同一个类可以创建多个实例


2.类和对象的说明

类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员

类是一种自定义的类型,可以用来定义变量

一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间( 堆区 ),存储类成员变量( 成员方法在方法区 )

做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间


四、this引用

1.为什么要有this引用

第一种情况

我们在刚才的狗这个类中,补充一个set成员方法,在set方法中给修狗的名字和颜色赋值

在这里插入图片描述
这里就发生了编译报错,因为成员变量和set方法中的形参同名,那这两行代码具体是表示谁给谁赋值呢?

实际上Java里有一个局部变量优先原则,形参name和color是局部变量,优先使用,所以这两行代码表示形参给形参自己赋值,所以编译错误

方法里的变量叫做局部变量,存储在栈上
而成员变量存储在堆上

第二种情况

我们再在狗这个类中,补充一个show方法,来展示修狗的名字和颜色
在这里插入图片描述
可以看到我们new了两个对象,也就是实例化了两个小狗出来,dog1和dog2都调用了show这个成员方法

那show方法是如何知道是哪个对象调用的自己呢?

这就需要我们认识一下“ this ”这个关键字


2.什么是this引用

this 引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

说人话就是: this 引用 表示 当前对象

我们先把需要加上 this 的地方都加上:
在这里插入图片描述
加上this以后:

当 dog1 + 点号访问成员变量方法时,this 引用就表示dog1
所以在 set 方法中,把形参传给了 dog1 的成员属性

当 dog2 + 点号访问成员变量方法时,this 引用就表示dog2
所以在 set 方法中,把形参传给了 dog2 的成员属性

同样,在其他方法中,就是因为this,所以方法才知道是谁调用的自己,并且this.name可以完整的表示当前对象的成员属性


3.this引用的特征

this 的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

this 只能在"成员方法"中使用

在"成员方法"中,this 只能引用当前对象,不能再引用其他对象

this 是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法的对象的引用传递给该成员方法,this负责来接收

在这里插入图片描述

方块圈起来的就是编译器隐藏的 this 参数,但我们自己不需要写,也不建议这样写


五、对象的构造及初始化

1.如何初始化对象

通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

例如:

public static void main(String[] args) {
	int a;
	System.out.println(a);
}

想要通过编译就需要在使用变量 a 之前对 a 进行初始化
如果是对对象初始化:

	PetDog dog1 = new PetDog();
	dog1.set("坦克", "粉色");

需要调用之前写的set方法才可以将具体的日期设置到对象中

那么问题来了:
每次对象创建好后只能调用自定义的set方法进行初始化,比较麻烦,还有其他的初始化方式吗?

下面我们认识一下“ 构造方法 ”


2.构造方法

1.概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,没有返回值,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

例如:

	PetDog dog1 = new PetDog();

此时在()中,没有任何参数,实例化dog1这个对象的时候,编译器就调用了一个不带任何参数的构造方法,这是编译器默认提供
格式为:

public PetDog() {

}

注意
构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间

所以我们就可以在构造方法中对对象进行初始化:

class PetDog {
    // 成员属性
    public String name;//名字
    public String color;//颜色

	public PetDog(String name, String color) {
		this.name = name;
		this.color = color;
	}
	...
}

public class Test {
    public static void main(String[] args) {
        PetDog dog1 = new PetDog("坦克", "粉色");
        ...
    }
}

此时我在PetDoge类中写了带有三个参数的构造方法,那么编译器就不会默认提供不带参数的构造方法


2.特性

名字必须与类名相同

没有返回值类型,设置为 void 也不行

创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)

构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)


3.默认初始化

上面说到,局部变量在使用之前必须初始化,而类中的成员变量却不需要,即使不初始化,编译器会对成员变量设置初始值:
byte,int,short 设置为0
long 设置为 0L
char 设置为 ‘\u0000’
float 设置为0.0f
double 设置为0.0
boolea 设置为false
引用数据类型设置为null

这些就是默认初始化的值


4.就地初始化

在声明成员变量时,就直接给出了初始值

public class PetDog {
	public String name = "坦克";
	public String color = "粉色";
	
}

这种初始化方式相当于给每一个new出来的对象都设置了值,说白了就是把代码“ 写死了 ”
比如你要new一个狗,并不是每一条狗都叫“ 坦克 ”,所以实际上用到的并不多,


总结

以上就是今天要讲的关于【类和对象】的内容,类的定义方式以及对象的实例化,类中的成员变量和成员方法的使用,对象的整个初始化过程这些你掌握了吗❓

多嘴一句,现在你会给自己new一个对象了吗?

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦🤪🤪🤪


上山总比下山辛苦
下篇文章见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7952.html

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

相关文章

ubuntu上运行make menuconfig两种报错

1) 如果如上报错,没有target,这是因为运行这个make的时候没在对应的目录下运行,通常是有make的目录,这种系统性的编译的,则是应该在代码的根目录。在根目录下用根目录下的make。 2)然后我来到根…

Restful 接口设计-前言(手把手教你入门到精通)

文章目录前言一:什么是API分类一分类二前言二:Web的发展前言三:传统开发模式VS前后端分离传统的开发模式前后端分离了解API和Web的发展有利于帮助你掌握Restful接口设计 前言一:什么是API API(Application Programmi…

第三章 多维随机变量及其分布

思维导图 基础知识 二维随机变量 我们研究一个多维的东西,往往先从较低的维度比如说二维作为主要的研究对象,一个是因为维度低会比较简单,易于理解;另一个则是考试中低维的问题往往更加常见 定义与分布函数 定义上其实很简单&am…

双亲委派机制

Java 虚拟机对 class 文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的 class 文件加载到内存生成 class 对象。而且加载某个类的 class 文件时,Java 虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任…

【Pytorch with fastai】第 6 章 :其他计算机视觉问题

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

【MySQL】数据库中表的增删查改操作详解

文章目录前言SQL的通用语法一、表的创建与表的新增语法数据类型的介绍演示二、表的删除语法删整张表的语法删记录的语法演示三、表的查询查询整张表(一)全列查询(二)指定列查询(三)带表达式的查询&#xff…

深入ftrace function graph功能

学习完了ftrace的function的基本功能,其作用主要是用来跟踪特定内核函数调用的频次,对于内核,特别是初学者,对于函数的调用关系不清晰,并且内核中有很多函数指针,会把我们弄的摸不着头脑,那么我…

C语言百日刷题第九天

前言 今天是刷题第9天,放弃不难,但坚持一定很酷~ 快来跟我一起刷题吧。 加油,一起努力进步 C语言百日刷题第九天前言76.计算偶数的所有质因子77. 提取不重复的整数78.二进制中1的个数79.猴子分桃80.百钱买百鸡76.计算偶数的所有质因子 输入…

可防离职员工冒用身份,合合信息名片全能王与钉钉用数字名片打造安全“围栏”

名片全能王与钉钉发布数字名片:可防离职员工冒用身份,追踪营销线索 名片是人际交往中的一条纽带。秦汉有竹制的“谒”,唐代纸质的“名刺”也被沿用许久。如今,无实体的数字名片在商务人士中已十分普及,科技加持下&…

共享存储知识

文章目录一、架构图二、RAID(廉价冗余磁盘整列)三、存储操作四、FusionCompute对接存储五、添加数据存储时的选项六、磁盘配置模式七、磁盘模式八、快照九、FC-SAN一、架构图 SAN(存储区域网络) IP-SAN(SCSI协议封装在…

Linux多线程C++版 线程基础 进程和线程关系 线程分类 Linux线程实现 线程表示

目录1.线程的基础2.进程和线程的关系3.线程分类 了解4.Linux线程实现5.线程标识1.线程的基础 进程是资源管理的最小单位,线程是程序执行最小单位。每个进程有自己的数据段,代码段和堆栈段。线程通常叫做轻型的进程,它包含独立的栈和CPU寄存器…

[附源码]java毕业设计基于的楼盘销售管理系统论文2022

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

SpringCloud Gateway 自定义Filter用代码怎么写?别再说我只会配置基本Filter了,来学学如何定制Filter过滤器

文章目录学习SpringCloud Gateway自定义全局Filter(GlobalFilter)ServerWebExchange自定义非全局Filter(GatewayFilter)学习SpringCloud Gateway SpringCloud Gateway使用及原理分析大全——断言及过滤器(上篇&#x…

【openwrt】libubox组件——uloop_process

uloop_processuloop_process主要数据结构struct list_head processesstruct uloop_processuloop_process主要函数uloop_handle_processesuloop_process原理uloop_process使用示例uloop_process 是 Libubox 提供的一个进程管理工具,它主要用来等待子进程工作的结束,一…

DAP和IAP

DAP和IAP DAP模型:通过训练样本学习一组属性分类器直接预测测试样本的属性。 IAP模型:通过训练样本的类别,(多分类器)间接预测测试样本的属性。 两者之间的区别:属性分类器的学习方式,DAP是一组…

labelme做标注

1.anaconda 安装 anaconda下载地址如下: 官网 一直下一步,注意下面这个地方 同时手动配置环境变量,下面三个路径需添加 Anaconda安装路径 Anaconda安装路径\Scripts Anaconda安装路径\Library\bin 最后测试一下 cmd 依次输入 conda…

云原生周刊 | 百家争鸣的边缘计算时代即将到来?| 2022-11-14

今年的 KubeCon 大会有一个很奇怪的现象,到场的几乎都是小公司,没有大公司。可能是因为这些大公司恰好在这个时候都有自己的活动要举办,也有可能是他们正在快马加鞭研发他们的边缘计算方案?因为 Gartner 预测到 2025 年&#xff0…

Mybatis—LanguageDriver

LanguageDriver主要用于构造SqlSource和ParameterHandler,从LanguageDriver在Mybatis中调用链路来看,Configuration#newParameterHandler通过调用LanguageDriver#createParameterHandler完成构建ParameterHandler,通过调用LanguageDriver#cre…

缺流量时代,App们需要如何突围?

距离上一个现象级的应用抖音出现已经过去了6年,如今App市场万马齐喑,巨头创新不断,中小团队异军突起的App黄金时代一去不返。 你的App里多久没有出现过一款新应用了? 距离上一个现象级的应用抖音出现已经过去了6年,那…

基于加权对立和贪婪搜索多模态工程问题的黑猩猩优化算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…