Java——构造器(构造方法)和 this

news2024/11/25 19:03:48

一、什么是构造器

构造器(Constructor)是Java类的一种特殊方法,用于初始化对象的状态。构造器在创建对象时被调用,可以对对象的成员变量进行初始化。

我之前的文章《Java——类和对象-CSDN博客》中也提到了构造器。

二、构造器详细介绍

1、引入

我们之前在实例化一个类时,对创建的对象的属性初始化都是依靠一个个访问对象的属性然后一个个赋值的,这样实在太麻烦。

public class Test {
	public static void main(String[] args) {
		Person person = new Person();
		person.name = "张三";
		person.age = 19;
	}
}

class Person {
	Sring name;
	int age;

	//...
}

这时,我们就可以使用构造器,构造器实际上是在创建对象时自动被调用的。

public class Test {
	public static void main(String[] args) {
		Person person = new Person("张三", 19);
	}
}

class Person {
	String name;
	int age;

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

这样我们就能再创建对象时就直接将对象的属性初始化好了。

2、构造器介绍

1)基本语法

构造器的基本语法是:

[修饰符] 类名(参数列表) {
    /...
}

2)特点

  1. 名称与类名相同:构造器的名称必须与类名完全一致。
  2. 没有返回类型:构造器没有返回类型(连 void 都不能写)。
  3. 自动调用:构造器在使用new关键字创建对象时自动调用。
  4. 隐式构造器:如果类中没有定义任何构造器,Java编译器会自动提供一个无参的默认构造器。但是一旦用户自定义了自己的构造器,这个默认构造器就会被覆盖,就不会存在了。这个构造器就长这样:
    类名() {}
  5. 访问修饰符:构造器的修饰符可以是public,private,protected,默认(什么都不写)。

3、构造器重载

构造器像一般方法一样,也可以重载。

public class Test {
	public static void main(String[] args) {
		Person person1 = new Person();//使用无参的构造器初始化
		Person person2 = new Person("张三");//使用一个名字参数的构造器初始化
		Person person3 = new Person("李四", 19);//使用两个参数的构造器初始化
	}
}

class Person {
	String name;
	int age;

	//无参构造器
	public Person() {
		this.name = "无名";
		this.age = 18;
	}

	//一个名字参数的构造器
	public Person(String name) {
		this.name = name;
		this.age = 18;
	}

	//两个参数的构造器
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
}

重载的规则与一般方法的规则也是一致的。

4、构造器使用示例

public class Test {
	public static void main(String[] args) {
		Cat cat = new Cat("小喵", 3);
	}
}

class Cat {
	String name;
	int age;

	//构造器
	public Cat(String name, int age) {
		this.name = name;
		this.age = age;
	}
}

使用构造器初始化 cat 对象的两个属性。

5、补充细节

1)构造器只完成对对象的初始化

构造器只完成对象的初始化,不会创建对象。

2)查看默认的构造器

上面我们说到,如果用户没有显示自定义构造器,Java编译器会自动提供一个无参的默认构造器。我们可以使用 javap 反编译查看这个构造器:

我们以下列代码为例,这里定义一个类,里面没有任何内容:

class Cat {
	
}

然后我们使用 javac 指令进行编译,

然后使用 javap 反编译字节码文件,得到的内容如下:

我们可以看到这里是对应的一个方法的声明。

三、创建对象的同时使用构造器的具体图解

下面我们对创建对象的同时使用构造器初始化对象的属性的具体机制进行详细介绍,以以下代码为例:

public class Test {
	public static void main(String[] args) {
		Person person3 = new Person("李四", 19);//使用两个参数的构造器初始化
	}
}

class Person {
	String name;
	int age;

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

当执行主方法中的第一句时,会加载 Person 类,然后再堆区创建 person3 这个对象,然后这个对象的属性被默认初始化为类型默认值:

然后调用构造方法将这个 person3 对象初始化。

如果在类中对某个属性有过显式初始化,例如下面:

public class Test {
	public static void main(String[] args) {
		Person person3 = new Person("李四", 19);//使用两个参数的构造器初始化
	}
}

class Person {
	String name;
	int age = 18;

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

这里对于 age 属性就有显式初始化,接下来的初始化顺序是:

四、this 介绍

1、this 简要介绍

this 是一个指向当前对象的引用。在实例方法或构造方法中使用 this 时,它指向调用该方法或构造方法的对象实例。

2、隐式使用 this

在实例方法中,即使不显式使用 this,JVM 也会在幕后使用 this 来引用当前对象。例如,访问实例变量 num 实际上是 this.num。就像下面的代码:

class Person {
	String name;
	int age;

