Java——参数传递
写这篇文章时,其实还是不理解Java中的参数传递只有传值没有传址(传引用)。这里引用知乎上大神的讲解来记录一下。
一、基本类型和引用类型
int num = 10;
String str = "hello";
num是基本类型,num的值直接保存在变量中,变量保存在哪里呢?
str是引用类型,变量中保存的是实际对象的地址,这种变量为“引用”,引用指向实际对象,实际对象中保存着内容。
二、赋值运算符(=)
num = 20;
str = "java";
赋值操作有两个含义:
1)放弃原有的值或引用
2)得到=右侧变量的值或者引用
基本类型num,赋值运算符会直接改变变量的值,原值被覆盖
引用类型str,赋值运算符会改变引用中保存的地址,原来的地址被覆盖掉,但是原来的对象不会被改变。比如,"hello"字符串对象没有被改变,如果没有被任何引用指向,该字符串对象就会被视为垃圾,就会被垃圾回收器回收。
三、调用方法的过程
参数传递基本上就是赋值操作
1基本类型:
void foo(int value)
{
value = 100;
}
foo(num);//num没有被改变
2未提供改变自身方法的引用类型:
void foo(String text)
{
text = "windows";
}
foo(str); //str也没有被改变
3提供了改变自身方法的引用类型
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder)
{
builder.append("4");
}
foo(sb); //sb被改变了,变成了“iphone4”
4提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder)
{
builder = new StringBuilder("ipad");
}
foo(sb);//sb没有被改变,还是"iphone"
3 4示例理解:
3图解:
4图解:
测试示例:
class Employee
{
public int age;
}
public class Main
{
public static void changeEmployee(Employee employeeY)
{
// employeeY = new Employee();
employeeY.age = 1000;
}
public static void main(String[] args)
{
Employee employee = new Employee();
employee.age = 100;
System.out.println(employee.age);
changeEmployee(employee);
System.out.println(employee.age);
}
}
如果不注释第9行的代码,输出为:
100
100
也就是employ的age并没有改变,这是为什么呢?
注释掉第9行代码,输出就是:
100
1000
这时候employee的age是改变了的,为什么呢?
疑问待求证!!
https://www.zhihu.com/question/31203609
Java——参数传递的更多相关文章
- Java 参数传递都是值传递
Java 参数传递都是值传递,验证代码如下 public class ParamTransferTest { public static void swap(int a, int b) { int t ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- 图解JAVA参数传递
今天做项目,发现了一个问题,当String作为参数传递的时候,在函数内部改变值对外部的变量值无影响,如下代码: public static void main(String[] args) { Str ...
- JAVA学习笔记之图解JAVA参数传递
今天做项目,发现了一个问题,当String作为参数传递的时候,在函数内部改变值对外部的变量值无影响,如下代码: public static void main(String[] args) { Str ...
- 浅谈Java参数传递机制
Java参数传递 才疏学浅,今天才知道Java中方法的参数是可以传递对象引用进去的. Java的参数传递机制很简单,其实就是值传递. 所谓值传递,也就是我们在给方法传递一个参数的时,传递的 ...
- 转:JAVA 参数传递
转自:http://blog.sina.com.cn/s/blog_5dd380b90100bvel.html 网络上有太多关于JAVA参数传递是传值还是传引用的讨论,其实大多是概念不清,混淆视听.从 ...
- java 参数传递是引用传递还是值传递?
JAVA的参数传递倒底是值传递还是引用传递,我觉得两种说法都没错,关键是看怎么理解“引用”和“引用传递”. (一)从编译原理的角度讲,所有那些无法通过形参来修改实参本身的传递机制都是“值传递”,在JA ...
- 【转】java参数传递(超经典)
原文网址:http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html Java中的参数传递机制一直以来大家都争论不休,究竟是“传值”还是“传址(传引用)” ...
- java 参数传递
由一个问题来引入参数传递的问题 public static void main(String[] args) { int x=1; int[] y =new int[10]; m(x,y); Syst ...
- java参数传递(值传递还是引用传递)
Java中的参数传递机制一直以来大家都争论不休,究竟是“传值”还是“传址(传引用)”,争论的双方各执一词,互不相让.不但“菜鸟”们一头雾水,一些“老鸟”也只知道结果却说不出所以然来.我相信看过下面的内 ...
随机推荐
- 信息竞赛进阶指南--Tire树
// 假设字符串由小写字母构成 int trie[SIZE][26], tot = 1; // Trie的插入 void insert(char* str) { int len = strlen(st ...
- HDU Problem D [ Humble number ]——基础DP丑数序列
Problem D Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
- P1522 牛的旅行 Cow Tours(floyd)
题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...
- rabbitmq启动时出错epmd error for host
centos7环境下新装rabbitmq,第一次启动时发现出错:ERROR: epmd error for host "****":XXXXXXX 检查发现当前机器的名称为 1 ...
- python-CSV格式清洗与转换、CSV格式列变换、CSV格式数据清洗【数据读入的三种方法】【strip、replace、split、join函数的使用】
1)CSV格式清洗与转换 描述 附件是一个CSV格式文件,提取数据进行如下格式转换: (1)按行进行倒序排列: (2)每行数据倒序排 ...
- windows脱密码总结
方式1:通过SAM数据库获得本地用户HASH sam文件:是用来存储本地用户账号密码的文件的数据库system文件:里面有对sam文件进行加密和加密的密钥 利用方式: 导出sam和system: re ...
- Nodejs异步编程
异步函数:异步函数是异步编程语法的终极解决方案,它可以把异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得更清晰. const fn = async () =>{}; async f ...
- STM32 外部中断详解(原理+配置代码)
本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 文章目录 1 前言 2 STM32的外部中断 3 中断服务函数的映射关系 4 外部中断的配置 5 寄存器的 ...
- JDBC04 PreparedStatement
PreparedStatement类 存在预编译,用占位符去填参数(参数索引从1开始算),可以防止SQL注入 try { Class.forName("com.mysql.cj.jdbc.D ...
- mysql数据库如何修改密码及权限分配
如何修改Mysql密码 Mysql用户密码采用md5加密函数加密(单向加密) SELECT PASSWORD('root'); -- *81F5E21E35407D884A6CD4A731AEBFB6 ...