一:
1 :如果参数是基本数据类型(四类八种:byte,short,int,long,double,float,double,boolean,char),
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 这个引用 给改变了,但传过来的引用并没有被改变!
分享到:
相关推荐
Java原生数据类型 学习
java系列之原生数据类型 解压密码 www.jiangyea.com
简单webview嵌套html文件,原生和js互相调用方法,互相传递参数并打印都页面上
主要总结了java中常用的八个原生数据类型,byte,short,int,long,float,double,char,Boolean。
主要是针对java中的八种原生数据类型,byte,short,int,long,float,double,char,Boolean使用的陷阱进行了总结
android原生和js交互传递参数 包含特殊字符 例如"\'"等情况 避免Uncaught SyntaxError: missing ) after argument list 避免JSON.parse失败等情况 利于快速和webview交互 加速开发过程
使用java8 scoket 实现西门子s7协议 可以读写 s7系列全部plc 没有dll 文件 纯原生java
java基于原生的MySql的JDBC分页组件,我没有做jsp页面,我感觉那样很low,基本上可以套用我的分页组件,对于初学者帮助很大
使用java的UrlConnection实现的简单的HTTP请求。
RoboVM 编译器可以将 Java 字节码翻译成 ARM 或者 x86 平台上的原生代码,应用可直接在 CPU 上运行,无需其他解释器或者虚拟机。RoboVM 同时包含一个 Java 到 Objective-C 的桥,可像其他 Java 对象一样来使用 ...
Java API原生文档
NDK编译 JAVA JNI 原生调用,需要的下载吧,
JAVA 读取串口数据,推荐使用串口调试工具先测试成功在使用。
JSON转成特定对象集合
使用java原生jdbc完成数据的增删改查
通过java原生的API实现短信发送,方便在linux环境下直接运行jar包进行功能验证,如果代码有问题欢迎评论
“云原生”数据安全面临的挑战:云“原生”的新威胁和攻击模式 “云原生”数据安全面临的挑战与机遇 基于IPDRR模型构建数据安全治理体系 腾讯云原生安全架构 腾讯云原生数据安全技术蓝图 极简化云上数据安全保护和...
Java 原生包 BitSet 源码,0~3年 Java 工程师必看,属于高级数据结构,利于进阶,面试必备!
【Android 前台】66828新UI新版JAVA原生双端影视APP投屏影视APP源码_1【Android 前台】66828新UI新版JAVA原生双端影视APP投屏影视APP源码_1【Android 前台】66828新UI新版JAVA原生双端影视APP投屏影视APP源码_1...