文档章节

Java 只有传值

learn_more
 learn_more
发布于 2014/12/09 11:35
字数 990
阅读 150
收藏 6

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

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


© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
java中值传递的理解,C++中传值传递、引用传递和指针方式的理解

通过对参考文献中两篇文章的理解消化,自己运行测试分析总结如下: java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { Stri...

Nob
2014/09/20
0
1
JVM基础:深入学习JVM堆与JVM栈

以前堆是干啥栈是干啥都知道,就是没连在一起想想。感觉讲的不错的一篇儿~~JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在...

李星
2014/06/04
0
0
SpringMVC之接收请求参数和页面传参

Spring接收请求参数 1,使用HttpServletRequest获取 Java代码 @RequestMapping("/login.do") public String login(HttpServletRequest request){ String name = request.getParameter("name")......

白志华
2015/09/23
0
0
三大java技术牛人齐聚广州传智播客——超强师资,超低价格,超深课程,超真项目

三大java技术牛人齐聚广州传智播客——超强师资,超低价格,超深课程,超真项目 中国的软件教育已经坑害了不少软件工程师苗子,传智播客自成立之日起就立志于改变中国的软件教育。随着传智播...

传智播客java.net培训
2010/03/02
281
1
java编程学习常见面试题及答案

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
2018/05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Taro ScrollView 组件的 scrollTop 属性是个坑

官方issue:ScrollView设置scrollTop没效果 同样的,设置 scrollTop=0 并不能实现置顶,官方回复早就修复了,我的 Taro 版本已经是最新的,然而并未修复。 万能的评论区,给出了失效的原因。...

dkvirus
25分钟前
1
0
Qt那些事0.0.21

这次还是关于PRO文件中QMAKE_POST_LINK的故事。 平时都是使用VS2015作为编译器,恰巧想用MinGW编一版程序,结果偏偏出现了错误。话说测试的这个项目可是在Linux下(fodera 20)可以正确编译通...

Ev4n
35分钟前
0
0
OSChina 周六乱弹 —— 抖音外放 亲妈下葬。

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :一直没想明白黎明是怎么混进「四大天王」的,直到最近网易云音乐心动模式开启之后 #今日歌曲推荐# 《那有一天不想你》- 黎明 手机...

小小编辑
今天
337
8
Linux使用源码包安装软件

前言: 最近整理一些以前的学习笔记。 过去都是存储在本地,此次传到网络留待备用。 源码包 Linux软件多数免费、开源,是开发人员编写的,具有很强可读性的一组相关代码文本。 源码包 --> 编...

迷失De挣扎
今天
6
0
IPv4如何转换为IPv6?

ipv6已经逐渐在应用,现在已经有很多的运营商支持ipv6,前天我们也发布了如何让电脑使用ipv6地址?有很多朋友在问?ipv6有什么作用,它的表示方式是什么,今天我们来一起来详细了解下ipv6相关计...

xiangyunyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部