Java——参数传递

 写这篇文章时,其实还是不理解Java中的参数传递只有传值没有传址(传引用)。这里引用知乎上大神的讲解来记录一下。

一、基本类型和引用类型

1 int num = 10;
2 String str = "hello";

                 

num是基本类型,num的值直接保存在变量中,变量保存在哪里呢?

str是引用类型,变量中保存的是实际对象的地址,这种变量为“引用”,引用指向实际对象,实际对象中保存着内容。

二、赋值运算符(=)

1 num = 20;
2 str = "java";

                    

赋值操作有两个含义:

1)放弃原有的值或引用

2)得到=右侧变量的值或者引用

 基本类型num,赋值运算符会直接改变变量的值,原值被覆盖

引用类型str,赋值运算符会改变引用中保存的地址,原来的地址被覆盖掉,但是原来的对象不会被改变。比如,"hello"字符串对象没有被改变,如果没有被任何引用指向,该字符串对象就会被视为垃圾,就会被垃圾回收器回收。

三、调用方法的过程

参数传递基本上就是赋值操作

1基本类型:

1 void foo(int value)
2 {
3          value = 100;
4 }
5 foo(num);//num没有被改变

2未提供改变自身方法的引用类型:

1 void foo(String text)
2 {
3        text = "windows";
4 }
5 foo(str); //str也没有被改变

3提供了改变自身方法的引用类型

1 StringBuilder sb = new StringBuilder("iphone");
2 void foo(StringBuilder builder)
3 {
4       builder.append("4");
5 }
6 foo(sb); //sb被改变了,变成了“iphone4”

4提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符

1 StringBuilder sb = new StringBuilder("iphone");
2 void foo(StringBuilder builder)
3 {
4      builder = new StringBuilder("ipad");
5 }
6 foo(sb);//sb没有被改变,还是"iphone"

3 4示例理解:

3图解:

4图解:

测试示例:

 1 class Employee
 2 {
 3     public int age;
 4 }
 5 public class Main
 6 {
 7     public static void changeEmployee(Employee employeeY)
 8     {
 9 //        employeeY = new Employee();
10         employeeY.age = 1000;
11     }
12     public static  void main(String[] args)
13     {
14         Employee employee = new Employee();
15         employee.age = 100;
16         System.out.println(employee.age);
17         changeEmployee(employee);
18         System.out.println(employee.age);
19     }
20 }

如果不注释第9行的代码,输出为:

100

100

也就是employ的age并没有改变,这是为什么呢?

注释掉第9行代码,输出就是:

100

1000

这时候employee的age是改变了的,为什么呢?

疑问待求证!!

https://www.zhihu.com/question/31203609

原文地址:https://www.cnblogs.com/bolumiere/p/6610338.html