首页 > 编程语言 >Java基础 值传递和引用传递

Java基础 值传递和引用传递

时间:2022-09-28 22:01:16浏览次数:42  
标签:Java show 对象 数据类型 传递 引用 方法 user

Java基础 值传递和引用传递

1.问题描述

由于Java中是没有指针的,Java中只存在值传递,只存在值传递!!!!‘
在实际使用中,我们经常使用对象的传递,这种看起来很像引用传递,可以改变对象中某个属性的值。但在底层运用中,这种传递实际上这个传入函数的值是对象引用的拷贝,即传递的是引用的地址值,所以还是按值传递。
综上,对于Java中方法值传递的问题,可以分为以下两点:

  1. 对于八种基本数据类型来说,在传递过程中,会自动生成一个新的基本数据。对于基本的数值类型其实传递的是一份数值的拷贝,传入函数之后跟原来的值就没有关系了,在函数中改变这个数的值也不会影响到原来的值。
  2. 对于引用数据来说,在传递过程中,会将方法调用处的对象地址赋给方法列表中的参数,而不是生成一个新的对象。

2.代码测试

2.1 基本数据类型

public class Question1 {

    public static void main(String[] args) {
        int a=10;
        System.out.println("方法执行前");
        show(a);
        changeA(a);
        System.out.println("方法执行后");
        show(a);
    }

    private static void changeA(int a) {

        a=100;
        System.out.println("方法执行期间");
        show(a);

    }

    private static void show(int a) {
        System.out.println("a的值是:"+a);
    }

}

输出

方法执行前
a的值是:10
方法执行期间
a的值是:100
方法执行后
a的值是:10

2.2 对象数据类型:

public class Question1_2 {
    public static void main(String[] args) {
        User user =new User("tom",1);
        System.out.println("方法执行前");
        show(user);
        changeUser(user);
        System.out.println("方法执行后");
        show(user);
    }

    private static void changeUser(User user) {
        user=new User("jary",2);
        System.out.println("方法执行中");
        show(user);

    }

    private static void show(User user) {
        System.out.println(user.toString());
    }

}

输出:

方法执行前
User{name='tom', age=1}
方法执行中
User{name='jary', age=2}
方法执行后
User{name='tom', age=1}

3 解析

对于基本数据类型,相当于重现创建了一个基本数据类型,只是在数值上与原有的一样。方法内部改变数据后,也不会对方法外部的原有的值进行任何改变。

对于对象数据类型,相当于把自己的地址值传递给了方法内部的对象引用。若方法内部的都对象引用对指向的对象进行了内部改变(改变了对象内部的属性),则将会直接影响方法外部的数据;若方法内部的对象引用进行了对象间的改变(重现生成了一个对象,或者对对象引用进行了指向性的改变),则不会改变方法外部的任何值,因为外部a的对象引用没变。

4 结论

因此,Java中只存在值传递,对于基本数据类型,相当于重新创建一个值,并将原来的值赋给方法内的类型。对于对象数据类型,相当于把方法外部的地址值传递给了方法内部的对象引用。

标签:Java,show,对象,数据类型,传递,引用,方法,user
From: https://www.cnblogs.com/weliars/p/16739704.html

相关文章

  • 【笔记】Java相关大杂烩②
    【笔记】Java相关大杂烩②if单分支情况下,如果没有加{},那么默认只包含第一条语句。if和else分支后面如果包含多条语句,那么需要使用{}括起来。不能随意地使用数学上......
  • Java第二讲动手动脑
    1.运行结果  上述代码方法名相同,但是数据类型不同,体现了Java重载的特点(1)方法名相同(2)参数类型不同,参数个数不同,或者是参数类型的顺序不同。也体现了Java中,当函数名......
  • java资源精华
    1. java基础教程虚拟机性能分析和故障解决工具_哔哩哔哩_bilibili2.https://www.bilibili.com/video/BV1Eb4y1v7mB/?p=2&vd_source=3d22ebd70535ac1bb918868055a3c5d8......
  • java笔记
    **命名规范:**首字母大写,后面每个单词首字母大写(大驼峰)HelloWrold变量名规范:首字母小写,后面每个单词首字母大写(小驼峰)helloWorld方法变量名规范:同变量名 常量:在程序运......
  • 【Azure Developer】Java代码访问Key Vault Secret时候的认证问题,使用 DefaultAzureCr
    问题描述使用JavaSDK获取KeyVaultSecret机密信息时,需要获取授权。通常是使用AAD的注册应用(ClientID,TenantID,ClientSecret)来获取 credential对象。Sec......
  • 计算机类毕业设计选题推荐 springboot+vue宠物医院管理系统 java宠物预约挂号系统 微
    ......
  • JavaDoc
    packagebase;publicclassDoc{Stringname;/****@paramname;*@return;*@throwsException;*///由/**回车打出......
  • 【Java基础】自定义异常类
    1.自定义异常类(1)继承现有异常类:比如RuntimeException、Exception。(2)提供全局常量:serialVersionUID。(3)提供重载构造器。publicclassValueExceptionextendsException......
  • 【Java基础】抛出异常throws
    1.throws声明抛出异常一个方法中可能出现异常,那么可以使用throws抛出异常,交给这个方法的调用者处理(也不处理就继续向上抛,直到main方法)。publicvoidsay()throwsCl......
  • 【Java基础】异常处理机制:try-catch-finally
    1.异常对象生成(抛出异常)Java程序的执行过程中如果出现异常,就会生成一个异常类的对象,该异常对象将会被提交给Java运行时系统。虚拟机自动生成异常对象:虚拟机检测到程序......