Java的类和对象(一)—— 初始类和对象,this关键字,构造方法

前言

       从这篇文章开始,我们就进入到了JavaSE的核心部分。这篇文章是Java类和对象的第一篇,主要介绍类和对象的概念,this关键字以及构造方法~~

什么是类?什么是对象?

       学过C语言的老铁们,可以类比struct自定义一个结构体,类就类似结构体,对象就类似使用结构体关键字来创建结构体变量(结构体普通变量,结构体指针,结构体数组),但是类里面可以定义方法(也就是C语言中的函数)
       没有学过C语言的老铁们,可以这样理解,假设你是一个建筑工程师,类就是你画出来的建筑图纸,而对象就是用图纸实际建造出来的房子,图纸就是用来描述这个房子具体的细节(长,宽,高,材料等等)

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

类的创建

我们可以使用 class 关键字来定义一个类
一个类里面包含字段/属性/成员变量,也可以包含成员方法~~

class 类名{
       字段、属性、成员变量;(定义在类里面,方法外面)
       成员方法;
}

下面我们来定义一个学生类:

class Student{
	//字段、属性、成员变量
    public String name;
    public int age;
    public String stuNum;
    
    //成员方法
    public void sleep(){
        System.out.println(name + "睡觉");
    }
    
    public void haveClass(){
        System.out.println(name + "上课");
    }
    
    public void doHomework(){
        System.out.println(name + "做作业");
    }
}

对象的实例化

什么是对象的实例化,简单来说就是创建一个对象,我们需要使用类名和 new 关键字来进行创建~~

创建格式:

类名 对象 = new 类名()

代码示例:

Student student1 = new Student();

对象的使用

我们可以通过对象来访问对象里面的成员变量和成员方法~~

使用格式:对象后面加一个点号再加相应的成员方法或者成员变量即可。

我们来试着使用一下,还是上面的学生类为例子:

    public static void main(String[] args) {
        Student student1 = new Student();
        student1.name = "张三";
        student1.age = 10;
        student1.stuNum = "32";
        student1.sleep();
        student1.haveClass();
        student1.doHomework();
    }

在这里插入图片描述

面向过程和面向对象的区别

       面向过程和面向对象本质上都是解决问题的方法,面向过程注重的是过程,而面向对象就是需要对象与对象之间的联系,面向对象的关键就是(找到对象,创建对象和使用对象),例如你上网购物,如果你是面向过程,你就会这样子,下单,工厂制作商品,工人发货,物流人员进行运输,快递员将快递送到指定地点,你去那个地方取件,最后确认收货,这就是面向过程。
       如果你是面向对象,那么就是你和快递这两个对象之间的联系,你只需要关心为这个对象(商品)付款然后取件,就没了。
       C语言就是典型的面向过程的编程语言,而Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。

this 关键字介绍

       现在我以下面的代码为例子:

class Date{
    public int year;
    public int month;
    public int day;

    public void initDate1(int year, int month, int day){
        year = year;
        month = month;
        day = day;
    }

    public void initDate2(int y, int m, int d){
        year = y;
        month = m;
        day = d;
    }

    public void printDate(){
        System.out.println(year + "年 " + month + "月 " + day + "日 ");
    }
}

public class Test{
    public static void main(String[] args) {
        Date d1 = new Date();
        Date d2 = new Date();
        Date d3 = new Date();

        d1.initDate1(2024,5,13);
        d1.printDate();
        System.out.println("=====================");
        d1.initDate2(2024,5,13);
        d1.printDate();

    }
}

思考一下输出结果是什么?
在这里插入图片描述
在这里插入图片描述

再谈对象中成员变量

       对象中的成员变量和神奇,一旦对象创建好,对象里面的成员变量其实会被赋值成默认值,所以上面才会出现0年0月0日~~
       根据上一篇的JVM内画图,我们来看一下对象的分布:

在这里插入图片描述

对象在堆里是只包含成员变量,没有成员方法的~~

来现在解决一下为什么下面的代码不行~~

    public void initDate1(int year, int month, int day){
        year = year;
        month = month;
        day = day;
    }

因为程序遵循局部变量优先使用原则,所以上面的代码相当于是局部变量自己给自己赋值~~

如何解决?

添加 this 关键字就可以了

    public void initDate1(int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }

this 关键字能让编译器识别这是成员变量而不是局部变量~~
因此建议大家习惯性地使用this关键字~~

再理解this

public class Test{
    public static void main(String[] args) {
        Date d1 = new Date();
        Date d2 = new Date();
        Date d3 = new Date();

        d1.initDate1(2024,5,13);
        d1.printDate();
        System.out.println("=====================");
        d2.initDate2(2024,5,14);
        d2.printDate();
        System.out.println("=====================");
        d3.initDate2(2024,5,15);
        d3.printDate();
    }
}

在这里插入图片描述
       问题来了,上面创建了三个对象,都调用了printDate()方法,这些方法是如何区分这是哪个对象的呢?

