Java-类与对象

news2024/12/24 0:53:10

一、面向对象

在了解类与对象前,我们需要先知道"面向对象"这个词的概念:

Java语言中,我们的主要思想就是"面向对象",而在之前我们所学习的C语言中大部分时候的思想是"面向过程"

那么什么是"面向对象",什么是"面向过程"呢?

在之前我们学习C语言想要实现一个操作时,里面可能会有很多比较复杂,难以实现的步骤,这就是因为C语言是一门"面向过程"的语言。指如果想要达到一个目标,必须一步一步的运作其中步骤,然后将其实现,最终达成目的。

而现在我们学习的Java语言就有所不同,Java语言是一门"面向对象"的语言,Java里面有很多的API(预先定义的函数),就比如学习C语言时所学习的:数组排序,二分查找,将数组变成字符串等需要我们实现的功能,到了Java中就变成了现成的方法:

import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] arr = {1,8,4,5,9,2,3,6,7};
        //排序(不是冒泡,效率优于冒泡)
        Arrays.sort(arr);
        //数组->字符串
        System.out.println(Arrays.toString(arr));
        while(in.hasNext()) {
            System.out.println("请输入你要查找的数字:");
            int a = in.nextInt();
            //查找该数字下标
            System.out.println(a + "的下标为:" + Arrays.binarySearch(arr, a));
        }
    }
}

效果

而Java会拥有这么多方便的方法,就是因为其是一种"面向对象"的语言:

📌 我们可以打个比方

假设有一个制作汽车的任务。在面向过程的编程中,我们会将制作汽车的过程分解成一系列的步骤,比如设计外观制造发动机安装零件等,然后按照顺序逐步执行这些步骤来完成制作。而在面向对象的编程中,我们会定义一个汽车类它有属性如轮胎、油箱、发动机、等,还有方法如启动、加速,然后创建汽车对象,通过调用对象的方法来完成制作汽车的任务

总结而言,面向过程更强调解决问题的过程和步骤,而面向对象更强调对象之间的交互和协作。

二、类的定义

类是面向对象编程的基本概念,类定义了对象的属性和方法,以及对象可以执行的操作。

通过类的定义,我们可以创建多个对象来使用该类,每个对象都拥有自己的属性和方法,但是都是基于同一个类创建的,所以它们共享相同的结构和行为。这种方式可以提高代码的重用性和可维护性。

面向对象注重的就是"对象",而生活中的繁多事物都可以被称作"对象",就比如上面我们提到的:汽车。它就可以是一个对象,并且也能被创建出一个"汽车类"

① 类的定义格式

public class ClassName {
    // 类的成员变量
    // 类的构造方法
    // 类的成员方法
}
 

public 是一个访问修饰符,表示该类是公共的,可以被其他类访问。ClassName是类的名称,根据命名规范应该使用首字母大写的驼峰命名法。

📌 而接下来我们就试着定义一个"汽车类":

首先我们先创建出一个.java文件,将"Car"类存放到这个文件中。

② 类的使用

接下来我们创建出Car类,为其创建"名字","品牌","轮胎","油箱","发动机"等属性。

并为其创建出三个基本的方法"启动","加速","停车"。

然后我们回到Main.java中,去尝试使用这个"Car":

并且我们也可以创建多个对象:

那么如果不给成员变量的属性赋值,会发生什么呢?让我们尝试一下:

我们可以看到,这样的话输出的都是"null",而此时我们使用的变量类型都是"String",其他的类型也会是"null"嘛?让我们再试一次:

我们创建一个拥有很多类型变量的类:

再次回到Main中测试一下:

我们会看到这些类型的默认值,需要注意的是String 默认值为null,boolean的默认值为false。

而我们注意到:char的默认值...这是个啥?

让我们再仔细地探讨一下:

我们使用char的默认值 '\u0000' 0 进行对比:

我们能发现,都是相等的,所以我认为char默认值为 '\u0000' 是个空格,转化为整数是0

注意事项:

📕 new 关键字用于创建一个对象的实例

📕 使用 " . " 来访问对象中的属性和方法

📕 用同一个类可以创建多个实例

三、this引用

如上面我们所写的代码为例子,其实在使用" . "为对象属性赋值时,大概可以用这个图来概括:

而当我们定义两个类,并使用同一个方法时:

这是如何判断,我们的值到底传给了谁呢?这就是因为" this "。

在Java中,关键字" this "用于引用当前对象的实例。它可以在类的内部使用用于区分实例变量和局部变量,以及在方法中调用当前对象的其他方法。 

this其实可以理解为对象的一个属性(成员变量),但是这个属性是隐藏的.即this相当于对象的一个隐藏属性。

和对象的其他属性一样,在 new 一个新对象的时候,会在堆内存为对象分配空间,属性就储存在这份空间中。且该this属性的值就是对象在堆内存中地址,即this指向该对象(this代表该对象)

所以调用"show"方法时,就能够通过隐藏的"this"来辨别出使用的是哪个值啦~

而虽然this是隐藏的,但我们还是要养成编写代码时带上this的好习惯,毕竟有些时候,编译器也弄不明白到底哪个是哪个...比如:

