【Java|基础篇】类和对象

news2024/12/29 8:32:41

文章目录

  • 1. 前言
  • 2. 什么是面向对象
  • 3. 类的定义
  • 4. 类的实例化
  • 5. 对象的构造及初始化
  • 6. this引用
  • 7. 总结

1. 前言

本篇文章主要讲解了下面三个问题

  • 类的定义和实例化
  • 构造方法
  • this关键字

2. 什么是面向对象

众所周知面向过程和面向对象是两种重要的编程思想,而Java是属于面向对象一类的语言.面向对象(Object Oriented Programming,简称 “oop”).
面向对象有三大特性:封装 继承和多态.这些内容后面会详细介绍.
在面向对象的世界里,一切皆为对象。对象就是问题中面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情.,因此在Java中,我们是对一个一个的对象进行的操作.通过实例化对象,调用对象的方法实现相应的功能.面向对象中,我们不必关注对象是如何实现相应的功能的.

例如有一个空调,空调可以进行室内温度的调节(制热或制冷),除湿等功能.这里空调就是一个对象,我们只需要调用空调的制热制冷等功能,就可以实现我们想要的结果.

3. 类的定义

类是用来对一个实体(对象)来进行描述的.类的定义要使用class关键字

// 语法格式为:
class 类名{
	// 成员变量
	// 成员方法
}

与上述的空调为例,我们要通过定义空调类来描述空调这个对象.空调有颜色,尺寸和型号等信息,空调有制冷制热等功能.
定义空调这个类:

class AirConditioner{
	// 成员变量
    String colour; // 颜色
    double size; // 尺寸
    String model; // 型号
	// 成员方法
    void heating(){
        System.out.println("开启制热功能");
    }
    void refrigeration(){
        System.out.println("开启制冷功能");
    }
}

定义类时,类的成员变量和成员方法可以根据需求进行定义. 下面讲解中的类皆是上述的这个空调类

4. 类的实例化

定义类对象之后,我们要如何使用类呢? 这就需要去进行类的实例化.定义类就相当于在计算机中定义了一种新的类型.用类类型创建对象的过程,称为类的实例化.使用new关键字进行类的实例化

// 语法
类名 对象名 = new 类名();

例如

    public static void main(String[] args) {
    	// 类名 对象名 = new 类名(); 
        AirConditioner airConditioner = new AirConditioner();
    }

实例化好类对象之后,我们可以通过 实例化对象的对象名加.的方式进行类的成员变量和成员方法的访问.

    public static void main(String[] args) {
        AirConditioner airConditioner = new AirConditioner();
        System.out.println("颜色: "+ airConditioner.colour);
        System.out.println("尺寸: "+ airConditioner.size);
        System.out.println("型号: "+ airConditioner.model);
        airConditioner.heating();
        airConditioner.refrigeration();
    }
    // 输出结果:
    // 颜色: null
	// 尺寸: 0.0
	// 型号: null
	// 开启制热功能
	// 开启制冷功能

这里需要注意在main方法中,如果定义了变量,而不进行初始化,就使用时是会报错的.
例如:
在这里插入图片描述
在这里插入图片描述
但是类中的成员变量则不会出现这个问题,类中的成员变量是有默认值的.
基本数据类型:

数据类型默认值
int0
short0
long0
byte0
float0.0f
double0.0
char/u0000
booleanfalse

注:引用数据类型的默认值为null.

既然可以通过实例对象的对象名+.的方式访问对象的成员变量,就可以通过这种方式来初始化对象的成员变量.
例如:

    public static void main(String[] args) {
        AirConditioner airConditioner = new AirConditioner();
        airConditioner.colour = "白色";
        System.out.println("颜色: "+ airConditioner.colour);
    }
    // 输出结果:
    // 颜色: 白色

类可以理解为是一个"模型". 同一个类可以创建多个实例对象
例如:

    public static void main(String[] args) {
        AirConditioner airConditioner1 = new AirConditioner();
        AirConditioner airConditioner2 = new AirConditioner();
        AirConditioner airConditioner3 = new AirConditioner();
    }

5. 对象的构造及初始化

上面谈到我们可以通过实例对象的对象名+.的方式进行成员变量的初始化,但是如果类很多,实例的对象也很多,那么这个时候使用这种方式进行成员变量的初始化就会很麻烦. 因此Java给我们提供了一个叫做 "构造方法" 这样的方法帮我们对成员变量进行的初始化

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

构造方法:

  • 名字与类名相同,没有返回值类型,设置为void也不行
  • 一般情况下使用public修饰
    在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次

在这里插入图片描述
上述就是默认的,无参的构造方法. 也是在没有构造方法时,编译器自动调用的构造方法
当我在构造方法中添加一个输出语句时:
在这里插入图片描述
可以看到,我并没有去调用构造方法,却还是输出了构造方法中的语句. 这也验证了构造方法会在实例化对象时自动调用. 因此我们可以传入参数让构造方法帮我们进行成员变量的初始化.

    public AirConditioner() {
        System.out.println("执行了 无参 的构造方法");
    }

    public AirConditioner(String a) {
        colour = a;
        System.out.println("执行了 一个参数 的构造方法");
    }

    public AirConditioner(String a, double b, String c) {
        colour = a;
        size = b;
        model = c;
        System.out.println("执行了 三个参数 的构造方法");
    }

