关于Java中形参与实参的理解--java

本文详细探讨了Java中参数传递的机制,区分了值传递与引用传递的不同,并通过实例代码展示了基本类型与引用类型在方法调用时的行为差异。特别讨论了String及Integer等immutable类型在方法中的特殊处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递的区别)。参考网站http://www.cnblogs.com/binyue/p/3862276.html。下面我将通过次博文记录自己的理解,还望能够帮助再学Java或者复习Java的朋友们。

 

一、基本类型与引用类型在内存中的保存内容

Java中的变量分为基本类型和引用类型两种。基本类型的变量保存数值本身,而引用类型的变量保存的是引用值,即指向内存空间的地址。

基本类型包括:byte,char,int short,long,float,double,boolean;

引用类型包括:类类型,接口类型和数组。

二、基本类型与引用类型的区别

*基本类型在声明其变量时就为它分配了空间:

1 int value; 
2 
3 value = 10;//正确,因为声明a时就分配了空间

*而引用不同,在进行引用的声明时只给变量声明了引用空间,而不分配数据空间:

 1 Date date;
 2 //执行实例化,开辟数据空间存放Date对象,然后把空间的首地址传给today变量 
 3 //date=new Date();
 4 //如果注释掉上一步操作
 5 //The local variable date may not have been initialized
 6 //也就是说对象的数据空间没有分配
 7 date.getDate();
 8 
 9 //初始化过程如下:
10 
11 Date a,b; //在内存开辟两个引用空间 
12 
13 a = new Date();//开辟存储Date对象的数据空间,并把该空间的首地址赋给a 
14 
15 b = a; //将a存储空间中的地址写到b的存储空间中

##:注意:引用也是占用空间,一个空对象的引用大小大概是4byte。

三、引用传递和值传递

*值传递:方法调用时,实际参数将它的值传递给对应的形式参数,函数接收到的是原始值的副本,此时内存中存在两个相等的基本类型,若方法中对形参执行处理操作,并不会影响实际参数的值。

*引用传递:方法调用时,实际参数的引用(是指地址,而不是参数的值)被传递给方法中相应的形式参数,函数接收到的是原始值的内存地址,在方法中,形参与实参的内容相同,方法中对形参的处理会影响实参的值。

 

具体代码如下:

 1 public class ReferencePkValue2 {
 2   public static void main(String[] args) {  
 3         ReferencePkValue2 t = new ReferencePkValue2();  
 4         int a=99;  
 5         t.test1(a);//这里传递的参数a就是按值传递  
 6         System.out.println(a);
 7          
 8         MyObj obj=new MyObj();  
 9         t.test2(obj);//这里传递的参数obj就是引用传递
10         System.out.println(obj.b);
11     }  
12   public void test1(int a){  
13         a=a++;
14         System.out.println(a);
15     }  
16     public void test2(MyObj obj){  
17         obj.b=100;
18         System.out.println(obj.b);
19     } 
20 }

输出的结果是:

100

90

100

100

* 这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们都是immutable类型,
因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待,可以认为是和基本数据类型相似,传值操作。

 

四、结论

1)形参为基本类型时,对形参的处理不会影响实参。

2)形参为引用类型时,对形参的处理会影响实参。

3)String,Integer,Double等immutable类型的特殊处理,可以理解为值传递,形参操作不会影响实参对象。

 

转载: https://www.cnblogs.com/calence/p/5346672.html

