JAVA中值类型与引用类型通过形参与实参不同的表现

什么是值类型?

java中值类型包括8中基本类型(byte 、short、int、 long 、float 、double、 char、boolean) 与String类型

String类型比较特殊,虽然是对象类型,但被final修饰符修饰 一旦被定义就不能再被修改,所以jvm为了提高效率为其分配了常量池,可以当成基本类型处理,不过是在常量池中分配空间(通过new指令也可以在堆中分配此处不多解释,详情请了解我的另一篇博客java中String如何分配空间:https://blog.csdn.net/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(实参)对象进行操作,所以两次输出结果都一样,没有变化;如下图所示:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值