在这里插入图片描述
在讲方法时,说到过"重载"这个概念.
方法的重载有三个注意的地方: 1. 方法的重载与返回值无关 2. 参数列表不能相同(形参的个数 顺序 类型等) 3.方法名必须相同
构造方法也是可以重载的.上述三个构造方法就构成了方法的重载.

使用构造方法,我们就可以对成员变量进行初始化了. 根据我们传入实参的数量,会自动调用对应参数的构造方法.
在这里插入图片描述

我们来打印一下这些类中的成员变量的内容.在IDEA中可以右键 选择Generate
在这里插入图片描述
选择这里的toString()
在这里插入图片描述
IDEA就会给我们生成好一个这样的方法.
在这里插入图片描述

接下来我们来打印实例好的实例对象
在这里插入图片描述

6. this引用

上述代码中,其实有一个问题,就是构造方法中的形参变量名是随便写的. 如果要初始化的成员变量非常多,且又不是按照顺序写的(doge) 是不是看着就很头疼.
在这里插入图片描述
这个时候可能有些聪明的同学就会说,把形参的名字设置成与成员变量相同不就可以了. 接下来我们来试试

    public AirConditioner(String colour, double size, String model) {
        colour = colour;
        size = size;
        model = model;
        System.out.println("执行了 三个参数 的构造方法");
    }

在这里插入图片描述
可以看到虽然是调用了构造方法,但是并没有进行初始化.
这个主要的原因就是在构造方法中,编译器并不知道谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?
在这里插入图片描述
为了解决这个问题,Java可以给我们提供了一个"this"这样的关键字

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该
引用去访问

对上述代码进行修改
在这里插入图片描述
在这里插入图片描述
此时就可以正确进行初始化完成了.
使用this之后就是告诉了编译器前面的是当前类的成员变量,而后面的是形参.

关于构造方法,也可以使用IDEA帮助我们自动生成. 与toString相同
在这里插入图片描述
在这里插入图片描述
可以选择想要初始化的成员变量进行对应构造方法的生成. 选择多个成员变量可以按住CTRL 进行选择.

this的特性

    1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
    1. this只能在"成员方法"中使用
    1. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象

补充: 在类中也可以进行初始化

class AirConditioner{
    String colour = "白色"; // 颜色
    double size; // 尺寸
    String model; // 型号

    public AirConditioner() {
        System.out.println("执行了 无参 的构造方法");
    }
}

在这里插入图片描述
这种初始化的方法通常会搭配 "final"关键字进行使用,后面会详细的介绍

7. 总结

文章到这里就结束了.文章的内容虽然不难,但是需要注意的地方还是特别多的.类和对象是学习Java中最基础的,务必要掌握

感谢你的观看!希望这篇文章能帮到你!
《Java专栏》在不断更新中,欢迎订阅!
“愿与君共勉,携手共进!”
在这里插入图片描述

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

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

相关文章

C语言函数大全-- v 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- v 开头的函数 1. va_start 1.1 函数说明 函数声明函数功能void va_start(va_list ap, last_arg);用于初始化一个 va_list 类型的变量,使其指向可变参数列表中的第一个参数 参数: ap: 一个指向 va_…

我的创作纪念日(个人感悟)

昨天2023年5月10日是我成为创作者的第128天纪念日,感谢CSDN官方的纪念信让我铭记这特殊的一天。 机缘 要说与CSDN的初次相遇,还是2022年的高考结束完的暑假,当时对于大学的学习没有什么概念,当初的高考志愿报的有计算机相关的专…

spring集成mybatis的原理

spring是怎样和mybatis继承的? 在idea里点mapper.queryOne()直接跳到了接口或xml,它究竟是怎样利用jdbc执行的? 我直接调用mapper.queryOne是怎么使用的sqlsession?怎么去connect的? mybatis是怎样根据mapper找到对应的…

【Java面试】Java并发基础(1)

文章目录 1. 可见性,有序性,原子性2. java中并发和并行3. 通常线程有哪几种使用方式? 1. 可见性,有序性,原子性 可见性(Visibility): 指一个线程修改了共享变量的值之后,其他线程能…

学习网络通信必备的DNS解析和Socket通信知识

OkHttp是一个开源的网络请求框架,由Square公司开发。它通过封装Java底层的HttpURLConnection和Okio等库,提供一个简单易用的API,让开发人员能够方便地向服务器发送HTTP/HTTPS请求,支持异步请求和响应回调,并提供丰富的…

未来已来, 新能源与IT的技术碰撞;学习Android车载开发的必然趋势

Android工程师前景 Android车载工程师扮演着关键的角色,他们致力于将最新的Android技术和汽车技术相结合,为汽车行业提供优质的产品。随着越来越多的汽车制造商投资于智能汽车技术和车联网技术,Android车载工程师成为了一个越来越重要的职业…

