Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 464|回复: 0

[默认分类] 基本数据类型或者引用数据类型作为方法参数传递

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-14 22:59:37 | 显示全部楼层 |阅读模式
    一:
    1 :如果参数是基本数据类型(四类八种:byte,short,int,long,double,float,double,
    boolean,char),那么传的是变量的值,例如: int a= 10; 那么传过去的就是10!

    例子:
    package qqwwffg.pass_method_paramater;public class PrimitiveType {

    public void change(int a) {
      a = 3;
    }

    public static void main(String[] args) {
      int a = 1;
      PrimitiveType test = new PrimitiveType();
      test.change(a);
      System.out.println(a); // 1 ,而不是3
    }
    }change 方法在被调用的时候,在内存中也分配一个空间来存储,存的是传过来的值,即3 .而当方法结束时,这块内存就等垃圾回收了,而在main 方法中,它打印的a 的值是在调用main方法时分配的内存空间,他们俩之间没有任何关系,所以打印的还是1.2 : 如果参数是引用数据类型(类,数组,接口),那么传的是也是变量的值,例如: Point param = new Point(); 那么传过去的是point 这个变量的值 ,而不是说Point 这个对象!而point 这个变量的值,其实就是Point 对象在内存中的地址(也叫引用)!
    例子:public class ReferenceType { public void changePoint(Point point) {
      point.x = 5;
      point.y = 6;
    }

    public void changeReference(Point point) {
      point = null;
    } public void testPassByStirng(String param) {
      param = "newValue";
    } public static void main(String[] args) {
      int a = 1;
      Point point = new Point(1, 2);
      ReferenceType test = new ReferenceType();
      test.changePoint(point);
      System.out.println(point.x); // 5 而不是 1
      System.out.println(point.y); // 6 而不是 2
      test.changeReference(point); // 调用这个后,下面是否会报空指针呢?
      int x = point.x; // 不会
      System.out.println("x 的值是 " + x );  String param = "value";
      test.testPassByStirng(param);
      System.out.println(param); // 是value ,而不是 newValue
    }
    }class Point {
    int x; int y; public Point(int x, int y) {
      this.x = x;
      this.y = y;
    }

    }
    java 中,访问对象是通过指向对象的引用来操作的,而一个对象可以被多个引用所指向,无论其中哪个引用对这个对象的内容进行修改,它都会影响到另外一个引用,虽然引用有多个,但对象却只有一个!
    changePoint 方法被调用时,你把main 方法中的Point 对象的引用point 传给了changePoint的参数
    point,此时,这个point 引用也指向了main 方法中的Point 对象(new 出来的),而你在这个方法中,
    用point 这个引用对Point 对象(new 出来的)的内容进行了修改(point.x = 5;point.y = 6;),因为它们指向的是同一个Point 对象(new 出来的),所以,当方法执行完后,这个修改会反映到这
    个对象上,而此时,你再打印出Point 对象的x,y 的值,都是被改变后的值! 即不再是1和2,而是5与6 .
    小结:
    在java 中,方法参数的传递永远都是传值,而这个值,对于基本数据类型,值 就是你赋给变量的那个值,而对于引用数据类型,这个值是对象的引用,而不是这个对象本身.二: 在java 中,通过方法的调用,只能改变对象的内容,而不能改变对象的引用.
    如 上面的方法public void changeReference(Point point) {
      point = null;
    }
    point = null ,这句话是把你在调用changeReference方法时,本来point 这个引用与你在main 方法中
    的那个point 引用指向的是同一个对象,而当你调用point = null 时,它就不再指向原来的Point 对象
    了,此时,它只是改变它自身的指向,并没有对main 方法中的point 引用进行修改,main 中的point 引用
    还是指向main 中的Point 对象!所以,你在main 方法中调用 point.x; 是不会发生空指针异常的.也就是说:在方法中,你把引用 所对应的对象的内容给改变了,它是会反应到对象上的
    ,这时,你再取对象的内容时,已经是你改变过了的!而无论你把传过去的引用如何
    改(point = null),该引用永远指向它原来 的那个对象!在这里说一点的就是:张老师在视频中说到当String 做为参数传递的时候,是由于String对象本身是不变对象所决定的! 上面的testPassByStirng 方法.
    而我自己的想法是:String 类型,它是不变对象,但它符合二:
    当它作参数传过去时,如果对引用操作如: paramString = "改变原来的值";
    这个所做的是: "改变原来的值" 其实就是String类的一个匿名对象,所以,你这样是在
    方法中,重新构造一个String 对象出来,然后这个对象的引用赋给paramString ,此时,
    把paramString 这个引用 给改变了,但传过来的引用并没有被改变!   
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-3-29 07:29 , Processed in 0.377496 second(s), 50 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表