在Java中,调用成员方法时会发生隐式传参:

    public void initDate1(Date this, int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public void initDate2(Date this, int y, int m, int d){
        year = y;
        month = m;
        day = d;
    }

    public void printDate(Date this){
        System.out.println(year + "年 " + month + "月 " + day + "日 ");
    }

大家看到上面的 Date this(这个是可以不用写的,写了你会发现没有报错) 这个就是因为Java 自动帮你传递了这个对象,所以 this 其实就是可以指代这个对象时谁。

当你调用某个对象的成员方法时,Java会自动帮你把对象传递过去,并且使用 this 来接收这个对象,所以上面我们可以使用 this.year = year 来避免局部变量自我赋值,而是将局部变量赋值给对象的成员变量。

this与成员方法

由于this 就是指向对象的,所以我们可以在非静态的成员方法中进行使用来调用其他的成员方法~~

静态与非静态会在下一篇文章中讲解~~

构造方法

       构造方法的作用是给成员变量进行初始化的

创建格式:

修饰符 类名(形参列表){
       方法体
}

注意构造方法没有返回值,并且和普通的方法一样是可以发生方法的重载的~~
名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次

再谈对象的实例化

对象的示例化简单来说可以分为两步,第一步是分配内存空间,第二步是调用构造方法
一旦new 类名(参数) 的时候就会调用构造方法~

可是上面的代码中,我们没有写过构造方法,代码为什么会正常执行并且没有报错呢?

因为在Java中,如果你没有写过任何的构造方法的话,Java会给你自动提供一个空的构造方法(这个方法是空的,没有任何效果)
但是如果你写了构造方法的话,Java是不会帮你提供一个空的构造方法~~

例如下面的代码:

class Dog{
    public String name;

    public Dog(int year){
        System.out.println(year + "出生了");
    }
}

public class Test{
    public static void main(String[] args) {
        Dog dog = new Dog(2024);
        Dog dog2 = new Dog();
    }
}

dog2 是无法进行创建的,因为Dog的构造方法只有public Dog(int year),而没有Dog()这个构造方法!!!

this与构造方法

在构造方法中是可以使用this关键字来调用构造方法的~
调用格式比较特殊,this(参数)
在构造方法中可以调用其他构造方法,但必须放在第一行!!!
并且使用 this 调用构造方法的时候不能形成环!!!

下面代码就是成环的表现~~
这是不被允许的!!!

    public Dog(){
        this(2024);
    }
    
    public Dog(int year){
        this();
        System.out.println(year + "出生了");
    }

总结

this 关键字:

  1. this.当前对象的成员变量
  2. this.当前对象的非静态的成员方法
  3. this() 调用其他的构造方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

弹幕游戏-压力测试 Python-Locust模拟送礼物

Hey,读者们!今天给大家带来一个Python性能测试的新玩法——使用Locust模拟发送礼物。是不是听起来就很酷?😎 🎯目标 想象一下,在直播平台上,你希望测试某个直播间的礼物发送功能。那么&#x…

通义千问 1.5 -7B fine-tune验证

尝试对对中文数据进行finetune验证,测试模型的可优化方向。下面是代码的详细情况 代码实现 from datasets import load_dataset from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,HfArgumentParser,AutoTokenizer,TrainingArgum…

Spring学习①__Spring初识

Spring Spring初识一、框架二、Spring(春天)简介Spring官网Spring是什么?Spring介绍拓展 Spring初识 一、框架 ​框架就是一些类和接口的集合,通过这些类和接口协调来完成一系列的程序实现。 JAVA框架可以分为三层: 表示层业务…

视频号小店,一个不用直播就可以变现的项目!创业首选!

大家好,我是电商小V 想要创业或者是想要利用视频号变现的小伙伴可以说是很多的,因为视频号这两年的流量是非常大的,甚至即将超越抖音的流量,因为视频号背靠腾讯平台,也是不缺少流量的,并且视频号的流量是可…

高扩展性便携式1553B总线测试仪,支持麒麟操作系统

手提式便携1553B总线测试仪,利用订制平台的PXIe扩展槽嵌入石竹科技自主研发的高性能T系列专用1553B测试板卡和高级协议分析和测试软件FP-1553B Pro、FP-5186集成的一款模块化、功能可订制的测试仪器。 基本配置可对1553B信号进行波形采集(提供软件示波器…

如何实现数字化校园的高效运维

随着科技开展,国家大力支持各级各类学校建造数字化学校,综合利用互联网、大数据、人工智能和虚拟现实技能探究未来教育教育新模式。因为数字化学校的快速开展,学校网内设备类型很多,网络拓扑杂乱,信息运用繁复。各部门…

电机控制杂谈——“双采样双更新模式”对模型预测控制/PI控制的提升有多大?

1.采样频率与PWM开关频率的关系 一般有以下两种采样模式。 如下图(a)所示,这种方式称之为单采单更模式,即在一个PWM周期内,采样一次,更新一次PWM占空比,在这种情况下,采样频率&…

ICode国际青少年编程竞赛- Python-5级训练场-综合练习5

ICode国际青少年编程竞赛- Python-5级训练场-综合练习5 1、 a 16 for i in range(6):Dev.step(1)Dev.turnLeft()Dev.step(a)Dev.step(-a)Dev.turnRight()while Dev.energy < 100:wait()Dev.step(1)a a - 5 i2、 for i in range(5):Dev.step(11 - i * 2)Dev.turnRight()wh…

PBR系列-光之简史

作者&#xff1a;游梦 ​ 欢迎进入官网体验使用&#xff1a;Mapmost——让人与机器联合创作成为新常态 ​说到PBR理论分为三大理论&#xff1a;物理光源、物理材质与物理相机&#xff0c;三者都与光有着千丝万缕的关系&#xff0c;原打算这期讲解物理材质&#xff0c;在梳理知…

刚刚OpenAI发布ChatGPT-4o模型,免费使用GPT4o并免费提供更多功能

就在今日凌晨1点&#xff0c;OpenAI举行了春季发布会&#xff0c;发布了GPT-4o 并免费提供更多功能。 亲测GPT-4o已经可以免费试用&#xff0c;每个人都可以使用它并从中受益&#xff0c;GPT4终于不再是少部分人的玩物。 点击加入ChatGPT4交流群&#xff1a;https://www.aijour…

记一次跨域问题

线上跨域问题&#xff0c;在自己配置确认没问题下&#xff0c;要及时找运维看看是不是nginx配置问题。 两个方面&#xff1a; 项目代码 nginx配置 SpringBoot 解决跨域问题的 5 种方案&#xff01; SpringBoot解决CORS跨域问题 SpringBoot-实现CORS跨域原理及解决方案

unordered_map、unordered_set底层封装

文章目录 一、先实现哈希桶1.1哈希桶的实现方法1.2日常普遍的哈希桶存放的数据有两种&#xff1a;字符串和整形1.3哈希桶的实现代码详解1.3.1哈希桶的两种仿函数&#xff08;int和string&#xff09;1.3.2哈希桶的节点&#xff08;如果桶非常深&#xff0c;这里考虑挂红黑树&am…

MQTT学习(二)

订阅主题和订阅确认 SUBSCRIBE——订阅主题 之前的CONNECT报文&#xff0c;分为 固定报头&#xff1a;必须存在&#xff0c;用于描述报文信息。里面有指出什么类型的报文&#xff0c;报文的等级。可变报头&#xff1a;不一定存在。主要看什么样子类型的报文。有效载荷部分&a…

Go PDF文件操作

目录 介绍 安装 gofpdf API 代码示例 结果展示 介绍 gofpdf 是一个在 Go 语言中用于生成 PDF 文档的库。 安装 gofpdf 首先&#xff0c;你需要安装 gofpdf 库。你可以使用 go get 命令来安装它&#xff1a; go get github.com/jung-kurt/gofpdf API 功能 函数名参数解释示…

25. K 个一组翻转链表 - 力扣(LeetCode)

基础知识要求&#xff1a; Java&#xff1a;方法、while循环、for循环、if else语句 Python&#xff1a; 方法、while循环、for循环、if else语句 题目&#xff1a; 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个…

【目标检测】YOLOv5|YOLOv8模型QT界面可视化部署

YOLO-Deploy-QT_Interface 最近笔者做了YOLO系列算法的部署工作,现做一个总结。主要工作是做了用于部署YOLOv5和YOLOv8的可视化QT界面,可实现图片、文件夹、视频、摄像头的ONNX与OpenVino部署,具体效果如下: 代码链接:https://github.com/Zency-Sun/YOLO-Deploy-QT_Inte…

深入学习Linux内核之v4l2应用编程(二)

一&#xff0c;用户空间访问v4l2设备步骤 V4L2&#xff08;Video for Linux 2&#xff09;是Linux中关于视频设备的内核驱动&#xff0c;它使得Linux系统能够支持视频设备&#xff0c;如摄像头。对于Camera V4L2的应用编程&#xff0c;一般遵循以下步骤&#xff1a; 1&#x…

【正则表达式】1、元字符的认识与分类

1、元字符的概念 正则表达式的常见功能&#xff0c;分别是校验数据的有效性、查找符合要求的文本以及对文本进行切割和替换等操作。 我想你一定在办公软件&#xff0c;比如 Word、Excel 中用过这个功能。你可以使用查找功能快速定位关注的内容&#xff0c;然后使用替换&#xf…

leetcode-最长公共子序列(二)-103

题目要求 思路 step 1&#xff1a;优先检查特殊情况。 step 2&#xff1a;获取最长公共子序列的长度可以使用动态规划&#xff0c;我们以dp[i][j]dp[i][j]dp[i][j]表示在s1中以iii结尾&#xff0c;s2中以jjj结尾的字符串的最长公共子序列长度。 step 3&#xff1a;遍历两个字…