	public void speak() {
		System.out.println(name + "说:...");//这里的name就是this.name
	}
}

3、this 的实际内部工作机制

当实例方法被调用时,JVM 会传递一个隐藏参数给该方法,这个隐藏参数就是对调用该方法的对象的引用,也就是 this

五、this 使用

1、用于区分实例变量和局部变量

在方法或构造器中,如果局部变量和实例变量同名,那么局部变量会隐藏实例变量。此时可以使用 this 关键字来引用实例变量。

public class MyClass {
    private int num;

    public MyClass(int num) {
        this.num = num;  // this.num 指的是实例变量,而 num 是构造器的参数
    }

    public void setNum(int num) {
        this.num = num;  // this.num 指的是实例变量,而 num 是方法参数
    }

    public int getNum() {
        //return num;    //就相当于return this.num; 这里会隐式使用this
        return this.num;  // this.num 指的是实例变量
    }
}

2、访问对象的属性

public class Test {
	public static void main(String[] args) {
		Person person = new Person("张三", 19);
		person.info();//显示信息
	}
}

class Person {
	String name;
	int age;

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

	public void info() {
		System.out.println("名字:" + this.name + "\n年龄:" + this.age);
	}
}

运行结果:

这里的通过 this 访问到对象的 name 和 age 属性。

3、调用当前对象的方法

可以使用 this 关键字来调用当前对象的方法,尤其是在需要明确是当前实例的方法时。

class Person {
	String name;
	int age;

	//说话
	public void speak(String words) {
		System.out.println(this.name + "说:“" + words + "”");
	}

	//打招呼
	public void greet() {
		this.speak("你好!");//调用该对象的说话方法
	}
}

4、调用当前对象的构造器

在构造器内部,可以使用 this() 调用当前类的其他构造器。这个语法只能在构造器中使用。

class Person {
	String name;
	int age;

	//一个名字参数构造器
	public Person(String name) {
		this.name = name;
	}

