方法参数的值传递机制
有一种的说法Java中只有值传递机制,这种说法的原因就是一个是传递的数据值(基本数据类型),一个传递的是地址值(引用数据类型)
形参是基本数据类型的情况
@Test
public void test(){
int a = 10;
int b = 20;
swap(a,b);
System.out.println(a+":"+b);//10:20
}
public void swap(int a,int b){
int temp = a;
a = b;
b = temp;
System.out.println(a+":"+b);//20:10
}
这里运行方法后是没有交换成功的原因是:这里的情况就是实参直接将自己的值传给了形参,而不是地址值,所以形参交换了而实参并没有交换.因为这里的参数是基本数据类型
此过程发生在栈中,原因可以看这篇文章,过程如下:
形参是引用数据类型的情况
@Test
public void test(){
Num num = new Num();
num.m = 10;
num.n = 20;
System.out.println(num.m+":"+num.n);//10:20
swap(num);
System.out.println(num.m+":"+num.n);//20:10
}
public void swap(Num num){
int temp = num.m;
num.m = num.n;
num.n = temp;
System.out.println(num.m+":"+num.n);//20:10
}
class Num{
int n;
int m;
}
这种就交换成功了,因为这里直接是让形参也指向了与实参一样的地址,所以就交换成功了.
而String在值传递时我们把它当做基本数据类型来看就可以了
数据存放位置
基本数据类型存放在哪里
1.如果作为方法的传入参数或者方法中的局部变量的话,基本数据类型会存放在Java虚拟机栈中的局部变量表中。
Java虚拟机栈每调用一个方法就会创建一个栈帧用于存放局部变量表、操作数栈、动态连接、方法接口等信息。方法的调用和执行过程对应栈帧在Java虚拟机栈中入栈和出栈的过程。
2.如果作为对象实例中的基本数据类型,就存放在堆中。
3.如果作为静态变量,在JDK7之前会存放在永生代实现的方法区中,在JDK8之后会存放在元空间实现的方法区中。
基本数据类型跟引用类型有什么区别
1.存储方式
针对基本数据类型和引用类型来说,他们存储的位置基本相同。区别在于基本数据类型在存放位置存放的是数值,而引用类型数据存放的是地址值,对象实例存放在堆中。
2.传递方式
他们的本质上都是值的传递。
基本数据类型传递的是数值的副本。
引用数据类型传递的是地址值的副本。
常见的Java值传递的题目
Java拼接问题
@Test
public void test(){
String s1 = "javaEEhadoop";
String s2 = "javaEE"+"hadoop";
String s3 = "javaEE";
final String s4 = "javaEE"; //s4: 常量
String s5 = s3 + "hadoop";
String s6 = s4 + "hadoop";
//执行intern()方法时,若常量池中不存在等值的字符串,
//JVM就会在常量池中创建一个等值的字符串,然后返回该字符串的引用。
String s7 = s5.intern();
System.out.println(s1 == s2);//true
System.out.println(s1 == s5);//false
System.out.println(s1 == s6);//true
System.out.println(s1 == s7);//true
}
下面代码运行结果是?
class Value{
public int i=15;
}
public class Test{
public static void main(String argv[]){
Test t=new Test( );
t.first( );
}
public void first( ){
int i=5;
Value v=new Value( );
v.i=25;
second(v,i);
System.out.println(v.i);
}
public void second(Value v,int i){
i = 0;
v.i = 20;
Value val = new Value( );
v = val;
System.out.println(v.i+" "+i);
}
}
答案:15 0 20
public class foo {
public static void main(String sgf[]) {
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+"."+b);
}
static void operate(StringBuffer x,StringBuffer y) {
x.append(y);
y=x;
}
}
答案:AB.B
以下代码执行后输出结果为
public class ClassTest{
String str = new String("hello");
char[] ch = {'a','b','c'};
public void fun(String str, char ch[]){
str="world";
ch[0]='d';
}
public static void main(String[] args) {
ClassTest test1 = new ClassTest();
test1.fun(test1.str,test1.ch);
System.out.print(test1.str + " and ");
System.out.print(test1.ch);
}
}
答案:hello and dbc