当前位置: 首页 > news >正文

成员方法传参机制

❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️

🧑个人主页:@周小末天天开心

各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力

感谢!

目录

前言

基本数据类型传参机制

引用数据类型传参机制

成员方法的返回类型

总结


前言

        方法传参机制非常重要,一定要搞的明明白白。


基本数据类型传参机制

分析下面的案例,看看结果会输出什么。

public class MethodParameter01 { 
	public static void main(String[] args) {

		int a = 10;
		int b = 20;
		//创建AA对象 名字 obj
		AA obj = new AA();
		obj.swap(a, b); //调用swap

		System.out.println("main方法 a=" + a + " b=" + b);//a=10 b=20
	}
}

class AA {
	public void swap(int a,int b){
		System.out.println("\na和b交换前的值\na=" + a + "\tb=" + b);//a=10 b=20
		//完成了 a 和 b的交换
		int tmp = a;
		a = b;
		b = tmp;
		System.out.println("\na和b交换后的值\na=" + a + "\tb=" + b);//a=20 b=10
	}
}

 流程分析:

1)程序运行到 AA obj = new AA(); 时,会创建一个AA对象,名字为 obj。

2)调用AA对象中的swap方法,将 a = 10,b = 20,传给 swap 方法中的a和b。

3)在方法中,先输出了一遍a和b原本的值,然后进行了交换,此时在方法中a和b的值已经互换了。

4)在互换之后,又输出了一遍a和b的值,此时a = 20,b = 10。

5)方法执行完后,在main方法中又输出了一遍a和b的值,此时就要注意这里的a和b是多少。

6)这里的值a = 10,b = 20。这到底是为什么,看下面的输出结果以及内存图总结

内存流程分析图:

结论:基本数据类型,传递的是值,形参的任何改变不影响实参,所以在swap方法中交换了a和b的值,但不影响a和b在main方法中的值,也可以说,每个方法都在堆中对应一个自己的内存空间,不会互相影响。(注:sout表示输出语句)

输出结果:


引用数据类型传参机制

分析引用数据类型的传参案例,看看会输出什么

public class MethodParameter02 {
    //编写一个main方法
    public static void main(String[] args) {

         B b = new B();
         int[] arr = {1, 2, 3};
         b.test100(arr);//调用方法
         System.out.println(" main的 arr数组 ");
         //遍历数组
         for(int i = 0; i < arr.length; i++) {
         	System.out.print(arr[i] + "\t");
         }
         System.out.println();
    }
}

class B {
    
    //B类中编写一个方法test100,
    //可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化
    public void test100(int[] arr) {
        arr[0] = 200;//修改元素
        //遍历数组
        System.out.println(" test100的 arr数组 ");
        for(int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
    }
}

查看输出结果,结合内存图分析程序运行流程:

可以看出,这里test100方法中的数组值和main方法中的数组值是一样的,可能有小伙伴就要问了,不是说两个方法指向不同的内存吗,为什么test100方法中更改数组值main方法中的也会改变?这里就要结合内存图分析。

流程分析:

1)给数组arr赋三个值 1, 2, 3,此时会在堆中新开一个地址来存放,也就是堆中0x0011的空间。

2)然后调用test100方法在方法中将arr数组的第一个地址对应的值改为200,也就是 arr[0] = 200。因为是数组引用传递,所以方法test100也会指向0x0011,而导致0x0011中的值也会进行更改。

3)然后在方法test100中遍历数组进行输出,因为此方法指向的内存空间0x0011的值已经进行了更改,所以会输出 200,2,3。

4)方法test100执行完成后,继续执行main方法,再次遍历输出一次arr数组。这里就要注意了,因为两个方法都指向了同一个数据空间,0x0011中的值已经更改,所以在main方法中输出arr数组的也会是 200,2,3。


成员方法的返回类型

分析下面的程序,思考成员方法的返回类型是什么

public class MethodExercise02 {