	//两个参数的构造器
	public Person(String name, int age) {
		this(name);
		this.age = age;
	}
}

如果我们要使用 this() 语句在一个构造器中调用其他构造器,那么 this() 这条语句必须是这个构造器的第一条语句,就像上面这样。

也就是说对 this() 的调用必须是构造器第一条语句

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

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

相关文章

7z压缩文件解压缩遇到文件末端错误

错误如上。我是之前使用7zip压缩软件压缩本地视频为7z格式,然后将压缩包上传到阿里云盘。今天通过阿里云盘下载这个文件,结果使用7zip解压压缩软件 解压缩这个文件遇到“文件末端错误”,然后在网上找了一圈也没有找到解决办法。 我用winrar解…

LoadBalance客户端负载均衡

1. 前言Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0…

Python 基础:类

目录 一、类的概念二、定义类三、创建对象并进行访问四、修改属性的值方法一:句点表示法直接访问并修改方法二:通过方法进行修改 五、继承继承父类属性和方法重写父类方法 六、将实例用作属性七、导入类导入单个类从一个模块中导入多个类导入整个模块导入…

简单谈谈云服务器私网IP的存在意义及优势

云服务器是基于虚拟化技术的计算资源,可以在云平台上灵活创建和管理。为了满足不同用户的需求,云服务提供商在云服务器上分配了两种类型的IP地址:公网IP和私网IP。其中,私网IP是指在局域网内使用的内部IP地址,无法通过…

TF-IDF(Term Frequency-Inverse Document Frequency)

TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用于信息检索和文本挖掘的统计方法,用以评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。它的重要性随着词语在文本中出现的次数成正比增加,但同时…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 01 为什么需要一个新的网络架构

关于专栏 本专栏是工作之后阅读 Cloud Native Data Center Networking ( O’Reilly, 2019)的读书笔记。这本书是我在数据中心从事云网络工作的启蒙、扫盲读物。可惜,其中文版翻译并非尽善尽美,必须结合英文原版才能理解原作者要表…

xss+csrf项目实例

项目背景: 如下:我们是在一个类似文章管理系统的网站上面发现的该漏洞。我们将其运行在本地的phpstudy集成环境上面。 源码地址下载链接:https://pan.baidu.com/s/1MpnSAq7a_oOcGh4XgPE-2w 提取码:4444 考察内容: …

盗版游戏缺少steamdll文件怎么办?游戏报错steam_api64.dll缺失解决方法

steam_api64.dll 是一个针对64位Windows操作系统设计的动态链接库文件,其核心作用是实现运行在Windows上的应用程序与Steam客户端之间的通信。该文件通常大小在1.5-3.5 MB之间,对于Steam平台的正常运行至关重要。 功能概述: 游戏验证&#…

Linux:线程池

Linux:线程池 线程池概念封装线程基本结构构造函数相关接口线程类总代码 封装线程池基本结构构造与析构初始化启动与回收主线程放任务其他线程读取任务终止线程池测试线程池总代码 线程池概念 线程池是一种线程使用模式。线程过多会带来调度开销,进而影…

第一篇——怎样堵住我们人生错误的源头

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 再次开始了孙子兵法的学习,之前听完就让我醍醐灌顶&#xff0…

Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)

上次介绍了:Linux:基础IO(一.C语言文件接口与系统调用、默认打开的文件流、详解文件描述符与dup2系统调用) 文章目录 1.缓冲区1.1概念1.2作用与意义 2.语言级别的缓冲区2.1刷新策略2.2具体在哪里2.3支持格式化 3.自己来模拟一下缓…

【数据库编程-SQLite3(一)】sqlite3数据库在Windows下的配置及测试

学习分析 1、资源准备2、环境配置2.1、将资源包下载解压缩保存。2.2、在QT中创建工程,配置环境 3、测试配置3.1、 sqlite3_open函数3.2、sqlite3_close函数3.3、代码测试 1、资源准备 资源包 2、环境配置 2.1、将资源包下载解压缩保存。 解压缩得到以下文件 2.2、在QT中创建…

JavaFX VBox

VBox布局将子节点堆叠在垂直列中。新添加的子节点被放置在上一个子节点的下面。默认情况下,VBox尊重子节点的首选宽度和高度。 当父节点不可调整大小时,例如Group节点,最大垂直列的宽度基于具有最大优选宽度的节点。 默认情况下,…

逢3必过报数游戏-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第84讲。 逢3必过报数游戏&…

guli商城业务逻辑-基础篇笔记

这里写目录标题 0.1 viscode设置用户代码片段1.实现多级菜单接口1.1 对接前端菜单1.2 对接网关接口解决跨域问题,如果不解决跨域,浏览器还是访问不了api1.3 把商品服务添加网关1.4 修改前端显示分类菜单1.5 给菜单添加删除修改功能1.5.1 删除功能的后端业…

安卓在Fragment控制状态栏显示隐藏

废话不多上效果 隐藏 显示 核心代码 首先是Framgrent package com.zx.tab;import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button;impor…

分布式系统中的经典思想实验——两将军问题和拜占庭将军问题

文章目录 一、两将军问题1.1 问题描述1.2 深入理解两将军问题1.3 实验结论 二、拜占庭将军问题2.1 问题描述2.2 深入理解拜占庭将军问题2.3 解决方案 三、两将军和拜占庭问题的关系3.1 区别和联系3.2 应用与现实意义 参考资料 一、两将军问题 1.1 问题描述 两将军问题描述的是…

使用了代理IP怎么还会被封?代理IP到底有没有效果

代理IP作为一种网络工具,被广泛应用于各种场景,例如网络爬虫、海外购物、规避地区限制等。然而,很多用户在使用代理IP的过程中却发现自己的账号被封禁,这让他们不禁产生疑问:使用了代理IP怎么还会被封?代理…

基于粒子群优化算法的的微电网多目标优化调度----算法改进

前言: 当阅读过前一篇我的博客之后,并且认真去读懂了那篇文章末尾的代码,那么,后续的算法改进对于你来说应当是很容易的了。前文中提及过,粒子群在进行迭代时,每迭代一次,都会根据自己个体最优值…

4 最简单的 C 程序设计—顺序程序设计-4.6 顺序结构程序设计举例

【例 4.14】输入三角形的三边长&#xff0c;求三角形面积。 #include <stdio.h> #include <math.h> // 包含数学函数头文件main() {/* 【例 4.14】输入三角形的三边长&#xff0c;求三角形面积。已知三角形的三边长 a,b,c&#xff0c;则该三角形的面积公式为&…