首页 > 编程语言 >java的参数传递

java的参数传递

时间:2022-10-14 12:24:15浏览次数:53  
标签:java 参数传递 num 内存 str 里面 main method

编程语言都有方法(函数),方法里面有时候会有参数,我们称之为形式参数,主函数main函数里面也有参数,在主函数调用方法(函数)的时候,如果方法里面有形式参数,则需要在主函数将实际参数传递给形式参数,我们称之为参数传递,而且传递的参数顺序类型要与形式参数的顺序类型一致,下面我将就我目前知道的记录一下,方便我以后知道自己咋想的:

一、基本类型的参数传递:

基本类型四类八种,基本加string类型被称为字面量类型,但是string是引用类型,这里我们先讨论基本类型的参数传递:

    public static void main(String[] args) {
        int num=10;
        method1(num);
        System.out.println("main中的num为"+num);
        
    }
    public static void method1(int num){
        System.out.println("主函数传过来的num为"+num);
        num=200;
        System.out.println("method修改之后"+num);
    }

看到这代码的时候,我原本想的结果是:10 200 200

但是实际运行结果

 

 main中的num没有被改变,还是10,为什么会有这种情况呢?这里就要说到内存的问题了,内存有两个存放位置,一个是栈内存一个是堆内存,方法都是存放在栈内存,一个方法需要占用一个栈帧,jvm都是main先进入占据栈帧,在main里面定义的变量num存放在main的栈帧里面,method方法也有自己的一个栈帧,形式参数num也存放在method的栈帧里面,此时传过来的num为10,method将num改成了200,但是main里面的num没有被修改,输出还是10.(画图理解吧),如果是基本类型的参数传递,传递的是数据

二、引用类型的参数传递:

java中引用类型有数组,字符串,枚举,class,interface,就来看看数组和字符串的参数传递的问题吧

 public static void main(String[] args) {
        int[] a={12,47,89};
        method1(a);
        System.out.println("main中的数组"+Arrays.toString(a));
        String str="abc";
        method2(str);
        System.out.println("main中的字符串值"+str);
    }

    public static void method2(String str){
        System.out.println("method中没有修改的字符串"+str);
        str="hello";
        System.out.println("method修改后的字符串"+str);
    }
    public static void method1(int[] a){
        System.out.println("传递过来的数组"+Arrays.toString(a));
        a[0]=100;
        System.out.println("method修改后的数组"+Arrays.toString(a));

    }

method里面的输出结果肯定是一样的,那么我们猜猜main中的数组和字符串输出结果有没有被修改值吧!

运行结果如下:

 

 都是引用类型,为什么数组的值被修改,而字符串的值没有被修改呢?

这是因为在定义数组的时候,我们相当于new了一个数组,new的值都存放在堆内存里面,main中的变量都是存放在main的栈帧中,但是指向的是堆内存里面的new值,然后a数组作为参数传递到method方法里面,但是指向的是同一个堆内存的数据值,修改值的时候,是method里面修改,但是修改的是堆内存里面的数组值,此时需要输出的时候,main里面a的指向位置没有变,因此输出的是修改之后的数组值,对于数组,类,接口都是传递内存的地址值,这里指向的是跟main的参数指向的同一个内存地址。(画图好理解)

而对string类型来说,main里面str指向的是赋值常量abc,abc是存放在堆内存的常量池里面的一个值,main中的实际参数指向的地址值也传给了method中的形式参数地址指向,此时他们两个字符串都是指向常量池里面的abc,但是method又在常量池里面取出一个hello,也就是改变了method里面的地址指向,这时候method里面的str指向的就是常量池中的hello,而main中的str指向的还是常量池中的abc,这是因为string的底层是final,是常量。

string和基本类型都是字面量类型,如果说参数是字面量类型,传递的是数据,对于基本数据类型,他的变量和值都是在同一块内存,对于引用类型,他有两块内存,一块存变量,一块是被指向的地址存放地址

标签:java,参数传递,num,内存,str,里面,main,method
From: https://www.cnblogs.com/Liku-java/p/16791212.html

相关文章

  • 图解Java设计模式之装饰者模式
    图解Java设计模式之装饰者模式​​星巴克咖啡订单项目(咖啡馆)​​​​方案1-解决星巴克咖啡订单项目​​​​方案1-解决星巴克咖啡订单问题分析​​​​方案2-解决星......
  • 图解Java设计模式之桥接模式
    图解Java设计模式之桥接模式​​手机操作问题​​​​传统方案解决手机操作问题​​​​传统方案解决手机操作问题分析​​​​桥接模式(Bridge)-基本介绍​​​​桥接模式解......
  • 图解Java设计模式之设计模式七大原则
    图解Java设计模式之设计模式七大原则​​2.1设计模式的目的​​​​2.2设计模式七大原则​​​​2.3单一职责原则​​​​2.3.1基本介绍​​​​2.3.2应用实例​​​​......
  • 图解Java设计模式之设计模式面试题
    图解Java设计模式之设计模式面试题​​1.1Java设计模式内容介绍​​​​1.1.1先看几个经典的面试题​​​​1.1.2设计模式的重要性​​1.1Java设计模式内容介绍1.1.1先......
  • 图解Java设计模式之工厂模式
    图解Java设计模式之工厂模式​​简单工厂模式​​​​简单工厂模式​​​​工厂方法模式​​​​抽象工厂模式​​简单工厂模式看一个具体的需求看一个披萨的项目:要便于披......
  • 前端成神之路-JavaScript基础第02天笔记
    JavaScript基础第02天1-运算符(操作符)1.1运算符的分类运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号。JavaScript中常用的运算符有:算数运......
  • 前端成神之路-JavaScript基础第04天笔记
    JavaScript基础第04天笔记1-数组1.1数组的概念数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式。数组是指一组数据的集合,其中的每个数据被称作元素,在数组中......
  • 前端成神之路-JavaScript基础第05天笔记
    JavaScript基础第05天笔记1-作用域1.1作用域概述通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用......
  • Java每日一题之Thread的yield和join方法区别
    Java每日一题之Thread的yield和join方法区别​​1.Java线程调度的一点背景​​​​2.理解线程的优先权​​​​3.yield()方法​​​​4.join()方法​​1.Java线程调度的一点......
  • 前端成神之路-JavaScript基础第06天笔记
    JavaScript基础第06天笔记1-内置对象1.1内置对象JavaScript中的对象分为3种:自定义对象、内置对象、浏览器对象​前面两种对象是JS基础内容,属于ECMAScript;第三......