【一步一步了解Java系列】:类与对象的联系

news2024/11/18 0:18:11

看到这句话的时候证明:此刻你我都在努力
加油陌生人
微信图片编辑_20240229212205.png
个人主页:Gu Gu Study
专栏:一步一步了解Java

喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹


喜欢的话可以点个赞谢谢了。
作者:小闭


对象

Java中的对象是什么呢?显然不是我们现实生活中的对象。
emmm,在Java中有这么一句话,Java中任何东西皆可为对象,猫,狗,人,猴,洗衣机,手机,电脑,键盘等等。
Java中是一个面向对象的语言,对比C语言有什么不同呢?
我们举一个简单的例子,现在我们要用代码写出一个求阶乘的方法,C语言中叫函数,Java叫方法.。
C语言:C语言中会直接写出一个函数这个函数就是求阶乘的代码作为一个函数。
Java:首先他会先找一个对象,比如上方中是谁要求阶乘,比如要求阶乘的是学生,那么我们就要创建一个学生的对象,然后这个对象要干嘛,他要求阶乘,那么我们这时候就要给这个对象创建方法。这个方法就叫做:成员方法。
上面是一个简单的例子来简单展现C语言与Java的不同,当然可能有人就会问那我该怎么创建对象呢?
那么接下来登场的就是Java中的类。

类是用来描述一个对象的,对象是一个真正存在的实体。想要运用好类这个语法。我们就需要完成这么几个步骤:

  1. 根据事件找到对象。
  2. 对象存在着什么变量。
  3. 变量要完成什么事件。
  4. 根据这些创建成员变量和成员方法。

注意:我们一般建议一个文件建一个类。

那么接下来就通过举例来让大家更好的理解上面的知识点。

public class Dog {
    int age;
    String name;
    public static void eat(){
        System.out.println("吃狗粮");
    }
     public static void speak(){
        System.out.println("狗叫");
}
}

如上就是我定义的一个类,这个类是用来描述一只狗的。这里面的成员变量有,age年龄,还有名字name,然后还有两个成员变量,当然这个 对象还未进行实例化。那么什么叫实例化呢?

对象的实例化

对象的实例化就是由类生成对象的过程叫做实例化。那么具体的代码实现是怎么样的呢?

public class Dog {
    int age;
    String name;
    public static void eat(){
        System.out.println("吃狗粮");
    }
     public static void speak(){
        System.out.println("狗叫");

}

    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.age=2;
        dog.name="旺财";
        dog.speak();
        dog.eat();
        System.out.println(dog.age);
        System.out.println(dog.name);

    }
}

image.png
在上面的代码中 Dog dog=new Dog(); //对象的实例化,这条代码就是对象实例化的代码。这就是我们常说的new一个对象。
对象实例化后我们就可以通过”.“,操作符对,对象中的成员变量和成员方法进行赋值或调用方法。

当然大家可能就会好奇,如果我不给对象的成员变量进行赋值那么他会输出什么?其实如果不进行赋值那么它会默认给各种类型的数据的对应的”0值“,什么叫做各自的0值呢?那么我们就可以看下图了。image.png
注意:局部变量在使用前必须要初始化,而成员变量可以不初始化。


this关键字

为了更好的理解this关键字,我们先抛出一段代码。

public class Student {
    String name;

    public void setName(String a) {
        name = a;
    }


    public static void main(String[] args) {
        Student stu1=new Student();
        Student stu2=new Student();
        Student stu3=new Student();
        
        stu1.setName("小明");        
        stu2.setName("小李");        
        stu3.setName("小刚");        
    }
}

在上方代码中我们定义了一个Student类,然后里面的成员变量有名字,那么我们还定义了一个成员方法setName,然后我们在main方法中实例化了3个对象,然后我们调用了setName方法,给每个对象起个名字。
我们先看一下结果image.png
结果也是我们所期盼的结果了。可是我们想象一下,在setName中我们里面的赋值语句中有这么一条语句name=a;那么编译器在三个对象调用方法时是如何分辨出给对应的name赋值呢?其实这就说明每个对象调用方法就会给其成员变量给赋值。那么如果我们把setName设置成这样呢?name=name;

public class Student {
    String name;

    public void setName(String name) {
        
        name = name;
    }


    public static void main(String[] args) {
        Student stu1=new Student();
        Student stu2=new Student();
        Student stu3=new Student();

        stu1.setName("小明");
        stu2.setName("小李");
        stu3.setName("小刚");


        System.out.println(stu1.name);
        System.out.println(stu2.name);
        System.out.println(stu3.name);
    }
}

