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

news2025/1/18 19:09:00

前言

       从这篇文章开始,我们就进入到了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() 调用其他的构造方法

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

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

相关文章

【RAG 论文】BGM:为 LLM 和 Retriever 的偏好 gap 搭建一个 Bridge

论文:Bridging the Preference Gap between Retrievers and LLMs ⭐⭐⭐ Google Research, arXiv:2401.06954 论文速读 LLM 与 Retriever 之间存在一个 preference gap:大多数 retriever 被设计为 human-friendly,但是 LLM 的偏好与人类的却…

基于Vue3+ElementPlus项目,复制文字到剪贴板功能实践指南,揭秘使用js-tool-big-box工具库的核心优势

在前端开发项目中,很多时候有那么一个场景,就是要求将一段文案复制下来,这段文案可能是一串很长的id,可能是一条命令语句,可能是一小段文案,复制到剪贴板上。这样有利于用户复制到其他地方去,使…

OpenHarmony 3.1 Release实战开发 + Linux 原厂内核Launcher起不来问题分析报告

1、关键字 Launcher 无法启动;原厂内核;Access Token ID; 2、问题描述 芯片:rk3566;rk3399 内核版本:Linux 4.19,是 RK 芯片原厂发布的 rk356x 4.19 稳定版内核 OH 版本:OpenHa…

漏桶算法:稳定处理大量突发流量的秘密武器!

漏桶算法的介绍 我们经常会遇到这样一种情况:数据包的发送速率不稳定,而网络的带宽有限。如果在短时间内有大量的数据包涌入,那么网络就会出现拥塞,数据包的丢失率就会增大。为了解决这个问题,人们提出了一种叫做“漏…

怎样辨别LED显示屏的品质

在当今数字化时代,LED显示屏已成为信息传播的重要媒介,广泛应用于广告、信息显示、舞台背景等领域。然而,市场上的LED显示屏品质参差不齐,如何鉴别其品质等级成为了用户关注的焦点。以下是一些专业的方法,帮助用户辨别…

geotrust ov泛域名证书2990

Geotrust是一家正规的CA证书颁发机构,致力于为个人以及企事业单位开发者提供安全可靠的数字证书产品,维护了个人博客网站、企业官网、商城网站以及银行等金融网站的数据安全,营造了一种健康的网络环境。今天就随SSL盾小编了解Geotrust旗下的O…

如何判断海外住宅ip的好坏?

在海外IP代理中,住宅IP属于相对较好的资源,无论是用于工作、学习、还是娱乐,都能得到较好的使用效果。作为用户,该如何判断海外住宅IP的好坏呢? 稳定性与可靠性:海外住宅IP相比动态IP地址,通常具…

C++(week3):数据结构与算法

文章目录 (十一) 常用数据结构1.动态数组(1)模型(2).h与.c(3)实现 2.链表(1)模型(2)分类(3)基本操作(API)(4)实现(5)链表常见面试题(6)空间与时间 3.栈(1)模型(2)基本操作(3)实现(4)栈的应用 4.队列(1)模型(2)基本操作(API)(3)实现(4)队列的应用 5.哈希表(1)哈希表的提出原因(2…

Samtec技术分享 | 电源/信号高密度阵列的新视角

【摘要/前言】 “角度”,这个词每天都出现在我们的生活中,有物理学的角度,如街边的拐角,还有视觉上的角度和观点中的角度~ Samtec新型 AcceleRate mP 高密度电源/信号互连系统正是从电源完整性 90度旋转的不同角度中诞生的。 …

作为前端开发,感受下 nginx 带来的魅力!

引言:纯干货分享,汇总了我在工作中八年遇到的各种 Nginx 使用场景,对这篇文章进行了细致的整理和层次分明的讲解,旨在提供简洁而深入的内容。希望这能为你提供帮助和启发! 对于前端开发人员来说,Node.js 是…

#自学习# 记一次py脚本打开浏览器页面

在项目总结中,遇到系统后台利用浏览器拉起一个已知路径页面的需求,趁着机会整理下。实现起来比较简单,浏览器默认谷歌。 一、技术原理 Selenium:Selenium 是一个用于自动化 Web 浏览器的工具,可模拟用户在浏览器中的各…

帧类型代价计算原理:slicetype_frame_cost 函数分析

slicetype_frame_cost 函数 函数功能 这个函数的核心是计算编码一系列帧(从 p0 到p1,以 b 为当前帧)的代价 cost,并根据这个代价 cost来辅助帧类型决策。它考虑了运动搜索的结果、帧间和帧内预测的成本,并且可以并行处理以提高效率。该函数在帧类型决策、MBtree 分析、场…

硅胶可以镭射吗?

在科技发展的今天,我们经常会遇到各种各样的材料,其中就有一种叫做硅胶的材料。那么,硅胶可以镭射吗?答案是肯定的,硅胶不仅可以镭射,而且在某些应用中,它的镭射特性还非常突出。 首先&#xff…

HarmonyOS应用模型Stage基本介绍

文章目录 <font colorcoral> HarmonyOS应用模型概况<font colorcoral> Stage模型基本概念<font colorcoral> Stage模型UIAbiliry的生命周期<font colorcoral> Stage模型的配置文件<font colorcoral> 写在后面的话<font colorcoral>Referen…

自动驾驶占据感知的综述:信息融合视角

24年5月香港理工的论文“A Survey on Occupancy Perception for Autonomous Driving: The Information Fusion Perspective“。 3D 占据感知技术旨在观察和理解自动驾驶车辆的密集 3D 环境。该技术凭借其全面的感知能力&#xff0c;正在成为自动驾驶感知系统的发展趋势&#x…

Mapbox 天地图暗色系调整

效果&#xff1a; mapbox栅格图层样式设置 {//图层id&#xff0c;要保证唯一性"id": "tdtVec",//图层类型"type": "raster",//数据源"source": "tdtVec","paint": {"raster-hue-rotate": 1…

虚拟化软件栈面临的安全威胁主要涉及几个方面

1.基于虚拟层&#xff08;Hypervisor&#xff09;的攻击&#xff1a;VM Escape&#xff1a;攻击者利用虚拟化软件允许多个操作系统共享单个硬件处理器的漏洞。这使得黑客可以在受控制的虚拟层上攻击宿主机上的每个虚拟机。 VM sprawl&#xff1a;当网络上的虚拟机数量超过管理…

OpenAI 2024 Spring推出 GPT-4o,免费向所有人提供GPT-4级别的AI

OpenAI 2024 Spring推出 GPT-4o&#xff0c;这是OpenAI的新旗舰模型&#xff0c;可以实时对音频、视觉和文本进行推理。 GPT-4o&#xff08;“o”代表“omni”&#xff09;是迈向更自然的人机交互的一步——它接受文本、音频和图像的任意组合作为输入&#xff0c;并生成文本、音…

2024年为什么很多电商商家,都想涌入视频号,究竟是什么原因?

大家好&#xff0c;我是电商糖果 对电商有了解的朋友&#xff0c;在今年肯定发现一个现象&#xff0c;那就是很多商家对视频号比较青睐。 视频号究竟有何魔力&#xff0c;让越来越多的商家都想要入驻。 其实很简单&#xff0c;它让商家看到了市场。 视频号背后是谁&#xf…

【计算机网络】http协议的原理与应用,以及https是如何保证安全传输的

HTTP 超文本传输协议&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 HTTP的发展是由蒂姆伯纳斯-李于1989年在欧洲核子研究组织…