欸?此时我们会发现,这次使用getCar,赋值却失败了,这是因为我们的参数名与类数据名重复了,此时编译器也不知道到底哪个加this,哪个不加this,最后就导致了name和age自己给自己赋值,从而赋值失败,变成了null 和 0~

想要进行修改,我们只需要在name和age前加上" this. "就好啦:

this 的三种用法

① 通过 this. 访问当前对象的成员变量

② 通过 this. 访问当前对象的成员方法

③ 通过 this() 访问当前对象的构造方法——(马上就讲到)

四、构造方法

在我们刚刚编写的代码中,都是先 new 一个对象,然后对其属性一个一个的进行赋值,有没有觉得,这样太麻烦了些?是的,所以在Java创建时也被想到了这个问题,所以就有了更方便的赋值方法:构造方法 

📌 构造方法的格式:

public class ClassName {
    // 成员变量
    // 构造方法
    public ClassName() {
        // 构造方法的初始化代码
    }
    // 成员方法
}

让我们使用构造方法为Car类的使用简化一些:

那么又有问题出现了:

为什么之前我们使用Car()进行无参构造时,明明没有编写Car()方法,却能够正常的使用呢?

这是因为在我们定义了一个类时,编译器在没有定义任何构造方法时,Java会自动为该类生成一个默认的无参构造方法。

那我们现在再试用一下无参构造方法:

我们会发现:此时编译器报错了。

这又是怎么回事,难道编译器坏了吗?不,请注意上面我们所说的:"编译器在没有定义任何构造方法时",这是编译器生成一个默认的无参构造方法的前提条件。

所以当我们想自己定义构造方法时,我们还需要再补充一个无参构造方法:

这也就证明了,构造方法也是可以被重载的~

并且,还有一点就是,在一个构造方法中,是可以再调用另一个构造方法的

这也就讲清了,刚刚在讲this关键词时,最后提到的this()调用构造方法的作用。

📌 使用这种方法时,需要注意的是:

📕 this()必须是构造方法中第一条语句

📕 不能形成闭环:

📚 注意事项:

📕 Java构造方法是一种特殊的方法,用于创建对象时初始化对象的成员变量。

📕 构造方法的名称必须与类名相同,没有返回类型,并且在类实例化时自动调用。

📕 构造方法可以有参数,也可以没有参数。

📕 构造方法可以被重载,即同一个类中可以定义多个构造方法,只要它们的参数列表不同即可。

📕 如果一个类没有定义任何构造方法,Java会自动为该类生成一个默认的无参构造方法。

📕 如果一个类定义了一个或多个构造方法,Java不会再生成默认的构造方法。

那么这篇关于(类与对象)的知识,就暂时为大家分享到这里啦,作者能力有限,如果有哪里说的不够清楚或者不够简洁,还请大家在评论区多多指出,那么我们下期再见啦~

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

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

相关文章

MySQL-10.DML-添加数据insert

一.DML(INSERT) -- DDL:数据操作语言 -- DML:插入数据 - insert -- 1.为tb_emp表的username,name,gender字段插入值 insert into tb_emp (username,name,gender) values (wuji,无忌,1); -- 这样会报错,因为create_ti…

DS堆的实际应用(10)

文章目录 前言一、堆排序建堆排序 二、TopK问题原理实战创建一个有一万个数的文件读取文件并将前k个数据创建小堆用剩余的N-K个元素依次与堆顶元素来比较将前k个数据打印出来并关闭文件 测试 三、堆的相关习题总结 前言 学完了堆这个数据结构的概念和特性后,我们来看…

限时设计ui

ctrl-------放大缩小 空格-----画面移动 alt------复制 页面<画板<图层 添加交互事件 原型 点击蓝色的圆&#xff0c;从1跳转到2 点击绿色的圆&#xff0c;从2跳转到1

基于SSM+Vue+MySQL的健身房管理系统

系统展示 系统背景 随着人们生活水平的提高和健康意识的增强&#xff0c;越来越多的人选择去健身房锻炼。传统的健身房管理方式往往依赖于纸质记录和人工操作&#xff0c;这种方式不仅效率低下&#xff0c;而且容易出错。为了提高健身房的管理效率和服务质量&#xff0c;开发一…

python项目实战——下载美女图片

python项目实战——下载美女图片 文章目录 python项目实战——下载美女图片完整代码思路整理实现过程使用xpath语法找图片的链接检查链接是否正确下载图片创建文件夹获取一组图片的链接获取页数 获取目录页的链接 完善代码注意事项 完整代码 import requests import re import…

图文检索综述(2):Deep Multimodal Data Fusion

Deep Multimodal Data Fusion 摘要1 引言2 基于编码器-解码器融合2.1 数据级别融合2.2 分层特征融合2.3 决策级别融合 3 基于注意力融合3.1 模态内的自注意力3.2 模态间的交叉注意力3.3 基于transformer的方法 4 基于图神经网络融合4.1 单个模态的表示学习4.2 融合数据的表示学…

【数据结构】宜宾大学-计院-实验三