MATLAB实现二维稳态导热

MATLAB实现二维稳态导热 一、理论基础二、代码实现 一、理论基础 步骤: Step.1 二维模型传热控制微分方程的确定,具体推导可以在任何一本传热学的书中找到。 d 2 T d x 2 d 2 T d y 2 0 \frac{d^{2}T}{dx^{2}}\frac{d^{2}T}{dy^{2}}0 dx2d2T​dy2d2T…

Ansible 自动化运维工具(一)——部署以及命令行模块

文章目录 一、 ansible 的概述1、ansible简介2.、官方网站3、ansible 的特点4、ansible的工作机制5、ansible的组成模块 二、ansible部署1、Asible的安装 三、ansible 命令行模块1、command 模块2、shell 模块3、cron 模块4、user 模块5、group 模块6、copy 模块7、file 模块8、…

【ros/ros2】ros1和ros2的区别-要点记录

dds data distribution service,数据分发服务 rcl ros client libraries,ros客户端库文件 rmw ros middle ware interface,ros中间件接口 lcn life cycle node,生命周期节点,受控节点 lmn lifecycle manageme…

C++二叉树递归方法存入和三种递归方法读出(前序,中序,后序)

#include <stdio.h> #include <malloc.h> typedef struct op //定义子树结构 { int data; struct op *lchild; struct op *rchild; }treestruct; treestruct *createtree() //这里这种表达形式意思是bittree类型的函数 最终要返回bitt…

【Linux】版本管理器Git

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、Git是什么二、Git有什么…

开源C#代码生成器,专注.NET,Sqlserver,最简单,最干净,支持自编码的开源工具,SmartSoftHelp 开发辅助优化工具

开源C#代码生成器&#xff0c;专注.NET&#xff0c;Sqlserver&#xff0c;最简单&#xff0c;最干净&#xff0c;支持自编码的开源工具&#xff0c;SmartSoftHelp 开发辅助优化工具&#xff01; 下载地址&#xff1a;https://pan.baidu.com/s/1XLL_fLxVTw4erYZLj8-MzA?pwd888…

搭建python运行环境

安装Miniconda3 清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ 下载 安装 next————agree————这俩选哪个都行&#xff0c;他选的第二个————安装路径———— 配置系统环境变量 Path miniconda3所在的路径 D:\Autils\miniconda3 Scri…

ChatGPT 最有可能取代哪些职业?

ChatGPT 的应用场景ChatGPT 最可能取代哪些职业&#xff1f;写在最后 ChatGPT 的应用场景 ChatGPT 的应用场景大体上可以归类为三大模块。 第一类是 代码相关 的任务场景。包含程序语言之间的相互转换&#xff08;如 python 转 java&#xff09;、程序命令的生成、代码 bug 的…

Gateway新一代网关

Gateway功能&#xff1a;路由 过滤 一、概述 官网地址 不使用网关存在的问题&#xff1a; 1、客户端需要记录不同微服务地址&#xff0c;增加客户端的复杂性 2、每个后台微服务都需要认证 3、http 发请求&#xff0c;涉及到跨域 4、后台新增微服务&#xff0c;不能动态知道地…

【持久层框架】mybatis-plus超详细讲解

文章目录 一、简介二、愿景三、特性四、支持数据库五、快速指南步骤1、创建数据库 mybatis_plus2、导入相应的依赖3、连接数据库4、编写代码5、小结 六、配置日志七、常用注解八、CRUD扩展Insert 插入参数说明主键生成策略分布式系统唯一id生成雪花算法主键自增 更新操作参数说…

纪念一下自己做的第一款开发板

文章目录 1. 硬件电路2. 成品展示3. 遇到的问题4. HelloWorld 前言&#xff1a;之前乐鑫搞活动白嫖了10个ESP32-S2模组&#xff0c;想着把它给利用了&#xff0c;然后先从一个开发板做起&#xff0c;等玩明白了再去做一些自己的设计&#xff0c;从网上找了一些资料就开始干&…

【★前后端的交互★】Servlet API

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点★✔ 蓝色文字表示&#…

了解一下Spring核心概念——IOC IOC容器 DI Bean

文章目录 1 Spring家族2 Spring发展史3 Spring系统架构3.1 系统架构图3.2 学习路线 4 Spring核心概念4.1 目前项目中的问题4.2 IOC、IOC容器、Bean、DI4.2.1 IOC&#xff08;Inversion of Control&#xff09;控制反转4.2.2 DI&#xff08;Dependency Injection&#xff09;依赖…

(免费分享)springboot,vue物业管理系统

一、项目技术 后端框架&#xff1a;springboot 前端框架&#xff1a;elementUIvue 主要实现了用户登录、社区信息展示、物业公告、社区设施、物业人员信息。 进入物业系统管理后端。实现了社区的管理&#xff0c;包括基本信息管理、周边设施管理、物业公告管理。楼盘管理包括楼…