Java中的值传递如何理解

发布时间:2022-01-17 15:42:41 作者:kk
来源:亿速云 阅读:121

Java中的值传递如何理解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

一、基本概念:

值传递和引用传递是指在方法调用中,由调用者传递过来的参数是一个具体的值还是一个地址引用。 我发现小伙伴认为Java中存在引用传递的最大原因就是对上边概念中的这个“地址”有误解,它指的是栈中变量的引用,并不是指堆中对象的地址。

  • 值传递:顾名思义,就是由调用方法的地方将实际的值传到方法中。也就是说,我将我的值给你了,你想怎么改就怎么改,但是你的任何改变都不会影响我自身。

  • 引用传递: 引用传递是一种特殊的变量,它被认为是一个变量的别名。当定义一个引用时,其实是为目标变量起一个别名,引用并不分配独立的内存空间,它与目标变量公用其内存空间,当定义一个引用时,如果该引用不是用作函数的参数或者返回值,则必须提供该引用的初始值(即必须提供引用的目标变量名)。

     

二、在Java中怎么只有值传递的?

在Java中的8大基本数据类型和String中,这个值传递很容易理解,看如下代码:

public static void main(String[] args) {
   int a = 1;
   System.out.println("方法调用前:" + a);
   sum(a);
   System.out.println("方法调用后:" + a);
}

private static void sum(int a) {
   a = 2;
}
     

输出结果为(这是意料之中的事):

方法调用前:1 

方法调用后:1

有很多小伙伴都有如下想法:Java中的对象有在堆中创建的,而栈中的变量只是一个地址引用,所以当调用方法时传递过去的就是实际就是堆中对象的地址引用。 所以他们认为,在Java中,对象就是引用传递。其实不是的,请仔细阅读引用传递的概念,它是指传递过去的是这个变量的引用而不是对象的引用,也就是传递过去的这个实参就是栈中这个变量的引用。 但是实际是在调用方法时,它传递的就是这个变量的一个一副本,一个复制值,但是这个复制值就是所指向的对象地址还是那个,所以修改这个对象时,其实修改的是堆中对象的值,所以就会改变,看如下示例:

  • Student对象(标准的JavaBean)

class Student{
   private String name;
   private int age;

   public Student(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public Student() {

   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   @Override
   public String toString() {
       return "Student{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
   }
}
     
  • 测试方法

public static void main(String[] args) {
 Student stu1 = new Student("zhangsan", 12);
 System.out.println("方法调用前:"+ stu1.toString());
   change(stu1);
   System.out.println("方法调用后:"+ stu1.toString());
}
     
  • 最主要的就是这个change()方法了,我们不好从正面去证明它是值传递,但是我们可以从反面去证明它不是引用传递:

private static void change(Student stu1) {
   stu1.setAge(22);
}
     

这个输入结果没有问题:

方法调用前:Student{name='zhangsan', age=12} 方法调用后:Student{name='zhangsan', age=22}

private static void change(Student stu1) {
   stu1 = new Student();
   stu1.setAge(99);
}
     

根据大家的经验,这个输出肯定是:

方法调用前:Student{name='zhangsan', age=12} 

方法调用后:Student{name='zhangsan', age=12}

那么重点来了?为什么会是这样,如果它是引用传递,那么我在这里给它new一个新对象,在main方法中的变量应该也是一个新对象啊,因为我改变了它的引用地址,这足以说明这个不是一个引用传递,因为引用传递中,当你改变形参的值的时候,调用方法的实参也应该改变。

Java的特点有哪些

Java的特点有哪些 1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。 2.Java具有简单性、面向对象、分布式、安全性、平台独立与可移植性、动态性等特点。 3.使用Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

推荐阅读:
  1. java中只有值传递的方法
  2. Java中只有值传递吗

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:python怎么反转字典

下一篇:如何分析Javascript类型转换

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》