Java中有8种数组类型{整型(byte,short,int,long),浮点型(double,float)字符型(char),布尔型(Boolean)},引用类型,是指除了基本的变量类型之外的所有类型,例如类,数组,接口,枚举,注解。
基本数据类型传递时只传递值本身,局部变量存放在栈内存中
要求定义一个方法,传入两个整数,功能时将两个数进行交换
public class Test{
public class Exchange {
public void fun(int a ,int b ){
System.out.println("交换前:"+a+";"+b);
int temp = a;
a = b;
b = temp;
System.out.println("交换后:"+a+";"+b);
}
public static void main(String[] args) {
Exchange exchange = new Exchange();
exchange.fun(123,456);
}
}
}
结果:
交换前:123;456
交换后:456;123
更改后
public class Exchange {
public void fun(int a ,int b ){
int temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int x = 123;
int y = 456;
Exchange exchange = new Exchange();
System.out.println("交换前:"+x+";"+y);
exchange.fun(x,y);
System.out.println("交换后:"+x+";"+y);
}
}
更改后,在进行x向a传递时,传递的x的值本身,实际上x和y并没有改变。栈内存中特点就是只要方法执行,里面的局部变量就会被销毁,所以支持fun()方法后,int temp,int a,int b都会被销毁。此时int x 和int y没有变化。局部变量存放在栈中,成员变量存放在堆中,所以局部变量可以重名,但必须存在不同方法中。
接下来介绍引用类型的传递
public class Exchange {
int x;
int y;
public Exchange(int x,int y){
this.x = x;
this.y = y;
}
public void fun(Exchange e ){
int temp = e.x;
e.x = e.y;
e.y = temp;
}
public static void main(String[] args) {
Exchange exchange = new Exchange(12,56);
System.out.println("交换前:"+exchange.x+";"+exchange.y);
exchange.fun(exchange);
System.out.println("交换后:"+exchange.x+";"+exchange.y);
}
}
结果:
交换前:12;56
交换后:56;12
int x = 23;int y=56在栈中存放,基本数据类型的传递直接把值传递,所以堆内存中存放的成员变量int x = 23;int y =56;int temp = e.x,而e.x此时等于23,所以int temp = 23。把e.y传递给了e.x,执行fun()方法后之间进行值的传递,结果是此时成员int x = 56;int y = 23;
总结就是基本数据传参是传递的是值(传值),而引用数据类型传参时传的是地址(传址),这与C++ 的指针原理上相似,但是Java中没有指针。
接下来介绍一下什么是引用
简单的说,引用其实就像是一个对象的名字或者别名 (alias),比如String a = "hello world";String b = a;a和b都申请了一段内存来保存数据,但是a和b都指向同一个地址,是不是和c++ 中的指针很相似,没错,我们可以把它理解为指针。a 和 b 是不同的两个引用,我们使用了两个定义语句来定义它们。但它们的值是一样的,都指向同一个对象 "This is a Text!"。但要注意String 对象的值本身是不可更改的 (像 b = "World"; b = a; 这种情况不是改变了 "World" 这一对象的值,而是改变了它的引用 b 的值使之指向了另一个 String 对象 a)。
如图,开始b 的值为绿线所指向的“Word Two”,然后 b=a; 使 b 指向了红线所指向的”Word“.