    public static void main(String[] args) {

        Person p = new Person();
        p.name = "milan";
        p.age = 100;
        //创建tools
        MyTools tools = new MyTools();
        Person p2 = tools.copyPerson(p);

        //到此 p 和 p2是Person对象,但是是两个独立的对象,属性相同
        System.out.println("p的属性 age=" + p.age  + " 名字=" + p.name);
        System.out.println("p2的属性 age=" + p2.age  + " 名字=" + p2.name);
        //可以同对象比较看看是否为同一个对象
        System.out.println(p == p2);//false


    }
}

class Person {
    String name;
    int age;
}

class MyTools {

    public Person copyPerson(Person p) {
        //创建一个新的对象
        Person p2 = new Person();
        p2.name = p.name; //把原来对象的名字赋给p2.name
        p2.age = p.age; //把原来对象的年龄赋给p2.age
        return p2;
    }
}

查看输出结果分析:

可以看出p 和 p2 的属性一样,但是两个对象却并不相等,这是因为它们的地址不同

流程分析:

1)首先创建p对象,给姓名和年龄两个属性赋值。

2)创建tools对象,调用copyPerson方法,将p的属性传给copyPerson方法中的p。

3)在copyPerson方法中创建一个 新的对象p2,将p的属性赋给p2,此时p和p2属性中的值相等。

4)返回p2对象,在main方法中用p2接收。

5)分别输出p和p2中的属性,可以看出p和p2中的属性完全相等,这说名这两个对象都指向了同一个内存空间。

6)再对p和p2对象进行比较,输出了一个false,说明p和p2对象的地址并不相同,因为p = p2是进行的地址比较。

得出结论:成员方法返回类型是引用类,而且只是指向了同一个内存空间,但是两个对象的地址并不相同。


总结

成员方法的传参机制对今后的学习非常重要,必须要多做练习且多加思考传参时内存中发生的变化。

相关文章:

  • 【观察】容器化部署“再简化”,云原生体验“再升级”
  • 电商数据接口开发|淘宝商品接口|天猫商品接口|京东商品接口|拼多多商品接口|API接口申请指南
  • Solaris安装Oracle RAC配置手册
  • ChatGPT引领:打造独具魅力的论文
  • 【Python小游戏】植物大战僵尸的实现与源码分享
  • ECA-Net:深度卷积神经网络中的高效通道注意力机制【原理讲解及代码!!!】
  • 学习JAVA的第四天(基础)
  • 蓝桥杯 子矩阵 (找大小为a*b的矩阵的最大最小值的乘积,queue)
  • Odoo17 不再支持视图中的attrs和states
  • 适配器模式(Adapter Pattern)
  • 第二章-Mybatis源码解析-以xml方式走流程
  • python 基础语法及保留字
  • mac苹果通过pycharm进行ssh远程连接服务器(Ubuntu)
  • AJAX异步请求(Asynchronous Javascript And Xml)
  • Android12 A2DP连接[1]
  • JAVA SE_part.2
  • 5.HttpServletRequest类
  • 【SQL刷题】秋招刷爆SQL题之插入数据
  • 刷爆leetcode第九期 0020
  • Colmap安装与实践
  • 【苹果iMessage相册推信息推】 重要用于安装背面必要安装的watchman
  • 艾德克斯IT6512D可编程直流电源中文介绍
  • 使用机器学习做DGA域名识别
  • Day06-尚品汇-排序操作上
  • Linux进程替换(exec系列)
  • 史上最全软件测试工程师常见的面试题总结(百度、oppo、中软国际、华为)
  • 艾美捷抗人IL-2单抗MT8G10即用型解决方案
  • 头歌-信息安全技术-实训04 数据库SQL注入漏洞
  • C# 中的多线程
  • 建立自己的kindle书库
  • JavaWeb笔记(五)后端(Thymeleaf)(Tomcat类加载机制)(编写图书管理系统)
  • 提升网站流量和排名的方法,SEO优化要这样做