public class Point
{
private int x;
private int y;
public Point(int x,int y)
{
this.x = x;
this.y = y;
}
public int getX()
{
return x;
}
public void setX(int x)
{
this.x = x;
}
public int getY()
{
return y;
}
public void setY(int y)
{
this.y = y;
}
}
public class ParameterTest
{
public void changeInt(int a)
{
a = 3;
}
public void changePoint(Point point)
{
point.setX(5);
point.setY(6);
}
public void changeString(String str)
{
str = "abc";
System.out.println(str);
}
public static void main(String[] args)
{
int a = 1;// 语句(1)
ParameterTest pt = new ParameterTest();// 语句(2)
pt.changeInt(a);// 语句(3)
System.out.println(a);// 语句(4)
Point point = new Point(1, 2);// 语句(5)
pt.changePoint(point);// 语句(6)
System.out.println(point.getX());// 语句(7)
System.out.println(point.getY());// 语句(8)
String str = "xyz";// 语句(9)
pt.changeString(str);// 语句(10)
System.out.println(str);// 语句(11)
System.out.println(pt);
}
}
问题1:当执行完语句(4)后,打印的结果是什么?为什么?
解答:当执行完语句(4)后,打印的结果是1。分析:首先调用定义 int a = 1;然后调用对象的changeInt(int a)方法,流程转到changeInt方法里面去,把a的值赋给了方法changeInt的形式参数,changeInt方法里面参数a的值为1,然后执行性方法体里的语句a = 3,即是将changeInt方法里面参数a的值由1改为3;注意:这个时候对方法changeInt方法里面参数a的值改变并没有影响到main方法里面的a的值,为什么?对于原生数据类型来说,它仅仅是把 main方法里面的a的值传过去,传值完后,两者之间没有任何的关系,你在changeInt方法里面对参数a的改变,对外面main方法的a没有任何的影响。因为我只是把值拷贝一份给你,拷贝完以后,你是你的我是我的,两者之间没有任何关系。因此,当执行完语句(4)后,打印结果是1。
总结:对八种原生数据类型来说,它们传递的时候传递的是它们的值(value),是值的拷贝,拷贝过去过后,你是你,我是我,两者之间无任何关系。所以,方法里面对拷贝过来的值的改变,对被拷贝的原生数据类型没有任何的影响。
问题2:当执行完语句(7)(8)后,打印的结果是什么?为什么?
解答:当执行完语句(7)(8)后,打印的结果分别是5,6。分析:语句(5)Point point = new Point(1,2),首先生成一个横坐标是1,纵坐标是2的Point对象,因为有关键字new...,point是指向刚生成的这个对象的引用,即是刚生成的对象的内存地址,接着执行语句(6),调用changePoint方法,它会把引用point传过去赋值给changePoint(Point point)里面的point.注意:传的是引用,即是对象的内存地址,接着把对象的x改为5,y改为6,这时对象的横纵坐标发生了改变,分别变为5和 6。也就是说,在changePoint方法里面,对point所指向的对象的x和y的改变会反应到你外面生成的这个对象,也就是1被改成了5,2被改成了6。这个对象为什么会改变?这就涉及到 java对引用类型的传递方式上,首先语句(5)表示在内存的堆里面生成了一个Point类型的对象,point这个引用它指向堆里面生成的Point类型的对象,这个对象里x坐标是1,y坐标是2。接着去调用changePoint方法,在调用这个方法的时候,它会把point这个引用传给 changePoint方法里面的point参数。在java里面,引用在java里面是对象在内存堆里面的地址,它是把对象的地址传递到了 changePoint方法里面去了。地址本身也是一个int类型的值,它把地址通过参数的形式传递过去。举例:比如说new Point(1,2)这个对象在内存堆中的地址是1234,那么调用changePoint方法,它传给changePoint(Point point)里面的point的地址也是1234,changePoint方法外面的引用指向了堆里面生成的Point类型的对象,那么对 changePoint方法里面的参数引用也指向同一个堆里面生成的Point类型的对象,java里面只要有两个引用它们的地址是一样的必然指向同一个对象。所以说当changePoint方法调用的时候,方法里面的引用和方法外面的引用它们指向的是同一个对象,究其原因它们是内存地址的传递,两个引用的内存地址是一样的必然指向同一个对象。通过执行changePoint方法里面的语句,把这个引用指向的对象的x改为5,y改为6。然后方法结束,结束之后,我打印changePoint方法外面这个引用它所指向对象的x坐标和y坐标,因为这两个引用指向的是同一个对象,所以结果是5和6。
问题3:当执行完语句(11)后,打印的结果是什么?为什么?
解答:当执行完语句(11)后,打印的结果是xyz。分析:语句(9) String str = "xyz";表示str这个引用指向常量"xyz"(在String Pool里面),当执行语句(10)的changeString(String str)方法时,将全局的str引用传递给changeString方法里面的str,这时会导致全局的str引用和changeString方法里面的引用会指向同一个对象"xyz",所以当完成参数传递还没有执行方法里面的语句体的时候,它们的引用是指向同一个对象"xyz"的,接着执行方法体里面的语句,这时会在String Pool里面生成一个"abc"的对象,同时将方法体里面的str指向String Pool里面的"abc"对象。一个引用在某一时刻始终只能指向一个对象,changString方法外面的str始终是指向"xyz"对象的。所以输出的时候始终是"xyz"。
总结: 在java里面,对方法的参数传递,不管是原生数据类型还是引用类型,一律是传值:pass by value。对原生数据类型来说,传递的值就是它被赋予的那个值,比如说 int a = 3 就把3这个值传到方法里面去;引用类型来说,引用本身是一个地址,是一个int类型的内存地址值,所以说它把这个值传递到方法里面去传递的也是值。
分享到:
相关推荐
Java常见笔试_面试题目深度剖析
提供的资源如"Java常见笔试、面试题目深度剖析一(未加密).exe"和"Java常见笔试,面试题目深度剖析.ppt"应包含了对这些知识点的详细解析和实例,对于复习和准备是非常有价值的。建议考生结合这些资料进行系统性学习,...
Java常见笔试,面试题目深度剖析
根据提供的信息,我们可以深入探讨与“Java常见笔试、面试题目深度剖析第二、三讲”相关的知识点。虽然直接的视频或文档链接无法在此处查看,但根据标题和描述中提到的信息,我们可以推测出讲座可能涉及的一些核心...
经典Java笔试算法解析和代码:二分查找.zip 经典Java笔试算法解析和代码:二分查找.zip 经典Java笔试算法解析和代码:二分查找.zip 经典Java笔试算法解析和代码:二分查找.zip 经典Java笔试算法解析和代码:二分查找...
]Java常见笔试、面试题目深度剖析
在本节"Java常见笔试、面试系列深度剖析第3讲"中,我们将深入探讨Java编程语言的一些关键概念和常见问题,这些内容对于准备Java相关的笔试和面试至关重要。讲解由张龙和风中叶两位专家主讲,他们将分享丰富的经验与...
《风中叶 Java常见笔试、面试题目深度剖析》是一份专为Java开发者准备的资源,旨在帮助他们在求职过程中更好地应对各种笔试和面试挑战。这份资料包含了大量的Java编程相关的题目,涵盖了从基础知识到高级概念的各个...
以上是Java常见笔试面试题目所涵盖的主要知识点,通过深入学习和实践,可以提高Java程序员的专业技能和面试竞争力。在面试中,不仅要能够准确回答问题,还要能结合实际项目经验进行案例分析,展现自己的问题解决能力...
- **数据类型**:包括基本数据类型(如int、char、boolean)和引用数据类型(如类、接口、数组)。理解它们的区别和应用场景是Java程序员的基础。 - **变量**:学习如何声明、初始化和使用变量,以及变量的作用域...
1. **Java基础语法**:Java的基础包括变量、数据类型、运算符、流程控制语句(如if-else、switch-case、for、while)、方法定义和调用、数组等。掌握这些是Java学习的第一步。 2. **面向对象**:Java是纯面向对象的...
香港的JAVA程序员面试笔试题目可能涵盖以下几个关键领域: 1. **基础语法**:面试可能会开始于一些基本的语法问题,如类、对象、封装、继承、多态等概念。此外,接口、抽象类的区别及其使用场景也是常见的面试题。 ...
"Java常见笔试、面试系列深度剖析第三讲"可能涵盖了一系列关键概念,旨在帮助求职者或开发者更好地理解和掌握Java的核心特性。其中,"反射详解"是这次讲解的重点内容之一。反射在Java中扮演着至关重要的角色,它允许...
以下是对这些常见面试题目的详细解析: 1. **Java基础** - **变量与数据类型**:了解基本数据类型、引用数据类型,以及它们之间的转换。 - **运算符**:掌握算术、比较、逻辑、位运算符,理解它们的优先级和作用...
- 数据类型:Java分为基本数据类型(如int, double, boolean)和引用数据类型(如类、接口、数组)。理解它们的区别及其内存分配方式。 - 类与对象:掌握面向对象编程的核心概念,包括封装、继承、多态。 - 构造...
Java作为一门广泛使用的编程语言,其在笔试和面试中经常出现的题目往往涵盖了语言的核心概念和技术。本资源主要聚焦于两个关键主题:Java数组和异常处理。数组是Java中的基本数据结构,而异常处理则是保证程序健壮性...