Java值传递和构造函数

一.Java值传递

 首先我们来看一串代码:

输出 10 20,而不是20 10 这是为什么呢?

有内存图可以知道,这个change方法所改变的东西最终没有写回到main之中,且他传的是具体的数据,所以还会输出原数据,就相当于change是一块独立的空间方法,他怎么操作和main完全没有关系。

 

再来看这一段代码:

他会输出{1,88,99,4,5}是改变之后的数据,这又是为什么,不是传不到吗?

 答案是否定的,数组在传递是永远不会传递里面的数值,而是传递他数组的地址,这时候方法里拿到的是他的地址,方法直接对地址操作,结果回头同步到原数组里。所以它可以传输

再来看下一段:

这个就和上一个同理,因为操作的是地址,所以方法操作会回显

 那么,我们来改一下

输出 张三 18,李四 20不变

有内存图可知,change方法里依旧是自己在做交换,并没有操作地址,没有操作值里面的name,age字样,所以输出结果不变

在改变一下:

 输出李四 18,张三 20

此时的change方法里有明显的name字样,说明操作的是地址,是值,会改变原有的数据

再来看最后一道题:

输出null 42 42

首先他要输出two.x的值,而byte x并没有设置值,所以为null;

然后她以上一个创建的two为模板,只不过调用了一个fix创建了two2,此时two调用了fix方法将地址改为了tt,x的值改为了42,而two2也一样,所以是42 42

二.java构造函数 

构造函数的定义

构造函数(Constructor)是Java类中一种特殊的方法,用于创建对象时初始化对象的成员变量。其特点如下:

- 方法名与类名完全相同,且没有返回值(包括 void 也不能写)。
- 不能被 static 、 final 、 abstract 等修饰符修饰。

构造函数的分类与基本使用

1. 默认构造函数
若类中未显式定义构造函数,编译器会自动生成一个无参数的默认构造函数,其作用是初始化对象但不做具体赋值。

例:
class Person {} 
// 编译器自动生成默认构造函数:public Person() {
}


 
2. 自定义构造函数
可根据需求定义带参数的构造函数,用于在创建对象时直接为成员变量赋值,避免创建后再手动设置。

例:
class Person {String name;int age;// 自定义带参数的构造函数public Person(String n, int a) {name = n;age = a;}
}
// 使用:创建对象时直接赋值
Person p = new Person("张三", 20); 

应用场景

1. 对象初始化:创建对象时一次性完成成员变量的赋值,保证对象创建后处于有效状态。
例:通过构造函数确保 Person 对象必须有 name 和 age ,避免出现未赋值的空对象。
2. 重载与灵活性:一个类可以定义多个参数不同的构造函数(重载),满足不同创建需求。

例:
class Person {String name;int age;// 无参构造public Person() {} // 带一个参数public Person(String n) { name = n; }// 带两个参数public Person(String n, int a) { name = n; age = a; }
}
// 可根据需求选择构造方式
Person p1 = new Person(); 
Person p2 = new Person("李四");


 
3. 封装与安全性:通过构造函数控制成员变量的初始化逻辑(如参数校验),避免无效值。
例:
public Person(int age) {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
this.age = age;
}

4.核心特点

- 名称特殊:方法名必须与所在类的类名完全一致(包括大小写)。
- 无返回值:不允许声明返回类型,甚至不能写 void 。
- 自动调用:创建对象时(使用 new 关键字)会自动调用,无需手动调用。
- 默认存在:若类中未显式定义任何构造函数,编译器会自动生成一个无参数的默认构造函数;一旦定义了自定义构造函数,默认构造函数就会失效(若需使用,需手动显式定义)。
- 支持重载:一个类中可以有多个构造函数,只要参数列表(参数类型、数量、顺序)不同,即构成重载,以适应不同的初始化需求。
- 作用单一:主要用于对象创建时的初始化操作(如给成员变量赋值、参数校验等),不能像普通方法一样被多次调用。


 

简言之,构造函数是对象创建的“初始化工具”,通过它可以规范对象的创建过程,提高代码的安全性和简洁性。

总结:

Java构造函数

构造函数是类中用于初始化对象的特殊方法,核心特点和作用如下:

1. 定义特征
- 方法名与类名完全一致,无返回值(包括 void )。
- 不能被 static 、 final 等修饰符修饰。
2. 核心作用
- 创建对象时自动调用,用于初始化成员变量(如 new Person("张三", 20) )。
- 若未显式定义,编译器会生成无参默认构造函数;若自定义了构造函数,默认构造函数需手动添加。
3. 关键特性
- 支持重载(参数列表不同),满足不同初始化需求。
- 仅在对象创建时执行一次,无法像普通方法那样被多次调用。

