- 浏览: 1112636 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
一、问题:
输出:
原因是:
只有非空的引用对象才可以传值。
二、Java是引用传递还是值传递?
通过上面可以看出,Java 是值传递。而传递的是一个引用。
“值传递”和“引用传递”的区别是什么?
在“一、问题”中,如果由于 String name = null;,此时根本没有值,
也就是没有产生新的对象。所以无法进行赋值。
那么,对于有值的情况呢?
下面这段代码的输出是什么?
答案:
AAA 。
当 "AAA" 被作为参数传递过来时,方法体中的局部变量 name 指向 "AAA",
然后 赋值运算符(=)把新的值 "BBB" 赋给了局部变量 name。
因为是值传递,只不过传递的值是一个地址。传递的是地址,就叫“地址引用”吗?
非也。何为“引用”?“引用”的目地是为了什么?显然,引用到地址,就是想要
对其修改。能够“引用”到地址,修改地址。这里的“引用”即为“修改”之意。
但是,Java方法体内并不会直接在传递过来的地址上对其做赋值或修改,
而是在方法体内生成局部变量(参数),指向这个地址。然后对局部变量进行操作。
即:方法体内,只能引用,无法修改。
只能引用参数的值(地址),而不能对这个值(地址)进行修改或赋值操作。
这里特别需要注意赋值运算符(=)所起的作用。
所以Java是值传递。无法修改或修改不了传递过来的参数的地址的指向。
Java is Pass by Value and Not Pass by Reference!
引用:
http://stackoverflow.com/questions/14017461/null-reference-in-java
http://www.journaldev.com/3884/java-is-pass-by-value-and-not-pass-by-reference
-
public void test(){ String name = null; setReference(name); if(name == null){ System.out.println("name is null"); } } private void setReference(String name){ name = "java"; }
输出:
// name is null
原因是:
只有非空的引用对象才可以传值。
二、Java是引用传递还是值传递?
package com.journaldev.test; public class Test { public static void main(String[] args) { Balloon red = new Balloon("Red"); Balloon blue = new Balloon("Blue"); swap(red, blue); System.out.println("red color="+red.getColor()); System.out.println("blue color="+blue.getColor()); foo(blue); System.out.println("blue color="+blue.getColor()); } private static void foo(Balloon balloon) { balloon.setColor("Red"); // refer to param. balloon = new Balloon("Green"); // refer to a new object. balloon.setColor("Blue"); } //Generic swap method public static void swap(Object o1, Object o2){ Object temp = o1; o1=o2; o2=temp; } } /* red color=Red blue color=Blue blue color=Red */
通过上面可以看出,Java 是值传递。而传递的是一个引用。
“值传递”和“引用传递”的区别是什么?
在“一、问题”中,如果由于 String name = null;,此时根本没有值,
也就是没有产生新的对象。所以无法进行赋值。
那么,对于有值的情况呢?
下面这段代码的输出是什么?
public void run(){ String name = "AAA"; setReference(name); System.out.println(name); } private void setReference(String name){ name = "BBB"; }
答案:
AAA 。
当 "AAA" 被作为参数传递过来时,方法体中的局部变量 name 指向 "AAA",
然后 赋值运算符(=)把新的值 "BBB" 赋给了局部变量 name。
因为是值传递,只不过传递的值是一个地址。传递的是地址,就叫“地址引用”吗?
非也。何为“引用”?“引用”的目地是为了什么?显然,引用到地址,就是想要
对其修改。能够“引用”到地址,修改地址。这里的“引用”即为“修改”之意。
但是,Java方法体内并不会直接在传递过来的地址上对其做赋值或修改,
而是在方法体内生成局部变量(参数),指向这个地址。然后对局部变量进行操作。
即:方法体内,只能引用,无法修改。
只能引用参数的值(地址),而不能对这个值(地址)进行修改或赋值操作。
这里特别需要注意赋值运算符(=)所起的作用。
所以Java是值传递。无法修改或修改不了传递过来的参数的地址的指向。
Java is Pass by Value and Not Pass by Reference!
引用:
http://stackoverflow.com/questions/14017461/null-reference-in-java
http://www.journaldev.com/3884/java-is-pass-by-value-and-not-pass-by-reference
-
发表评论
-
java 将文件夹所有的文件合并到指定的文件夹下
2020-06-30 19:17 1064场景:将文件夹所有的文件合并到指定的文件夹下 另外:如果想效 ... -
多线程-线程池的四种创建方式
2020-04-01 18:38 488多线程-线程池的四种创建方式 https://blog.cs ... -
Java基础之:nio
2019-11-13 15:38 484一、理论讲解: 史上最强Java NIO入门:担心从入门到放弃 ... -
Java 分布式之:RPC 基本概念
2019-11-13 15:07 462转载: https://www.jianshu.com/p/ ... -
Java之 volatile 关键字原理详解
2019-11-07 15:36 548一、什么是 volatile ? ... -
POI实现excell批注背景图片(仿html浮窗显示图片)
2019-10-21 08:17 692POI实现excell批注背景图片(仿html浮窗显示图片) ... -
Java之设计模式之 Observer 观察者
2019-07-04 17:21 1070观察者设计模式 Java 已经实现了该模式,并且提供了使用类 ... -
HashMap, LinkedHashMap and TreeMap
2019-03-01 11:04 680https://stackoverflow.com/a/177 ... -
Java lib 操作 excel 插入图片
2019-01-19 12:46 880https://poi.apache.org/componen ... -
数据库连接池C3P0
2018-05-29 16:50 897一、名字的由来 很多 ... -
Java8之集合(Collection)遍历 forEach()、stream()
2018-05-29 14:39 20750package java8.collections; ... -
Junit Vs main on "java.util.concurrent.Executors"
2017-11-10 16:44 815Same code with different result ... -
Java之大数据学习路线
2017-11-03 10:08 5722三个月大数据研发学习 ... -
Java中创建对象的5种方式
2017-10-26 14:21 842一、Java之5种创建对象的方式 ————————————— ... -
Log4j和Slf4j的比较
2017-06-23 12:41 1411一直搞不清 Log4j 和 SLF4j 的关系。今天才若有所 ... -
Java之Java7新特性之try资源句式
2017-04-20 14:58 5385Java之Java7新特性之try资源句式 一、【try资源 ... -
Java之 java.util.concurrent 包之ExecutorService之submit () 之 Future
2017-03-04 21:27 3834一、如何使用 ExecutorService.submit() ... -
Java之 java.util.concurrent 包之Executor与ExecutorService
2017-03-04 21:18 2704一、问题: execute() 与 submit() 的区别? ... -
JAVAEE之单用户登录
2017-02-05 11:55 1058单用户登录是系统中数据一直性的解决方案之一。 问题背景: 试 ... -
Java之多线程之线程池之线程重复使用
2017-02-04 13:33 5568一、问题背景 在使用多线程时,如果要开启一个任务,则就需要新 ...
相关推荐
JAVA与C#都是编程语言,它们是两个不同的方向的语言,虽然它们都是面向对象的语言,但它们有很多不同之处。本文将从命名空间、数据类型、变量命名、注释、输出、控制流语句、数组、方法传递参数、访问修饰符、继承、...
7. 在这个例子中,`change`方法的参数是传值引用,`str`和`ch`的原始对象分别是一个字符串和字符数组。改变`str`的引用不会影响实例变量`str`,而修改`ch`数组的元素会影响到原数组。因此,输出结果是`good and Abc`...
Java语言与C++语言在设计思想、语法特性以及内存管理等方面存在诸多差异,这些差异体现了两种语言的不同设计理念和应用场景。以下是对这些差异的详细说明: 1. 引用的初始化:Java的引用可以在声明后初始化,而C++...
构造函数的主要用途之一是在创建对象时设置初始状态或分配必要的资源。 - **结论**: D选项正确,因为上述所有关于构造函数的描述都是正确的。 **2. 异常处理机制** - **选项A**: 错误。catch部分捕捉到异常时,并...
- **null的作用**:用于表示对象引用未初始化或被显式设置为空。 - **NullPointerException**:当尝试访问null引用的对象成员时会抛出该异常。 #### 12. Java中Comparable与Comparator的区别 - **Comparable接口**...
ORM:使用元数据信息来描述对象和数据库之间的关系,并且能够自动实现java中持久化对象到关系型数据库中表的映射 脏检查:自动对缓存中的数据进行检查,并且选择在合适的时机和数据库之间进行交互,以保持数据的...
而JSON由于其结构与JavaScript的对象语法相似,因此成为了AJAX传输数据的理想选择。 在"JSon转换,Sturs2的AJAX的应用"这个主题中,我们可能会讨论以下知识点: 1. JSON格式:JSON格式由键值对组成,键用引号包围...
首先,JavaScript的基本语法与C++和Java类似,它是一种解释型的、弱类型的、基于原型的语言。学习JavaScript首先要了解变量声明(var、let、const)、数据类型(包括基本类型:字符串、数字、布尔、null、undefined...
这种方法尤其适用于大型项目,可以避免很多难以追踪的编译错误。 #### 8. 在堆上分配内存 **在堆上分配内存**是动态内存分配的一种方式。在C/C++中,可以使用`malloc`或`new`来分配内存空间,但在使用完毕后需要...