只有传值!!
import java.awt.Point;
public class PassByValue
{
public static void main(String[] args)
{
Point p = new Point(0,0);
int i=10;
System.out.println("修改之前是: p="+p+"i="+i);
modifyPoint(p, i);
System.out.println("修改完是: p="+p+"i="+i);
}
public static void modifyPoint(Point pt,int j)
{
pt.setLocation(5, 5);
j=15;
System.out.println("在modifyPoint方法中 pt="+pt+"j="+j);
}
}
结果:
修改之前是: p=java.awt.Point[x=0,y=0]i=10
在modifyPoint方法中 pt=java.awt.Point[x=5,y=5]j=15
修改完是: p=java.awt.Point[x=5,y=5]i=10
关于
基本类型。传递的是值,这个值怎么理解,代码中的i只是一个值的提供者,他仅仅负责提供一个值,这个值是10,相对于modifyPoint()他就没什么用了,他自己不会搭进去,换种想法,无论什么提供者,就是能产生值而已,就这么点功能,夸张的说,你本人跑程序里,提供个值,你又跑出来,值让人家用着,和你没关系,所以这个提供者是什么都不要紧,关键的是这个值。
代码中反应就是main中的i未发生改变,还是10.许多人都说这是i的副本传进去了,不知道官方有没有这种说法,但是这样的说法我认为非常贴切,可以更好的理解传值。
关于
对象类型。对象的传递分歧就多了,这个误解源于
引用
【所有的java objects 都是 object references】这一事实。引用自Peter·Haggar
,回到程序中,传递进modifyPoint()方法是值,是什么值?引用的值,而不是对象的值,用副本来说,就是引用的副本,而不是对象的副本,
引用
【java以by value方式传递object references】
,什么是引用的值,引用中存的是对象的内存地址!地址就是引用的值,地址干什么用?指向引用的对象!所以p和pt指向相同的对象,pt改变了对象的值,那么p所引用的对象也受影响.
和基本类型有一些区别,对象类型传值,p也只是值的提供者,和他本身无关,他自身是引用吗,但是与他引用的对象有关,他把值(地址)的副本传递进去了,这个玩意可以找到对象啊,所以相应的对象也改变了。
modifyPoint()一直在和同一个对象打交道。
如果不想在modifyPoint中改变Point对象,2种方法可以。
(1)对modifyPoint()传递一个Point对象的克隆版本。
modifyPoint()方法传入的形参改变了
modifyPoint((Point)p.clone(), i);
修改之前是: p=java.awt.Point[x=0,y=0]i=10
在modifyPoint方法中 pt=java.awt.Point[x=5,y=5]j=15
修改完是: p=java.awt.Point[x=0,y=0]i=10
(2)令Point对象成为immutable(不可变的)。
final Point p = new Point(0,0);
修改之前是: p=java.awt.Point[x=0,y=0]i=10
在modifyPoint方法中 pt=java.awt.Point[x=5,y=5]j=15
修改完是: p=java.awt.Point[x=5,y=5]i=10
分享到:
相关推荐
关于Java参数传递的PPT,详细介绍参数传递的类型。彻底理解Java只有唯一传递方式——值传递。
只有一个按钮,当点击后会将安卓端的字符串传到HTML页面并且安卓端打印从HTML获得的返回值
为什么 Java 只有值传递,但 C++ 既有值传递,又有引用传递呢?今天我们就来探讨下这个问题,有需要的朋友可以参考下
参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程。参数传递有3种方式: 值传递 地址传递 引用传递 tips: 被调用函数的形参只有函数被调用时...
定义: 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。 完成了一个currying 函数的编写。当调用cost() 时,如果明确地带上了一些参数,表示此时并不进行真正的求值计算,而是把这些参数保存...
·用实参数向形式参数传递数据; ·为获得数据参数及在函数体中声明的变量分配存储空间; ·中断现行(调用)函数,把流程向被调用函数的入口处,开始执行被调函数。 当参数表为空时,表示该函数不从调用...
post和put有三个参数,url,data和config,所以在使用这两个时,可以写成axios.post(api,{id:1}),axios.put(api,{id:1}),但是delete只有两个参数:url和config,data在config中,所以需要写成 axios.delete(api,{data...
然后调用函数使这两个变量的值交换,并且要求被调函数的传值通过传递指针来实现。程序1.1 代码如下:#include<iostream>#include<string>using namespace std;int main(){ string str1=”I love China!”,str2=”I ...
注意:如果页面中只有一个弹出窗口此参数可以不写,但页面中如果有1个以上的弹出窗口则一定要加此参数。 title:窗口的标题文本参数值:默认lhgdialog弹出窗口,窗口标题的文件字符。 width:窗口的宽度参数值:...
·用实参数向形式参数传递数据; ·为获得数据参数及在函数体中声明的变量分配存储空间; ·中断现行(调用)函数,把流程向被调用函数的入口处,开始执行被调函数。 当参数表为空时,表示该函数不从调用...
0427 如何实现双击表格行超级链接到另一页并传递参数 235 0428 如何实现单击表格行改变颜色 235 0429 鼠标移动改变表格行的颜色 235 0430 如何在Web页中使用表格控件 236 10.5 Web.Config文件的配置 237 ...
没有最全,只有更全!!! world版全面开放 0、ANDROID常用类库说明 6 1、ANDROID文件系统与应用程序架构 7 1.1、ANDROID 文件系统 7 1.2、ANDROID应用程序架构 9 2、ANDROID应用程序结构 11 2.1、ACTIVITY 12 ...
不管是向函数传递参数或者是任何形式的对象复制来说,不可变对象(比如整数,字符串)被真正复制,而可变对象只是复制了一个对他们的引用,即在内存中只有一份对象,而引用两份。 a=b 这样的赋值,就会创建对b的...
向方法传递结构时,是通过传值方式传递的,结构实例化可以不用new,结构可以声明构造函数,但必须带参数,且声明的构造函数是用来对成员初始化的,必须包含每个字段。结构不能从另一个结构或类继承而来,但可以实现...
为了避免这样的警告,C++允许声明一个无名形参,以告诉编译器存在该参数,且调用者需要为其传递一个实际参数,但是函数不会用到这个参数。下面给出使用了无名参数的C++函数代码: int fun(int x,int) //注意不同点...
24 <br>0051 变量的作用域 25 <br>2.5 其他 26 <br>0052 有效使用this对象 26 <br>0053 如何声明变量 26 <br>0054 如何声明相同类型的多个变量 26 <br>0055 利用Object变量传递参数 ...