Java值传递

Java中方法参数的传递方式只有“值传递”,即传递的是参数的副本,而非原变量本身:

1. 定义
- 当参数为基本类型(如 int 、 char )时,传递的是具体数值的副本,修改形参不会影响实参。
例:

void change(int num) {num = 100;} 
int a = 10;change(a); // a仍为10(形参修改不影响实参)


 
- 当参数为引用类型(如对象、数组)时,传递的是对象地址的副本,通过副本修改对象内部属性会影响原对象,但修改引用本身(如指向新对象)不会影响原引用。
例:
class Person {

int age;

}
void changeAge(Person p) {

p.age = 20;

} // 修改内部属性,影响原对象
void changeRef(Person p) {

p = new Person();

} // 修改引用,不影响原对象

带实际变量名的就会传递

2. 本质
- 无论参数类型如何,传递的都是“值的副本”:基本类型传数值副本,引用类型传地址副本。

总结

- 构造函数是对象初始化的“专属工具”,确保对象创建时处于有效状态;
- 值传递是Java参数传递的唯一方式,核心是“传递副本,不直接操作原变量”。

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

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

相关文章

电商项目_秒杀_架构及核心

秒杀架构设计先看下普通web项目架构&#xff1a; &#xff08;Nginx : 反向代理、负载均衡&#xff0c;一般是运维部分做生产搭建的时候配置好&#xff09;秒杀架构设计&#xff1a;和普通架构区别&#xff1a;原先由Web 服务或Nginx服务提供的静态资源放到了CDNNginx的职责放⼤…

4x4矩阵教程

4x4矩阵教程 1. 简介 四维矩阵是计算机图形学和3D变换中的重要工具&#xff0c;用于表示三维空间中的仿射变换。本教程将介绍如何使用C实现四维矩阵的基本运算和变换。 2. 代码实现 2.1 头文件 (matrix4x4.h) #ifndef MATRIX4X4_H #define MATRIX4X4_H#include <array> #…

Oracle 数据库共享池与大池调优指南

在 Oracle 数据库的内存管理中&#xff0c;共享池&#xff08;Shared Pool&#xff09;和大池&#xff08;Large Pool&#xff09;是 SGA&#xff08;系统全局区&#xff09;中负责缓存与资源分配的核心组件。合理配置和调优这两个池&#xff0c;能显著提升数据库性能 —— 尤其…

C# Lambdab表达式 Var 类

Lambdab 是用于创建一个方法的表达式Func<参数1类型, 参数2类型, 返回值类型> fnName >(参数1 参数2) {方法代码体}Func<int, int, bool> fnName (int a, int b) > {return a > b; };//调用时和普通方法一致 Console.WriteLine(fnName(10,20)); // false…

【Python】常见模块及其用法

文章目录1. 什么是模块和包&#xff1f;2. 常见的模块及其用法2.1 time概览2.1.1 时间获取方法2.1.2 时间格式化与解析2.1.3 程序计时与延迟2.1.4 时间转换2.2 random概览2.2.1 基本随机数2.2.2 随机整数2.2.3 序列操作2.2.4 概率分布2.2.5 随机种子2.2.6 状态管理2.3 os概览2.…

洛谷 P3478 [POI 2008] STA-Station

【题目链接】 洛谷 P3478 [POI 2008] STA-Station 【题目考点】 1. 树形动规&#xff1a;换根动规 换根动规&#xff0c;又名二次扫描法&#xff0c;一般是给一颗不定根树&#xff0c;通过两次扫描来求解。 我们可以先任选一个根结点root&#xff0c;通过树形动规的思想计算…

【爬虫】03 - 爬虫的基本数据存储

爬虫03 - 爬虫的数据存储 文章目录爬虫03 - 爬虫的数据存储一&#xff1a;CSV数据存储1&#xff1a;基本介绍2&#xff1a;基本使用3&#xff1a;高级使用4&#xff1a;使用示例二&#xff1a;JSON数据存储1&#xff1a;基础json读写2&#xff1a;字符串和对象的转换3&#xff…

深入分析计算机网络数据链路层和网络层面试题

计算机网络体系结构1. 请简述 OSI 七层模型和 TCP/IP 四层模型&#xff0c;并比较它们的异同。OSI 七层模型&#xff1a;应用层&#xff1a;直接为用户的应用进程提供服务&#xff0c;如 HTTP&#xff08;超文本传输协议&#xff0c;用于 Web 浏览器与服务器通信&#xff09;、…