我们看一下结果image.png
很显然此时setName里并未给成员变量name赋到值,打印出null是因为String对应的0值为null。那我们如果要解决这个问题,我们就需要用到this关键字。

public void setName(String name) {

    this.name = name;
}

只要加上this后代码就会知道this.name指的是对象的name,单单一个name就是成员变量的name,这样就可以正确的赋值方法。那this的本质是什么呢?
其实这个this就是你所调用的对象。用代码表示的话就是:

public void setName(Student this,String name) {

    this.name = name;
}

这里的形参就会多加一个this。那么肯定就会有人问了,我也没给setName里传对象,没有实参的1传入啊?
其实这个传参编译器已经会自动帮我们传参,只不过都会省略掉了而已。


构造方法

在Java中,构造方法是一种特殊的方法,它用于在创建对象时初始化对象的状态。构造方法具有以下特点:

  1. 名称与类名相同:构造方法的名称必须与类名完全相同,包括大小写。
  2. 没有返回类型:构造方法没有返回值,即使是void也没有。
  3. 自动调用:当使用new关键字创建对象时,构造方法会自动被调用,用于初始化对象。
  4. 可以有多个:一个类可以有多个构造方法,只要它们的参数列表不同(参数的数量或类型不同)。
  5. 不能被继承:构造方法不会被继承,即子类不会继承父类的构造方法。
  6. 不能直接调用:不能通过对象调用构造方法,它们是在对象创建时自动调用的。
  7. 如果我们没有自己定义构造方法则Java中会自动给我们构造一个空的构造方法。这个构造方法会省略掉我们是看不见的,但是他确实存在。

下面是一个简单的Java类示例,其中包含了一个构造方法:

public class Person {
    private String name;
    private int age;

    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 其他方法
    public void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

// 使用构造方法创建对象
Person person = new Person("Alice", 30);
person.displayInfo();

在这个例子中,Person类有两个私有属性name和age。Person类有一个构造方法Person(String name, int age),它接受两个参数来初始化对象的状态。当创建一个新的Person对象时,必须提供这两个参数,并且构造方法会被自动调用来设置对象的初始状态。

this关键字可以在一个构造方法中调用其它构造方法,例如:

public class Dog {
    String name;
    public Dog(){
        System.out.println("调用了无参的构造的方法");
    }

    public Dog(String name){
        this();
        this.name=name;
        System.out.println("调用了有参的构造的方法");

    }

