18.

public class Test
{
public static void add3(Integer i)
{
int val=i.intvalue();
val+=3;
i=new Integer(val);
} public static void main(String args[])
{
Integer i=new Integer(0);
add3(i);
System.out.println(i.intvalue());
}
}

what is the result? b
A. compile fail B.print out "0" C.print out "3"
D.compile succeded but exception at line 3

这里考察的是 Java 中的值传递

在 Java 中,方法的参数的传递究竟是按值传递还是按引用传递,一直以来都是有争论的。争论的原因是因为 Java 中有两种数据类型,一种是基本数据类型,一种是引用数据类型。
先讲基本数据类型的参数传递。与 C 语言不同,将实际参数传递给方法后,对参数的改变不会影响到原来的参数。这是因为 Java 传递的是原来参数的拷贝,不会影响到原来的数值。
比如下面的例子

 public class Test
{
public int value = 0; public void add3(int value)
{
value++;
} public static void main(String[] args)
{
Test test = new Test();
System.out.println("value 的初始值为 " + test.value); System.out.println("调用 add3 方法后");
test.add3(test.value);
System.out.println("value 的值为 " + test.value);
}
}

输出结果为

value 的初始值为 0
调用 add3 方法后
value 的值为 0

接着说引用数据类型。引用数据类型变量存放的是内存地址,将引用变量拷贝一份传入方法内部,那么方法内部的变量和方法外部的变量指向的是同一个内存地址。方法内部做出的改变可能会影响到外部的数值。

将上面的例子改一下,传入Test对象的引用,如下

 public class Test
{
public int value = 0; public void add3(Test t)
{
t.value++;
} public static void main(String[] args)
{
Test test = new Test();
System.out.println("value 的初始值为 " + test.value); System.out.println("调用 add3 方法后");
test.add3(test);
System.out.println("value 的值为 " + test.value);
}
}

输出结果为:

value 的初始值为 0
调用 add3 方法后
value 的值为 1

但是,如果传入的引用不再指着原来的对象,而是转而指向了别的对象,外部的对象不会也随着指向另外的对象,因为 Java 是值传递的,传入的是值的拷贝。
题目的例子就是这样:

 public class Test
{
public static void add3(Integer i)
{
int val=i.intvalue();
val+=3;
i=new Integer(val);
} public static void main(String args[])
{
Integer i=new Integer(0);
add3(i);
System.out.println(i.intvalue());
}
}

i 指向 Integer 的对象,拷贝一份 i 传入方法后,就有两个 i 指向 Integer 对象,在方法内对 i 的属性的改变会影响到方法外部。

i = new Integer(val) 这句话创建了一个新的 Integer 对象,这时候方法内的 i 不再指向原来的 Integer 对象,而是指向新的 Integer 对象,而方法外部的 i 还是指向原来的 Integer 对象。

所以正确答案很明显了 B:print out "0"

SCJP_104——题目分析(5)的更多相关文章

  1. SCJP_104——题目分析(2)

    3. public class IfTest{ public static void main(String args[]){ int x=3; int y=1; if(x=y) System.out ...

  2. SCJP_104——题目分析(1)

    1.1) public class ReturnIt{2) returnType methodA(byte x, double y){3) return (short)x/y*2;4) }5) }wh ...

  3. SCJP_104——题目分析(4)

    14. which three are valid declaraction of a float? ADFA. float foo=-1; B. float foo=1.0; C. float fo ...

  4. SCJP_104——题目分析(3)

    11. what is reserved words in java?A. run B. default C. implement D. import Java 中,给标识符取名的时候,不能使用关键字 ...

  5. SCTF 2014 pwn题目分析

    因为最近要去做ctf比赛的这一块所以就针对性的分析一下近些年的各大比赛的PWN题目.主防项目目前先搁置起来了,等比赛打完再去搞吧. 这次分析的是去年的SCTF的赛题,是我的学长们出的题,个人感觉还是很 ...

  6. 路由器漏洞复现分析第三弹:DVRF INTRO题目分析

    这个项目的目的是来帮助人们学习X86_64之外其他架构环境,同时还帮助人们探索路由器固件里面的奥秘. 本文通过练习DVRF 中INTRO 部分的题目来学习下MIPS 结构下的各种内存攻击. DVRF: ...

  7. 二分查找总结及部分Lintcode题目分析 2

    Search in a big sorted array,这个比之前的二分法模板多了一个很不同的特性,就是无法知道一个重要的条件end值,也是题目中强调的重点 The array is so big ...

  8. 【算法】题目分析:Aggressive Cow (POJ 2456)

    题目信息 作者:不详 链接:http://poj.org/problem?id=2456 来源:PKU JudgeOnline Aggressive cows[1] Time Limit: 1000M ...

  9. *CTF babyarm内核题目分析

    本文从漏洞分析.ARM64架构漏洞利用方式来讨论如何构造提权PoC达到读取root权限的文件.此题是一个ARM64架构的Linux 5.17.2 版本内核提权题目,目的是读取root用户的flag文件 ...

随机推荐

  1. maven上传自定义jar到本地仓库

    mvn install:install-file  -Dfile=D:/baidu/ueditor-1.1.1.jar  -DgroupId=com.baidu.ueditor  -Dartifact ...

  2. bootstrap 仿实例

    bootstrap实现一个网页 html文件 <!DOCTYPE html> <html> <head lang="en"> <meta ...

  3. oracle 大文本由clob来存

    file字段是varchar2类型(最多只能存储4000字符),空间不够用了,因此将其改为clob类型(支持4G存储量). 但是如果该字段中已经有数据,是不为空的,直接用语句改,会报错. 那么需要借助 ...

  4. JSP中的路径

    我的原则 所有路径一律使用绝对路径,就是以"/"开头的或者带host的路径.形如: /imgs/1.jpg <%= request.getContextPath()%> ...

  5. git 取消/添加 某文件的跟踪

    如果我们不小心将某个文件加入了 git 版本控制,但是突然又不想继续跟踪控制这个文件了,怎么办呢? 使用 git update-index 即可. 不想继续追踪某个文件 git update-inde ...

  6. 常用 cmd 命令

    msconfig-------系统配置实用程序 mspaint--------画图板 devmgmt.msc--- 设备管理器 diskmgmt.msc---磁盘管理实用程序 services.msc ...

  7. 【开源java游戏框架libgdx专题】-11-核心库-演员类

    演员类,又称为Actor类,是libgdx开发中最基本的元素,可以被继承. 演员类,从OpenGL类的角度来理解,可以称为一个二维场景节点.它本身具有位置(postion).边界矩形(类似Retang ...

  8. LINQ:使用Take和Skip实现分页

    随便找的,还没有试过代码. class Program { static int Main() { //每页大小 ; //页码 ; //源数据 string[] names = { "贤静& ...

  9. MySql Connector/Net Mysql like 搜索中文的问题(c#和asp.net连接mysql)

    Connector/Net 6.9.8 选择.net/mono即可,不需要安装. 将对应版本的MySql.Data.dll复制到bin目录下即可使用 http://dev.mysql.com/down ...

  10. Android模拟器访问本地的localhost失败及解决方案

    在开发手机网站是,使用Android模拟器测试,在手机浏览器中输入localhost访问本地服务器失败! 原因: 在Android系统中localhost就是127.0.0.1 在Windows系统中 ...