云服务器新装的mysql8,无法通过远程连接,然后本地pymysql也连不上

阿里云服务器&#xff0c;用apt-get新装的mysql-server&#xff0c;竟然无法通过远程连接到&#xff0c;竟然是这个原因。不是防火墙&#xff0c;iptables早就关了。也不是安全组&#xff0c;不是人为限制访问的话&#xff0c;根本没必要弄安全组 排查过程 netstat -antop|grep…

质量即服务:从测试策略到平台运营的全链路作战手册

&#xff08;零&#xff09;为什么需要“质量即服务” 当业务方说“今晚一定要上线”&#xff0c; 当开发说“我只改了两行代码”&#xff0c; 当运维说“回滚窗口只有 5 分钟”&#xff0c; 质量必须像水电一样随取随用&#xff0c;而不是上线前的大坝泄洪。 这篇手册提供一张…

Java -- 自定义异常--Wrapper类--String类

自定义异常&#xff1a;概念&#xff1a;当程序中出现了某些错误&#xff0c;但该错误信息并没有在Throwable子类中描述处理&#xff0c;这个时候可以自己设计异常&#xff0c;用于描述该错误信息。步骤&#xff1a;1. 定义类&#xff1a;自定义异常类名&#xff08;程序员自己…

一文速通《线性方程组》

目录 一、解题必记知识点 二、解题必备技巧 三、非齐次线性方程组求解 四、齐次线性方程组求解 ★五、解析题目信息&#xff0c;获取暗含条件 一、解题必记知识点 (1) (2)基础解系线性无关&#xff0c;基础解系 解空间的一个基&#xff0c;基 一组线性无关的、能够生…

【Django】DRF API版本和解析器

讲解 Python3 下 Django REST Framework (DRF) API 版本控制解析器&#xff08;Parser&#xff09;一、DRF API 版本控制详解 API 版本控制是构建健壮、可维护的 RESTful API 的关键&#xff0c;尤其在项目演进中需要兼容不同版本的客户端请求。 1.1 API 版本控制的核心原理 AP…

Windows系统暂停更新工具

功能说明 暂停更新至2999年恢复系统更新彻底禁用更新&#xff08;不可逆&#xff09; 使用方法 下载解压后双击运行 .bat 文件 输入数字选择功能&#xff1a; 输入 1&#xff1a;暂停更新至2999年&#xff08;推荐&#xff09;输入 2&#xff1a;恢复系统更新输入 3&#xf…

git push新版问题解决

git 好像不能通过username:password的方式来git push了。但我的电脑依然弹出username和password的弹窗。转战ssh来git push。由于之前是用git clone克隆的&#xff0c;需要再转换成ssh的url来git push。

PyCharm + AI 辅助编程

PyCharm AI&#xff1a;初学者友好的 2 个实用场景&#xff08;附操作步骤&#xff09; PyCharm 专业版&#xff08;或通过插件集成&#xff09;支持 AI 辅助编程&#xff08;如 JetBrains AI 或 GitHub Copilot&#xff09;&#xff0c;能根据代码上下文自动生成代码、解释逻…

疯狂星期四文案网第15天运营日记

网站运营第15天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 昨日访问量 昨天只有20来ip, 太惨了&#xff0c;感觉和最近没有发新段子有关&#xff0c;也没有发新的外链&#xff0c;不知道这周四会怎么样 昨日搜…

如何解决pip安装报错ModuleNotFoundError: No module named ‘Cython’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘Cython’问题 摘要 在使用 PyCharm 控制台或命令行执行 pip install Cython 时&#xff0c;常会遇到 ModuleNotFoundError: No module named Cython 的报错。本…

freertos任务调度关键函数理解 vTaskSwitchContext

void vTaskSwitchContext(void) {//my_printf( "uxSchedulerSuspended %d\n", uxSchedulerSuspended );/* 调度器处于挂起状态 */if (uxSchedulerSuspended ! (UBaseType_t)pdFALSE) {/*** The scheduler is currently suspended - do not allow a context* switch.…

CPU 密集型 和 I/O 密集型 任务

文章目录**CPU 密集型任务&#xff08;CPU-bound&#xff09;**定义&#xff1a;特点&#xff1a;常见场景&#xff1a;如何优化 CPU 密集型任务&#xff1a;**I/O 密集型任务&#xff08;I/O-bound&#xff09;**定义&#xff1a;特点&#xff1a;常见场景&#xff1a;如何优化…