    public static void main(String[] args) {

        Dog dog=new Dog("旺财");
    }

}

image.png
如上:我们在调用有参的构造方法时,也会自动调用无参的构造方法,但要注意this()必须在当前构造方法的第一个语句,否则就会报错。


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

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

相关文章

6.1 Go 数组

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【双层模型】分布式光伏储能系统的优化配置方法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序模型参考《分布式光伏储能系统的优化配置方法》,分为上下层求解方式,上层采用粒子群算法确定储能的选址和容量方案,以全年购电成本、网络损耗、光伏运行成本、储能充放…

2024年618网购节各大电商超级红包二维码集合

一年一度的电商618网购节又要来了,下面收集了淘宝/京东/拼多多的618红包二维码,手机扫描或识别即可每天领红包,可参考好物分享中的商品下单: 淘宝618超级红包:即日起至2024.6.10,每天可领一次 京东618无门…

idea项目一直在build

IDEA项目一直在build的原因可能包括构建进程堆大小过小、缓存问题、依赖包下载缓慢或网络问题。12 构建进程堆大小过小:如果IDEA的构建进程堆大小设置得不够大,可能会导致构建过程缓慢或卡顿。解决方法是将构建进程堆大小参数扩大,例如将700…

web前端框架设计第十一课-常用插件

web前端框架设计第十一课-常用插件 一.预习笔记 1.路由的基础使用 2.动态路由 3.嵌套路由 二.课堂笔记 三.课后回顾 –行动是治愈恐惧的良药,犹豫拖延将不断滋养恐惧

再次疾呼:一稿多投是作者的合法权利!

近日,有作者反应在收到拒稿邮件之后另投他刊,竟然被判定一稿多投。 出版社解释说现在大多数期刊都是使用投稿系统收稿,如果被退稿后马上又投稿其他期刊,由于时间距离太近,仍然会被系统判定为一稿多投的。核心期刊编辑…

pikachu—exec“eval“

这是原画面 然后呢? 我们知道会传入到后台rce_eval.php来处理然后通过 eval()是啥? 在eval括号里面可以执行外来机器的命令 然后我们通过php的一个内置的命令 我们通过phpinfo(); 这是输入后的结果

Figma 文件批量导出到本地的方法

作为新一代UX设计师,我们应该熟练地使用市场上的许多设计软件,并更熟悉它们的软件功能。现在市场上的即时设计,作为一种在线合作设计工具,值得成为许多设计师的常用工具。最近,我了解到即时设计进行了新的功能更新&…

第二十五章CSS中的技巧(导航栏、下拉列表)

1.CSS精灵 1.什么是CSS精灵 英文叫法 CSS sprites,通常被解释为“CSS图像拼合”或“CSS贴图定位”;其实就是把网页中一些背景图片整合到一张图片文件中,再利用css“background-image”, “background-repeat”,“background-position”的组…

【Unity Shader入门精要 第11章】让画面动起来(二)

1. 顶点动画的原理 顶点动画的原理是,在顶点着色器中按照一定的规则或函数计算得到一段偏移量对顶点进行移动,最后将改变位置后的顶点变换到裁剪空间进行后续的渲染工作。 可见,与纹理动画只是改变从纹理中哪一部分开始显示图案不同&#x…

水质预测模型精度评估实例

研究背景 随着水资源管理需求的日益增长,水质预测模型的精准度成为了评估其有效性的关键因素。本文旨在通过实证研究,探讨自建水质预测模型的实际应用效能,通过与真实监测数据的比对,揭示模型预测精度的真实情况。 数据基础情况…

【任务调度】Apache DolphinScheduler中关于全局参数设置、自定义参数、补数的介绍

Apache DolphinScheduler是一个分布式和可扩展的开源工作流协调平台,具有强大的DAG可视化界面。 今天在海豚调度的一个接口中想入参一个当前时间(要求格式为yyyyMMddhhmmss),找了找发现如下几种方法,给记录一下: 1.全局参数设置 在设置DAG图名称这一位…

CTF实战分享 | RWZIP

前言 首先我们要了解,压缩包本身并不具备隐藏信息的功能,但由于在CTF竞赛中,经常出现压缩包与隐写术结合在一起的题目,所以我们需要掌握在CTF竞赛中有关 ZIP 压缩包题目的常见题型及分析手段。 读者福利 | CSDN大礼包&#xff1a…

css设置文字在固定宽度中等距分开(仅限于单行文本)

一、要实现的效果: 二、代码 要在CSS中设置文本在一个固定宽度的容器中等距分开, 可以使用text-align: justify;属性,它可以让文本两端对齐,看起来就像是等距分开的。 但是要注意,单独使用text-align:justify;只能对单…

Midjourney如何控制光照?提示词灵感来了!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Midjourney如何控制光照?提示词灵感来了!文章目录 前言总结 前言 Midjourney v6 已经更新好久了,你知道有哪些可以控制光照效果的关键词吗…

数据结构---单向链表

思路分析: 1. 设计 struct LinkNode 节点结构体 strut LList 链表结构体 typedef void *LinkList 给用户使用链表指针 2. 初始化链表 LinkList mylist init_LinkList(); 3. 插入链表 void inser…

使用python实现炫酷的渐变色

使用python实现炫酷的渐变色 1、前言2、所需条件3、实现步骤步骤1:定义渐变函数步骤2:将渐变应用于目标颜色步骤3:定义参数并执行 4、完整代码5、总结 1、前言 通过应用颜色渐变,可以大大提升图像的视觉效果。在这篇博客中&#…

2025第十届美陈展

展位又遭疯抢!2025第十届美陈展释放“无界之美” 美是全球通用的语言,人类对美的追求始终如一,大众审美在经历了时代的变迁后开始趋同,东方文明深处的美学经济开始崛起。 在如今商业迈入存量阶段,以品牌为突破口打造…

基于VMware安装Linux虚拟机

1.准备Linux环境 首先,我们要准备一个Linux的系统,成本最低的方式就是在本地安装一台虚拟机。为了统一学习环境,不管是使用MacOS还是Windows系统的同学,都建议安装一台虚拟机。 windows采用VMware,Mac则采用Fusion …

有免费通配符证书吗?哪里可以申请?

市面上的免费SSL证书大多数为单域名证书,如果您的主域名拥有众多子域名,逐一申请单域名SSL证书不太现实,下面为介绍一款永久免费使用的通配符SSL证书申请流程 1 选择免费通配符证书提供商 免费通配符证书申请点击这里直接获取https://www.…