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. zoj 2404 最小费用流

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2404 #include <cstdio> #incl ...

  2. Hdu 3887 Counting Offspring \ Poj 3321 Apple Tree \BZOJ 1103 [POI2007]大都市meg

    这几个题练习DFS序的一些应用. 问题引入: 给定一颗n(n <= 10^5)个节点的有根树,每个节点标有权值,现有如下两种操作: 1.C x y     以节点x的权值修改为y. 2.Q x ...

  3. angularJS promise $q

    Promise 一 介绍 1.什么是promise 我们知道JavaScript语言的执行环境是“单线程”,所谓单线程,就是一次只能够执行一个任务,如果有多个任务的话就要排队,前面一个任务完成后才可以 ...

  4. CentOS7 盒盖休眠

    https://wiki.archlinux.org/index.php/Power_management_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) CentOS ...

  5. Struts2接收参数的几种方式

    一.用Action属性 在action里定义要接收的参数,并提供相应的set和get方法. 如: public class LoginAction extends ActionSupport { pr ...

  6. [每日一题] OCP1z0-047 :2013-08-14 如何理解USING INDEX?...................................41

    正确答案:B 一.USING INDEX的实验: .USING INDEX可以让你在创建主键.唯一性约束的时候使用指定的索引或创建索引.或修改索引的存储结构. OK,我先不用USING INDEX,创 ...

  7. 诡异的TNS-12541:TNS:nolistener

                                             诡异的TNS-12541:TNS:nolistener   OS:Microsoft Windows 2003 Ent ...

  8. static对象的高级用法

    1. 函数里static对象是local的,其他如全局对象,类里的static对象都是非local的,会在程序初始化中提前创建 2. 非local的对象的创建无法确定先后次序,但能保证在main函数前 ...

  9. KMP和扩展KMP【转】

    这种东西基本上在纸上自己推导一下就能做出来XD 转发注明出处 KMP 给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i] (0<=i ...

  10. JSON和JSONP区别

    JSON(JavaScript Object Notation)和JSONP(JSON with Padding) JSON是一种数据交换格式,JSONP是一种跨域数据交互协议 JSONP利用scri ...