线性表的应用——实现两多项式的相加 课前准备&#xff1a;实验学时&#xff1a;2实验目的&#xff1a;实验内容&#xff1a;实验结果&#xff1a;实验报告:&#xff08;及时撰写实验报告&#xff09;实验测试结果&#xff1a;代码实现&#xff1a;&#xff08;C/C&#xff09;…

Java 小游戏《超级马里奥》

文章目录 一、效果展示二、代码编写1. 素材准备2. 创建窗口类3. 创建常量类4. 创建动作类5. 创建关卡类6. 创建障碍物类7. 创建马里奥类8. 编写程序入口 一、效果展示 二、代码编写 1. 素材准备 首先创建一个基本的 java 项目&#xff0c;并将本游戏需要用到的图片素材 image…

华为 HCIP-Datacom H12-821 题库 (38)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.请对 2001:0DB8:0000:C030:0000:0000:09A0:CDEF 地址进行压缩。&#xff08; &#xff09;&…

阻塞I/O与非阻塞I/O

目录 一、基本概念 二、阻塞I/O的实现机制 —— 等待队列 一、基本概念 阻塞&#xff1a;在执行单元进行操作时&#xff0c;如果不能获得申请的资源&#xff0c;则执行单元挂起直至资源可用后再进行操作。 非阻塞&#xff1a;在执行单元进行操作时&#xff0c;如果不能获得申…

UDP反射放大攻击防范手册

UDP反射放大攻击是一种极具破坏力的恶意攻击手段。 一、UDP反射放大攻击的原理 UDP反射放大攻击主要利用了UDP协议的特性。攻击者会向互联网上大量的开放UDP服务的服务器发送伪造的请求数据包。这些请求数据包的源IP地址被篡改为目标受害者的IP地址。当服务器收到这些请求后&…

爬虫实战(黑马论坛)

1.定位爬取位置内容&#xff1a; # -*- coding: utf-8 -*- import requests import time import re# 请求的 URL 和头信息 url https://bbs.itheima.com/forum-425-1.html headers {user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like…

DBSwitch和Seatunel

一、DBSwitch 什么是DBSwitch?它主要用在什么场景&#xff1f; 通过步骤分析可以看到这个是通过配置数据源&#xff0c;采用一次性或定时方案&#xff0c;同步到数据仓库的指定表&#xff0c;并且指定映射关系的工具。有点类似于flinkcdc的增量同步。 参考&#xff1a; dbs…

【实战案例】SpringBoot项目中异常处理通用解决方案

项目中经常会出现一些异常&#xff0c;比如在新增项目的时候必要的字段没有填写。在springboot项目中&#xff0c;遇到异常会往上抛出给调用方&#xff0c;DAO层遇到异常抛给Service层&#xff0c;Service层遇到异常抛给Controller层&#xff0c;Controller层遇到异常就抛给了S…

Qt-系统网络HTTP客户端(66)

目录 描述 相关函数 使用 准备工作 处理响应 测试 代码 补充 描述 进⾏ Qt 开发时, 和服务器之间的通信很多时候也会⽤到 HTTP 协议 Qt 中提供了客户端&#xff0c;但是并没有提供相应的服务器的库&#xff0c;所以这里我们只讨论 客户端 • 通过 HTTP 从服务器获取…

Unity 2d UI 实时跟随场景3d物体

2d UI 实时跟随场景3d物体位置&#xff0c;显示 3d 物体头顶信息&#xff0c;看起来像是场景中的3dUI&#xff0c;实质是2d UIusing System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using UnityEngine.UI; /// <summary>…

RequestBody接收参数报错com.fasterxml.jackson.databind.exc.MismatchedInputException

目录&#xff1a; 1、错误现象2、解决办法3、最终验证 1、错误现象 报错的现象和代码如下&#xff1a; 2、解决办法 查了很多都说参数类型对不上&#xff0c;但是明明是对上的&#xff0c;没有问题&#xff0c;最后只有换接收方式后验证是可以的&#xff1b;最终想了一下&…

Flink状态一致性保证

前言 一个Flink作业由一系列算子构成&#xff0c;每个算子可以有多个并行实例&#xff0c;这些实例被称为 subTask&#xff0c;每个subTask运行在不同的进程或物理机上&#xff0c;以实现作业的并行处理。在这个复杂的分布式场景中&#xff0c;任何一个节点故障都有可能导致 F…

智能算力中心万卡GPU集群架构深度解析

智能算力中心万卡GPU集群架构深度分析 自ChatGPT发布&#xff0c;科技界大模型竞赛如火如荼。数据成新生产要素&#xff0c;算力成新基础能源&#xff0c;大模型成新生产工具&#xff0c;“AI”转型势不可挡。模型参数量突破万亿&#xff0c;对算力需求升级&#xff0c;超万卡…

Docker学习笔记(2)- Docker的安装

1. Docker的基本组成 镜像&#xff08;image&#xff09;&#xff1a;Docker镜像就像是一个模板&#xff0c;可以通过这个模板来创建容器服务。通过一个镜像可以创建多个容器。最终服务运行或者项目运行就是在容器中。容器&#xff08;container&#xff09;&#xff1a;Docker…