在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对象将列表传递到视图中。下面是一...
《java设计模式之禅》是一本深入浅出讲解Java设计模式的书籍,作者希望无论读者的编程能力如何,都能从中有所收获。初级程序员可以学习如何编写优秀代码,高级程序员可以全面理解设计模式及Java的高级技巧,而顶级...
相比之下,`response.sendRedirect("转的页面")`是Java Servlet API中的一个方法,它会告诉浏览器发送一个新的GET请求到指定的URL。这是一个客户端的跳转,服务器返回一个HTTP状态码302(暂时重定向)和Location头,...
在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. **获取系统签名文件**:首先,你需要获取...
- 一旦将Java对象暴露给了JavaScript,就可以在网页的JavaScript代码中调用相应的方法,传递参数并接收回调。 ```javascript window.android.doSomethingInAndroid('Hello from JS!'); ``` 4. **Android调用...
CONSTRAINT PK_BLOB_FIELD PRIMARY KEY (ID) ); ``` 这里有一个CLOB字段`CLOB_COL_VALUE`,但题目主要关注BLOB字段的操作,所以我们假设也有一个对应的BLOB字段。 接着,我们创建一个Java实体类`BlobField`来映射...
--字符串比较,实际上比较的是每个字符的AscII值,与在Java中字符串的比较是一样的 14、select ename, sal from emp where sal between 800 and 1500; --(between and过滤,包含800 1500) 15、select ename, ...