<think>首先,用户的问题是关于Java式参数实际参数的区别与联系的。用户说:“我想理解Java式参数实际参数的区别与联系”,并请求“Java 式参数与实际参数区别 示例说明”。 我需要根据系统级指令来构建回答: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户提供的引用包括: - 引用[1]: 解释了显式参数(即实际参数)隐式参数(在Java中,隐式参数通常指this引用,但用户的问题是关于式参数实际参数的)。 - 引用[2]: 详细说明了式参数实际参数的区别,包括调用时如何匹配。 - 引用[3]: 提到了newInstance方法中的参数问题。 - 引用[4]: 是关于JVM参数配置的,似乎不直接相关。 用户的问题焦点是式参数(formal parameters)实际参数(actual parameters)的区别与联系。在Java中: - 式参数(formal parameters)是方法定义中声明的变量。 - 实际参数(actual parameters)是方法调用时传递的值。 引用[1][2]直接相关: - 引用[1]说:“显式参数(Explicit Parameters):提供了方法执行所需的具体值。它们是在方法调用时明确传递给方法的参数。”这对应于实际参数。 - 引用[2]说:“调用的时候,传入的实际参数的个数,类型与位置都要与式参数一一对应,不然编译器会报错。” 在回答中,我需要自然地引用这些。例如,在解释时,在相关部分添加[^1]或[^2]。 回答结构: 1. **清晰介绍**:解释式参数实际参数的概念。 2. **区别与联系**:列出关键点。 3. **示例说明**:提供代码示例来演示。 4. **总结**:简要总结。 5. **生成相关问题**:根据系统指令,生成相关问题。 生成相关问题:系统指令要求“生成相关问题”,所以我需要在回答结束时添加相关问题。例如: - 相关问题可以包括Java参数传递机制、参数类型匹配等。 使用中文回答:整个回答必须用中文。 LaTeX:如果涉及数学表达式,使用$...$或$$...$$。但在这个主题中,可能没有太多数学内容。或许在解释类型匹配时,可以用数学符号,比如类型一致性。但避免强制使用;只在自然时使用。 例如: - 如果提到参数类型必须匹配,可以用$T_{\text{actual}} = T_{\text{formal}}$,但可能不必要。保持简单。 现在,构建回答大纲: 1. **引言**:定义式参数实际参数。 - 式参数:方法定义中的参数。 - 实际参数:方法调用时传递的值。 - 引用[1][2]来支持。 2. **区别**: - 位置:式参数在方法签名中;实际参数在调用语句中。 - 作用:式参数是占位符;实际参数提供具体值。 - 匹配:实际参数的数量、类型顺序必须与式参数匹配。 3. **联系**: - 实际参数的值被传递给式参数。 - 在方法执行时,式参数持有实际参数的值。 4. **示例**: - 提供一个简单Java代码示例。 - 例如,一个方法add(int a, int b),调用时add(5, 10)。 5. **总结**:强调重要性。 6. **相关问题**:生成2-3个相关问题。 引用添加:在解释时,自然地添加引用。例如: - "如引用[1]所述,显式参数就是实际参数..."或直接在句子末尾加[^1]。 完整回答:</think>### Java 式参数与实际参数的区别与联系 在 Java 编程中,理解式参数(formal parameters)实际参数(actual parameters)是掌握方法调用机制的基础。下面我将逐步解释它们的区别与联系,并提供示例说明。内容基于可靠的 Java 规范实践知识,确保真实可靠。 #### 1. **基本概念** - **式参数(Formal Parameters)**: 这是方法定义时声明的参数,位于方法签名中。式参数充当占位符,定义了方法所需的输入类型名称。它们在方法内部作为局部变量使用,但只在方法被调用时才接收具体值。 *例如,在方法 `void printSum(int a, int b)` 中,`a` `b` 就是式参数。* - **实际参数(Actual Parameters)**: 这是方法调用时传递的具体值或表达式,位于调用语句中。实际参数提供了方法执行所需的真实数据,其值会被赋给式参数。 *例如,调用 `printSum(5, 10)` 时,`5` `10` 就是实际参数。* 如引用[1]所述:“显式参数(Explicit Parameters)提供了方法执行所需的具体值,它们是在方法调用时明确传递给方法的参数”[^1]。 两者的核心联系在于:实际参数的值在调用时被传递给式参数,使得方法能使用这些值进行计算或操作。这确保了方法逻辑的通用性重用性。 #### 2. **区别详解** 以下是式参数与实际参数的关键区别,基于 Java 的语法规则: | 方面 | 式参数 | 实际参数 | |------|----------|----------| | **定义位置** | 在方法签名中声明(例如:`int add(int x, int y)`)。 | 在方法调用语句中传递(例如:`add(3, 4)`)。 | | **作用** | 定义方法所需的输入类型名称,作为占位符。 | 提供具体的值或对象引用,用于初始化式参数。 | | **生命周期** | 只在方法执行期间存在,方法结束后销毁。 | 在调用语句中计算后,其值被复制给式参数;实际参数本身可能来自变量或表达式。 | | **匹配要求** | 必须声明类型(如 `int`、`String`),但无需具体值。 | 实际参数的数量、类型顺序必须与式参数严格匹配,否则编译器报错。如引用[2]强调:“调用的时候,传入的实际参数的个数,类型与位置都要与式参数一一对应”[^2]。 | | **示例说明** | 在方法定义中:`void greet(String name, int age)`,`name` `age` 是式参数。 | 在调用中:`greet("Alice", 25)`,`"Alice"` `25` 是实际参数。 | 关键点: - 式参数是方法设计的一部分,关注“需要什么”;实际参数是调用时的实现,关注“提供什么”。 - 类型匹配必须精确:如果式参数是 `int`,实际参数必须是整数类型(如 `int` 或兼容的数值),不能是 `String`。这可以用类型一致性表示:设式参数类型为 $T_{\text{formal}}$,实际参数类型为 $T_{\text{actual}}$,则必须满足 $T_{\text{actual}} \subseteq T_{\text{formal}}$ 或通过类型转换兼容[^3]。 - 引用[3]指出:如果匹配失败,会抛出 `IllegalArgumentException`,例如当“实际参数式参数的数量不同”时[^3]。 #### 3. **联系分析** 式参数实际参数的联系体现在数据传递协作中: - **值传递机制**:在 Java 中,方法调用采用值传递(pass-by-value)。实际参数的值被复制到式参数中。对于基本类型(如 `int`),式参数获得的是副本;对于对象引用,式参数获得的是引用的副本(即指向同一对象)。 *例如:* ```java void updateValue(int formalParam) { formalParam = 100; // 修改式参数,不影响实际参数 } public static void main(String[] args) { int actualParam = 50; updateValue(actualParam); System.out.println(actualParam); // 输出 50(值未变) } ``` - **协作实现方法功能**:实际参数提供数据来源,式参数在方法内部使用这些数据。这确保了方法的抽象性——同一方法可以处理不同的实际参数。 - **错误处理**:如果联系中断(如类型不匹配),编译器在编译时报错;运行时问题(如 `NullPointerException`)可能由实际参数引发。 #### 4. **完整示例说明** 下面是一个 Java 程序,演示式参数与实际参数的区别与联系。代码包含注释以逐步解释。 ```java public class ParameterDemo { // 方法定义:式参数为 name (String) score (int) public static void printInfo(String name, int score) { System.out.println("Name: " + name); // name 是式参数,接收实际参数的值 System.out.println("Score: " + score); // score 是式参数 } public static void main(String[] args) { String studentName = "张三"; // 实际参数的来源变量 int studentScore = 95; // 实际参数的来源变量 // 方法调用:实际参数为 studentName studentScore printInfo(studentName, studentScore); // 输出: Name: 张三, Score: 95 // 另一个调用:实际参数为直接值 printInfo("李四", 88); // 输出: Name: 李四, Score: 88 // 错误示例:如果类型不匹配(如 printInfo(100, "test")),编译器报错 } } ``` **解释**: - 在 `printInfo` 方法中,`name` `score` 是式参数。 - 在 `main` 方法中,`studentName` `studentScore` 是实际参数(变量式),而 `"李四"` `88` 是实际参数(字面值式)。 - 调用时,实际参数的值被传递给式参数:例如,`studentName` 的值 "张三" 赋给式参数 `name`。 - 如果尝试不匹配的调用(如 `printInfo(100, "test")`),编译器会报错,因为实际参数类型与式参数不兼容,体现了引用[2]的规则[^2]。 #### 5. **总结** 式参数实际参数是 Java 方法调用的核心概念:式参数定义方法接口,实际参数提供具体数据。它们的区别在于定义位置作用,而联系在于值传递协作执行。正确匹配两者是避免编译错误确保程序健壮性的关键。如引用[1]所述,这种机制使方法能灵活处理不同输入[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值