首页 > 编程语言 >java中的值传递和引用传递

java中的值传递和引用传递

时间:2024-08-01 19:40:16浏览次数:12  
标签:java String void System 传递 static 引用 println public

值传递:

传递对象的一个副本,即使副本被改变,也不会影响源对象,因为值传递的时候,实际上是将实参的值复制一份给形参。

引用传递:

传递的并不是实际的对象,而是对象的引用,外部对引用对象的改变也会反映到源对象上,因为引用传递的时候,实际上是将实参的地址值复制一份给形参。

说明:对象传递(数组、类、接口)是引用传递,原始数据类型(整形、浮点型、字符型、布尔型)传递是值传递。

1.值传递

public class Demo {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
        work(num1, num2);
        System.out.println("num1 = "+num1);
        System.out.println("num2 = "+num2);
    }
    private static void work(int a, int b) {
        int temp = a;
        a = b;
        b = temp;

        System.out.println("a = "+a);
        System.out.println("b = "+b);
    }
}

运行结果

a = 20
b = 10
num1 = 10
num2 = 20

虽然在work()方法中a,b的值做了交换,但是主方法中num1,num2的值并未改变。

2.引用类型传递

public class ArrayListDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        change(arr);
        System.out.println(arr[0]);
    }

    private static void change(int[] arr) {
        System.out.println(arr[0]);
        arr[0] = 0;
    }
}

运行结果

1
0

在change()方法中将数组的第一个元素改为0,主方法中数组的第一个元素也跟着变为0。

3.StringBuffer类型

public class Demo {
    public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer("北京异乡人");
        System.out.println(stringBuffer);

        changeStringBuffer(stringBuffer);
        System.out.println(stringBuffer);
    }

    public static void changeStringBuffer(StringBuffer stringBuffer) {
        stringBuffer = new StringBuffer("河北异乡人");
        stringBuffer.append(",哈哈哈");
    }
}

运行结果

北京异乡人
北京异乡人

也许你会认为第2次应该输出"河北异乡人,哈哈哈",怎么输出的还是原来的值呢?那是因为changeStringBuffer中,又new了一个StringBuffer对象,此时stringBuffer变量指向的内存地址已经改变,所以主方法中的stringBuffer变量未受到影响。

如果修改changeStringBuffer()方法的代码为:

public static void changeStringBuffer(StringBuffer stringBuffer){
	stringBuffer.append(",欢迎大家关注");
}

则运行结果会变为:

北京异乡人
北京异乡人,欢迎大家关注

4.String类型

public class Demo {
    public static void main(String[] args) {
        String str = new String("北京异乡人");
        System.out.println(str);
        changeString(str);
        System.out.println(str);
    }
    public static void changeString(String string) {
        string = new String("河北异乡人");
    }
}

运行结果:

在changeString()方法中不管用string="河北异乡人";还是string = new String("河北异乡人");

主方法中的str变量都不会受影响,也验证了String创建了之后是不会变更的。

5.自定义类型

public class ArrayListDemo {
    public static void main(String[] args) {
        Person person = new Person("李四");
        System.out.println(person.getName());

        changePerson(person);
        System.out.println(person.getName());
    }
    public static void changePerson(Person p) {
        Person person = new Person("张三");
        p = person;
    }
}
class Person{
    private String name;
    public Person(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

运行结果:

李四
李四

修改changePerson()方法代码为:

public static void changePerson(Person p){
	p.setName("zhangsan");
}

运行结果:

李四
张三

标签:java,String,void,System,传递,static,引用,println,public
From: https://www.cnblogs.com/sixty-thousand/p/18337335

相关文章

  • Java 从P12文件中提取公钥、私钥,并导出为DER、PEM和CERT格式的证书
    importjava.io.*;importjava.security.KeyStore;importjava.security.PrivateKey;importjava.security.PublicKey;importjava.security.cert.Certificate;importjava.util.Enumeration;importjava.util.Base64;publicclassP12ToKeysAndCerts{public......
  • javascript: vue create project in WebStorm
     route/index.js import{createRouter,createWebHistory,createWebHashHistory}from'vue-router'importHomeViewfrom'../views/HomeView.vue'importAboutViewfrom"../views/AboutView.vue";constrouter=createRouter(......
  • java 07
    化繁为简打印空心金字塔:先用一个for循环打印55的金字塔,在考虑只打印行数相同的星星的金字塔,接着考虑每行前面的空格,最后考虑如何将每行中间空出来。运行结果如下:也可以将i改为变量打印输入的数量的金字塔;(int)(Math.random()100)随机生成0到100间的数;用for和break做简洁的登录......
  • Java,集合Collections类Set接口
    一.Collections类1.Collections常用功能publicstaticvoidshuffle(List<?>list):打乱集合顺序。publicstaticvoidsort(Listlist):将集合中元素按照默认规则排序。publicstaticvoidsort(Listlist,Comparator<?superT>com):将集合中元素按照指定规则排序。public......
  • Java并发—Java内存模型以及线程安全
    目录 一、Java内存模型JMM的核心概念二、什么是线程安全? 1、原子性2、有序性3、可见性三、如何确保线程安全?1、sychronized关键字2、Lock接口和其实现3、volatile关键字4、Atomic原子类5、ThreadLocal6、不可变对象7、并发集合类8、并发工具类9、Future和Ca......
  • 基于Django的超市小程序+47822(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小
    基于django超市小程序摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,超市小程序被用户普遍使用,为方便用户能够可以随时进行超市小程序的数据信息管理,特开发了基于djan......
  • 前端项目package.json文件引用本地依赖
    在前端项目的package.json文件中引用本地依赖,可以使用以下几种方式:1.使用file:前缀如果本地依赖是一个已经存在的目录,可以在package.json中使用file:前缀来引用它。{"dependencies":{"your-local-package":"file:../path-to-your-local-package"}}2.......
  • 制作java代码 Dockerfile
    DockerfileFROMmaven:3.6.2-jdk-8-slimASbuilderCOPYdigit/digit-life-service/build/WORKDIR/build/RUN--mount=type=cache,target=/root/.m2mvncleaninstall-Ptest-Dmaven.test.skip=trueFROMopenjdk:8-slimWORKDIR/appsCOPY--from=builder/bui......
  • 【Java】继承、super、final、子类构造方法
     目录1.为什么需要继承2.继承的概念3.继承的语法4.父类成员访问4.1子类和父类不存在同名成员变量1.子类和父类不存在同名成员变量 2.子类和父类成员变量同名4.2子类中访问父类的成员方法1.成员方法名字不同2.成员方法名字相同5.super关键字6.子类构造方法7.this......
  • 基于Java的电子产品销售网站【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......