Java 只有传值

总结:Java传递所有参数都是使用传值的方式,没有什么传引用,也没有什么传地址。

首先我们需要理解几个常用的名词:对象、实例、引用、变量

1)对象:其实也就是实例,我们经常这样定义类的实例为对象。在Java中对象就是一个 new Object() 过程中所创建的内存空间(系统的栈中),然而他的返回值并不是对象本身,只是对象的一个引用,这个引用会在堆中分配唯一的空间,有的人就叫他为地址,我的理解是:可以认为这是对象的地址,也可以认为他是对象的ID,不过有一点必须确定:他是不可改变的(静态)(C++中地址是可以通过运算改变的,所以有传址一说)。

2)实例:就是对象。

3)引用:对象在Java中是不能够直接获取的,他是一个内存空间,我们只能通过引用间接获取再来修改他的内容。对象的引用其实就是一个指向这个对象内存的值。 Object obj = new Object(); 那么 obj的值 就是一个 new Object() 的引用。变量接收的值就是引用。

4)变量:可分为基础类型变量和引用类型变量,基础类型变量就是基本数据类型的变量,引用类型的变量就是引用类型的的变量。Object obj;那么obj就是一个变量,给他赋的值就是一个引用,引用具体指向了对象。

5)一个对象可以有多个引用,因为一个对象都只有一份内存空间,所以对象所有的引用都是相同的,从而,通过一个引用改变了对象会导致其他引用也发生改变。

6)为一个变量赋值就是为这个变量指定一个引用, 这个变量通过这个引用就可以找到对应的对象,那么引用是变量与对象的桥梁。变量赋值只是让这个变量指向一个引用,因此不可能改变引用所指向的对象本身。首先明确一点Java中对象的地址是不可能改变的,那么我们只能改变这个对象的内容,修改内容必须通过引用间接修改,所以,只能是通过变量获取引用后对值修改才能改变对象的内容。

程序如下:

Object obj1 = new Object();

// 变量与变量之间赋值其实就是把引用传递给变量,并不是变量指向变量,所以,变量之间赋值只是改变变量对引用的具体指向

Object obj2 = obj1;

Object obj3 = obj1;

Object obj4 = new Object();

// 改变obj3变量的指向,但是他不会影响他之前指向的对象,同时obj1还是指向原来的对象

obj3 = obj4;

最后:

回到正题,Java中为什么就只有传值没有传址呢?无论是变量赋值还是方法中传参,都是一样的只是传值,这个值就是引用。因为把引用传入给其他变量,从而其他变量也可以修改对应的对象。方法中传参也是一个道理。总之:想要修改一个对象的内容,必须是通过引用改变对象的属性值,而不能通过为变量赋值改变内容,为变量赋值只是改变变量的具体引用指向。只要明白,赋值的过程是改变变量所指向的引用对象而不是对象的副本。

另外,关于原始类型变量的传值就不多说了,这个都知道。

时间: 2024-10-28 12:10:17

Java 只有传值的相关文章

java中传值及引伸深度克隆的思考(说白了Java只能传递对象指针)

java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配,一种是在堆栈中分配,所有new出来的对象都是在堆中分配的,函数中参数的传递是在栈中分配的.通常情况下堆的内存可以很大,比如32位操作系统中的虚拟内存都可以被堆所使用(当内存紧张的时候甚至硬盘都可以是堆的存储空间),而堆栈的内存分配是有限的. 这和c++中内存分配差不多(c++中还要有另一种方式用于全

Java是传值还是传引用?

(#)背景  最近收到以前学弟提出的疑问,就是java到底传的是引用还是值(按他的说法形参和实参),其实本来不像解释的,因为我觉得这是一个很简单的概念,当你看见的东西解释 不了的时候,你应该做的就是这些数据在java内存中的表现是什么呢,所以我给他的建议就是去看看这些在内存中都是什么样的,今天来自己解释一下吧 (#)例子 看了上面的小例子,首先你会觉得这个到底传的是什么呢?值好像也不全是,引用好像也解释不了,其实这个时候就很简单了,我们分析一下二者内存结构, (1)对于int这种基本类型,我们知

【转载】Java是传值还是传引用

1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value).这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Test.java * @author fancy */ public class Test { public static void test(boolean test) { test = ! test; System.out.println("In test(boolean) : test = &q

Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)

勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题: Is Java “pass-by-reference” or “pass-by-value”? 翻译成中文: Java是传值还是传引用? 请先不要看下面的内容,思考10秒后,在继续阅读!!! 为什么建议先思考,在阅读内容呢? 我们每天可能会利用碎片化的时间阅读很多内容,有很多信息和知识其实在大脑

一道 Java 方法传值面试题——Java方法传值的值传递概念和效果 + Integer 缓存机制 + 反射修改 private final 域

原题代码如下: 1 public void test1() { 2 int a = 1, b = 2; 3 System.out.println("before: a=" + a + ", b=" + b); 4 swap1(a, b); 5 System.out.println("after: a=" + a + ", b=" + b); 6 } 7 8 private void swap1(int i1, int i2)

java 参数传值

基本数据类型参数的传值,参数为基本数据类型 class Computer{ int add(int x,int y){ return x+y; } } public class Example4_6 { public static void main(String args[]){ Computer com = new Computer(); int m = 100; int n = 200; int result = com.add(m,n); System.out.println(resul

Java方法 传值方式

这个问题是面试的时候经常会问到的一道题吧?这次做项目的过程中,其中一个同学因为无用了,导致了一个bug,不过是在提测前啦!本来我想借着这次机会分享一下java方法传参的机制,但是经过几天的学习,了解,发现网上的博客基本上没有一篇能让人看后就清清楚楚的明白的,讲的都很囫囵吞枣.觉得要要真正把这个问题说明白还真的不是一件容易的事?要了解jvm的堆栈和堆,以及java中的引用和赋值的含义.我现在也不能清楚的讲明白,但现在应该不会误用了,就是方法调用,知道怎样做可以改变传递参数的值,怎样做是不会改变传递

Java:传值还是传引用?

这是一个Java的经典问题,大部分人从C,C++语言入门,C语言有三种传递方式:值传递,地址传递和引用传递.详细的对C语言指针,引用的我个人的理解,见链接. Java所有操作都是传值操作!都是传值操作!都是传值操作!重要的事情说三遍. 疑问?那为什么别人讲的时候都是说,java的基本数据类型都是传值,所有的自定义数据(类的对象)都是传引用?? 很简单,因为这样好理解,意思是说:"同学们,如果我们把一个基本数据类型的值(变量)传递给一个函数的形参,那么无论我们对这个变量怎么操作,函数运行完之后,并

Java中传值和传引用

今天看了Java中的传值和传引用,对于这一块开始的时候不太能理解,通过查阅其他几篇blog,将自己的理解记录下来: 比较好的几篇blog:http://blog.csdn.net/houpuhope/article/details/7449377; 首先对于传值和传引用需要有一个初步的理解就是,通过传值的方式传进来的参数修改了,对原变量并没有什么影响: 而,通过传引用的方式修改的,原变量值也跟着改变.下面进行详细的解析: 1.对于基本类型Java是按照传值传递的: public class Te