Java中的变量
J a v a Java Java是一个纯的面向对象的编程语言,但是仍然保留了 8 8 8个基础数据类型 ( b y t e , s h o r t , i n t , l o n g , f l o a t , d o u b l e , c h a r , b o o l e a n ) (byte,\,short,\,int,\,long,\,float,\,double,\,char,\,boolean) (byte,short,int,long,float,double,char,boolean),因此 J a v a Java Java中的变量也分为普通变量和引用变量。
普通变量
J a v a Java Java中的普通变量就是 8 8 8 个基础数据类型中的一种,直接声明即可。
int a = 1;
char c = 'a';
boolean f = true;
引用变量
Java中除了基础数据类型外的变量都是引用变量,指向一个对象或者为 n u l l null null。 J a v a Java Java中的引用变量可以理解成 C 、 C + + C、C++ C、C++ 中的指针。
值传递和引用传递
在 J a v a Java Java 中调用方法时,传递的参数都是值传递。值传递和引用传递的区别是前者传递的是原来变量的复制值,而引用传递传递的是变量本身。怎么理解呢?下面举个例子说明:
public class TEST{
public static void main(String[] agrs){
int a = 0;
func(a);
System.out.println(a);
}
private void func(int a){
a = 1;
}
}
上述例子中
m
a
i
n
main
main 方法打印出的是
0
0
0,说明传递到方法
f
u
n
c
func
func 里的是
a
a
a 的复制值,因此在
f
u
n
c
func
func 中的修改没有影响到
m
a
i
n
main
main 方法中的
a
a
a 。
但是下面这个例子是不是有影响呢?
public class TEST{
public static void main(String[] agrs){
int[] a = new int[] {0};
func(a);
System.out.println(a[0]);
}
private void func(int[] a){
a[0] = 1;
}
}
打印出的是 1 1 1,可能有人会问,这不是引用传递吗?在 f u n c func func 里对 a a a 的改变影响了 m a i n main main 中的 a a a !对吗?首先,在 f u n c func func 里并不是对 a a a 做了改变,而是对 a a a 所指向的对象做了改变,对 a a a 做改变应该是这样的:
public class TEST{
public static void main(String[] agrs){
int[] a = new int[] {0};
func(a);
System.out.println(a[0]);
}
private void func(int[] a){
a[0] = new int[] {1};
}
}
在这个例子中打印出的是 0 0 0,在 f u n c func func 里对 a a a 的改变没有影响到 m a i n main main 里的 a a a 。而且, f u n c func func 里的 a a a 的确是 m a i n main main 里的 a a a的复制而不是本身,当程序运行到 f u n c func func里时,实际上是有两个引用变量,一个是 m a i n main main 里的 a a a,一个是它的复制。所以在 J a v a Java Java 中,方法里的参数传递都是值传递。