什么是值类型?
java中值类型包括8中基本类型(byte 、short、int、 long 、float 、double、 char、boolean) 与String类型;
String类型比较特殊,虽然是对象类型,但被final修饰符修饰 一旦被定义就不能再被修改,所以jvm为了提高效率为其分配了常量池,可以当成基本类型处理,不过是在常量池中分配空间(通过new指令也可以在堆中分配此处不多解释,详情请了解我的另一篇博客java中String如何分配空间:https://blog.youkuaiyun.com/qq_34357351/article/details/91949218)
值类型一般在栈中直接分配空间,生命周期比较短,随着方法的结束而被销毁
什么是引用类型?
引用类型就是数组、类、接口之类的类型
引用类型在堆中分配内存,栈中的引用只保存堆中的地址,堆中的真实空间需要靠垃圾回收机制回收处理
值类型与引用类型作为形参传递是否会影响原来的实参?
参数为值类型
/***值传递*/
public class test {
public static void main(String[] args) {
String str="hello";
System.out.println("str原值:"+str);
operator(str);
System.out.println("str处理后值:"+str);
}
private static void operator(String str) {
str=str+"java";
System.out.println("str(形参)处理后的值:"+str);
}
}
运行结果:
1.首先第一步定义一个String【值类型】str为“hello”,则此时调用方法前str="hello",打印输出为"hello";
2.当我们调用operator方法的时候将str以形参的形式传递过去,此时方法中的str为形参值为"hello"因为为值传递,形参与实参没有任何瓜葛了;
3.当在方法中执行str=str+"java"之后 形参值变为"hellojava";此时主方法中的(实参)str还是为hello
4.主方法的str打印输出为"hello";
在这里我们就可以知道:当参数为值类型时,形参方法内的参数值改变,并不会影响到实参的值
参数为引用类型
代码示例1:
/** 引用传递*/
public class test2 {
public static void main(String[] args) {
Person person=new Person("hello",20);
System.out.println("person的原值:"+person);
operatorPerson(person);
System.out.println("person操作之后的值:"+person);
}
private static void operatorPerson(Person p) {
p.setAge(22);
p.setName("hello world");
}
代码执行结果:
1.首先我们定义了一个Person类型的对象,将姓名赋值为hello,年龄赋值为20;
2.当我们调用方法,并且将person这个对象以参数传递过去;
3.将对象的属性改变姓名为hello world 年龄改为22
4.输出操作之后的person值得时候我们发现我们的对象被改变了
这是因为,当我们的参数传递为引用类型的时候,形参保存的为实参在内存中的地址,修改形参的值就是直接修改该地址对应的对象(实参)的属性值,所以我们的对象也就被修改了。
代码示例2:
public class test2 {
public static void main(String[] args) {
Person person=new Person("hello",20);
System.out.println("person的原值:"+person);
operatorPerson(person);
System.out.println("person操作之后的值:"+person);
}
private static void operatorPerson(Person p) {
p=new Person("hello World",22);//创建了一个新对象
}
输出结果:
这样结果为什么没有变化呢?
因为形参p保存的是person(实参)对象在内存中的地址,当我们在方法中new了一个新对象[姓名为helloword,年龄为22]的对象时,我们只是将新对象在内存中的地址覆盖了形参p中保存的地址,而没有对person(实参)对象进行操作,所以两次输出结果都一样,没有变化;如下图所示: