在Java
中,为类的方法传递参数时,本身的传递机制是按址传递,还是按值传递?
//:
按值传递与按址传递测试类
Test1.java
public
class
Test1 {
public
static
void
main(String[] args) {
User t =
new
User();
t.setUserId(0);
t.setUsername(
"0"
);
t.setPassword(
"0"
);
System.
out
.println(
"User=>Bef
Id:"
+t.getUserId()+
"\tname:"
+t.getUsername()+
"\tpassword:"
+t.getPassword());
change
(t);
System.
out
.println(
"User=>Aft
Id:"
+t.getUserId()+
"\tname:"
+t.getUsername()+
"\tpassword:"
+t.getPassword());
}
public
static
void
change(User t){
//
在此,
t
引用的地址没有改变
t.setUsername(
"00"
);
// t
的属性引用的地址改变了
t.setPassword(
"00"
);
}
}
/* Output:
User=>Bef
Id:0
name:0
password:0
User=>Aft
Id:0
name:00
password:00
*///:~
结论:按址传递
//:
按值传递与按址传递测试类
Test2.java
public
class
Test2 {
public
static
void
main(String[] args) {
int
t = 0;
System.
out
.println(
"int=>Bef
t:"
+t);
change
(t);
System.
out
.println(
"int=>Aft
t:"
+t);
}
public
static
void
change(
int
t){
//
在此,
t
引用的地址没有改变
t
=
1;
//
在此,
t
引用的地址改变了
}
}
/* Output:
int=>Bef
t:0
int=>Aft
t:0
*///:~
结论:按址传递
//:
按值传递与按址传递测试类
Test3.java
public
class
Test3 {
public
static
void
main(String[] args) {
Integer t = 0;
System.
out
.println(
"Integer=>Bef
t:"
+t);
change
(t);
System.
out
.println(
"Integer=>Aft
t:"
+t);
}
public
static
void
change(Integer t){
//
在此,
t
引用的地址没有改变
t
=
1;
//
在此,
t
引用的地址改变了
}
}
/* Output:
Integer=>Bef
t:0
integer=>Aft
t:0
*///:~
结论:按址传递
//:
按值传递与按址传递测试类
Test4.java
public
class
Test4 {
public
static
void
main(String[] args) {
String t =
"0"
;
System.
out
.println(
"String=>Bef
t:"
+t);
change
(t);
System.
out
.println(
"String
=>Aft
t:"
+t);
}
public
static
void
change(String t){
//
在此,
t
引用的地址没有改变
t
=
"00"
;
//
在此,
t
引用的地址改变了
}
}
/* Output:
String=>Bef
t:0
String=>Aft
t:0
*///:~
结论:按址传递
最终结论:
在
Java
中,为类的方法传递参数时,本身的传递机制是按址传递。那么,为什么打印的结果会不一样呢?主要是由赋值符号“
=
”造成的,众所周知,在
Java
中,一切都是对象,所以即便是个数字、字符,或者字符串,都被称为是对象。在
Java
中,规定的赋值(“
=
”)机制是按址传递,即将对象的地址赋给引用(即把对象的地址赋给“
=
”左侧的变量),所以每出现一次赋值语句,左侧变量的地址都会发生改变。既然这样,那么为什么在
Test2
、
3
、
4
中最后打印
t
的值时却没有改变呢?这就是程序本身的迷惑性造成的,其实
change
方法内部的
t
与该方法外的
t
不是一个引用,如果把
change
参数的
t
改为其他名字你就明白了,这就是故意用来迷惑不成熟的程序员的。在传递参数时,首先要新生成参数列表中的虚参变量,然后将传递的实参的对象地址赋给虚参,这样就完成了
Java
中的参数传递。
因此,当在一个方法内部改变方法外面的某个对象的值时,一定要注意“
=
”的迷惑性(“
=
”只传址,不传值
)。
总之一句话,在
Java
中传的都是地址,不是值
!
分享到:
相关推荐
在Java开发中,定时任务是常见的需求,用于执行某些周期性的操作,例如数据同步、日志清理等。Spring框架提供了一种灵活的方式来实现定时计划,通过集成Quartz库可以方便地创建和管理这些任务。下面将详细介绍如何在...
在本文中,我们将详细介绍SpringMVC的ModelAndView传值方法,包括将列表、单个值、Map对象和复杂对象传递到视图中。 1. 将列表传递到视图中 在SpringMVC中,可以使用ModelAndView对象将列表传递到视图中。下面是一...
页面之间的值传递 - **Request参数**: 通过URL传递。 - **Session**: 在整个会话期间保存数据。 - **Application**: 在整个Web应用期间保存数据。 ##### 23. 获取sessionID 使用`()%>`。 ##### 24. 使用Cookie...
Java聊天室是一个基于Java编程语言开发的多人在线交流平台,它的设计目标是支持多人互动交流,同时具备多种实用功能,并且拥有良好的界面设计。该平台的实现涉及了网络编程、图形用户界面设计、多线程处理、事件驱动...
《java设计模式之禅》是一本深入浅出讲解Java设计模式的书籍,作者希望无论读者的编程能力如何,都能从中有所收获。初级程序员可以学习如何编写优秀代码,高级程序员可以全面理解设计模式及Java的高级技巧,而顶级...
相比之下,`response.sendRedirect("转的页面")`是Java Servlet API中的一个方法,它会告诉浏览器发送一个新的GET请求到指定的URL。这是一个客户端的跳转,服务器返回一个HTTP状态码302(暂时重定向)和Location头,...
毕业设计&课设_ 健身房管理系统 Java 后端,含多种功能模块,代码完整开源 近年来,随着人们健康意识的提升,健身已成为越来越多人日常生活的一部分,健身房成为了热门的公共场所之一。在这样的背景下,对于健身房...
作业分为三个部分,首先是用Java实现LCR和HS算法,接着对这两个协议进行实验验证其正确性和效率,最后完成详细的报告。文中详细规定了各部分的具体要求以及最终提交的规范,比如所有提交材料压缩成zip格式、截止时间...
4. 表现层展示:通过SpringMVC将处理后的数据传递给前端,前端使用Cesium API将数据在三维地图上进行可视化展示。 5. 系统整合与测试:将数据接入、数据管理、业务逻辑和表现层整合在一起,进行系统级的测试,确保...
在Java中,23种设计模式被广泛应用于构建可复用、可维护的面向对象软件。这些模式按照其主要目的可以分为三大类:创建型、结构型和行为型。 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory ...
- Intent用于在Activity之间传递数据,例如从登录Activity跳转到答题Activity,Intent可以携带用户信息。 3. **数据管理**: - 题库数据通常存储在本地数据库(如SQLite)或通过网络API获取。SQLite提供了一个轻...
同时,客户端还需要处理好与服务端的数据交互,保证信息传递的准确性和安全性。 该云手机项目实现的多功能应用可能包括但不限于文件管理、应用管理、系统设置等功能。用户可以通过客户端与服务端的配合,进行文件的...
通过执行特定的命令行指令,你可以将APK、公钥证书和私钥传递给`signapk.jar`,它会生成一个新的已签名APK。 签名后的APK可以通过检查其MD5哈希值来验证。在描述中提到的"签名MD5:8D:DB:34:2F:2D:A5:40:84:02:D7:...
以上知识点涵盖了URI概念、HttpServlet的性质、Servlet生命周期方法、Servlet上下文范围、响应重定向、输出响应内容、传递请求参数以及Servlet映射配置等方面,这些都是JSP和Java Web开发的基础内容。理解并掌握这些...
OA系统通过调用这个接口,传递包括代办单据PK、用户PK、单据类型和主题等参数,然后将获取的数据展示在OA界面上。例如,通过Java代码调用NC服务接口: ```java String endpoint = ...
2. `sign.bat`会调用`signapk.jar`,并传递`testkey.x509.pem`和`testkey.pk8`作为证书输入。 3. `signapk.jar`读取ZIP刷机包,使用私钥对其进行签名,并保存已签名的版本。 4. 签名后的刷机包可以安全地安装在...
SpringBoot是一款基于Java的轻量级框架,它简化了创建独立的、生产级别的基于Spring的应用程序的过程。在这个项目中,SpringBoot被用来构建一个聊天应用,提供了随机匹配用户进行聊天的功能。这涉及到以下几个关键...
在这个上下文中,它可能是用来调用Java可执行文件(JAR)和传递必要的参数来签署APK的脚本。运行这个脚本将会执行签名过程。 2. **signapk.jar**:这是Android签名工具,它包含用于签署APK的Java代码。开发者或打包...
通常,你需要将APK文件、`platform.x509.pem`和`platform.pk8`作为输入传递给SignApk工具,然后它会生成一个新的已签名的APK。 将安卓应用修改为系统程序的过程如下: 1. **获取系统签名文件**:首先,你需要获取...
Spring Boot是一种流行的Java Web开发框架,它极大地简化了基于Spring的应用开发过程,特别是对于那些使用Spring技术栈的微服务架构。RabbitMQ是一个消息代理,它实现了高级消息队列协议(AMQP),用于在不同的应用...