Java: 变量的值和引用
2009-05-21 10:31
169 查看
广义的说,在 Java 中,凡是可以指向一个对象或包含一个值的标识符,都可以称为变量。
变量的内容,有可能是一个值,也有可能是指向一个对象的引用。
当变量的类型为基本型别(short, byte, int, long, float, double, boolean, char)时,变量的内容是一个值;当变量的类型为 Object 及其子类时,变量的内容是指向一个对象的引用。例如:
这时变量 a 的内容就是 3,变量 s1 的内容就是指向一个字符串对象的引用,s2 则和 s1 一样指向该对象。如果执行了下面的语句:
这时变量 a 的内容被改成了 4,s1 的内容改成了指向另一个字符串对象("Hello again!")的引用。s2 则还是指向原先的那个字符串("Hello!")。
接下来谈方法的调用。方法的调用是传值的。例如下面这个方法:
当调用 f(a, s1) 时,变量 a 和 s1 的值被赋给参数 i 和 s,然后才执行 f 方法。也就是说,无论 i 和 s 怎么变,都不会影响 a 和 s1 的值。
接下来是一个稍微复杂的例子。首先定义一个方法:
假设再执行下面的句子:
那么执行之后是什么结果呢?
i 和 a 是两个不同的变量,i 的值变了不会影响 a,所以 a 的值还是 3;
list 和 l 是两个不同的变量,但它们指向同一个 List 对象。f 的执行过程中给这个 List 对象添加了一个元素,那么执行完之后,通过 l 变量我们可以取到这个元素:
但如果 f 这样写:
那么 list 首先引用到另一个 List 对象去了,改变的是另一个 List 对象的内容,所以变量 l 指向的 List 对象没有改变,l.size() 仍然是 0。
像这样的概念,初学者可能容易混淆;但只要多练习,很快就能熟悉了。
变量的内容,有可能是一个值,也有可能是指向一个对象的引用。
当变量的类型为基本型别(short, byte, int, long, float, double, boolean, char)时,变量的内容是一个值;当变量的类型为 Object 及其子类时,变量的内容是指向一个对象的引用。例如:
int a = 3; String s1 = "Hello!"; String s2 = s1;
这时变量 a 的内容就是 3,变量 s1 的内容就是指向一个字符串对象的引用,s2 则和 s1 一样指向该对象。如果执行了下面的语句:
a = 4; s1 = "Hello again!";
这时变量 a 的内容被改成了 4,s1 的内容改成了指向另一个字符串对象("Hello again!")的引用。s2 则还是指向原先的那个字符串("Hello!")。
接下来谈方法的调用。方法的调用是传值的。例如下面这个方法:
void f(int i, String s) { i = 100; // i 的值改成了 100 s = "Hi!"; // s 现在指向字符串 "Hi!" }
当调用 f(a, s1) 时,变量 a 和 s1 的值被赋给参数 i 和 s,然后才执行 f 方法。也就是说,无论 i 和 s 怎么变,都不会影响 a 和 s1 的值。
接下来是一个稍微复杂的例子。首先定义一个方法:
void f(int i, List list) { i = 10; list.add("Hello!"); }
假设再执行下面的句子:
int a = 3; List l = new ArrayList(); f(a, l);
那么执行之后是什么结果呢?
i 和 a 是两个不同的变量,i 的值变了不会影响 a,所以 a 的值还是 3;
list 和 l 是两个不同的变量,但它们指向同一个 List 对象。f 的执行过程中给这个 List 对象添加了一个元素,那么执行完之后,通过 l 变量我们可以取到这个元素:
l.get(0); // "Hello!"
但如果 f 这样写:
void f(int i, List list) { i = 10; list = new ArrayList(); list.add("Hello!"); }
那么 list 首先引用到另一个 List 对象去了,改变的是另一个 List 对象的内容,所以变量 l 指向的 List 对象没有改变,l.size() 仍然是 0。
像这样的概念,初学者可能容易混淆;但只要多练习,很快就能熟悉了。
相关文章推荐
- 再谈java两种变量(基本类型和引用类型)(综合各路大神)
- Java对象及对象引用变量
- java引用与变量
- Java面向对象【经典案例】数组是对象,其变量的值是引用地址
- Java 局部 final 变量与内部类引用外部变量
- Java对象及对象引用变量
- java中传递基础数据类型值与传递数组引用变量给方法的不同之处
- java初学者实践教程5-基本类型和引用类型变量
- Java中的基本类型和引用类型变量的区别
- Java中为什么内部类对外部类局部变量有引用时,外部类局部变量一定要有final?
- java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- Java中的基本类型和引用类型变量的区别
- java笔记 chapter3使用java类,关键字new,this,变量初始化,引用传递
- 【Java面试题】2 Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?超详细解析
- Java引用变量的类型
- java中引用kotlin中的全局变量
- JAVA之变量引用
- 4 java final 变量 | 变量即是final 又是static | 引用类型与基本数据类型 | Exception相关
- Java对象和引用变量
- Java中为什么内部类对外部类局部变量有引用时,外部类局部变量一定要有final?