只有传值!!
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
分享到:
相关推荐
委托的声明通常包含方法的返回类型和参数列表,这使得我们可以确保只有与委托兼容的方法才能被赋值给它。 接下来,让我们看一个简单的委托定义例子: ```csharp public delegate void ValueTransfer(string value)...
例如,可以定义一个名为`ValueTransferProtocol`的协议,其中有一个`transferValue:`方法,接受传递的值作为参数。 ```swift protocol ValueTransferProtocol { func transferValue(_ value: Any) } ``` 2. **...
在这个主题中,我们将深入探讨如何在MFC应用中进行窗口间的参数传递。 窗口间参数传递通常涉及到两种情况:一是主窗口向子窗口传递数据,二是不同子窗口间的通信。在MFC中,有多种方法可以实现这种通信,包括消息...
在iOS开发中,页面间的参数传递是常见的需求,它使得应用程序能够流畅地在不同界面间传递数据,确保用户操作的连续性。本文将详细介绍如何在iOS应用中实现页面之间的值传递,主要关注Objective-C和Swift两种语言的...
当你启动一个Activity时,可以将数据作为额外参数附加到Intent上,然后在目标Activity中通过`getIntent().getExtras()`获取这些数据。例如: ```java // 发送Activity Intent intent = new Intent(this, ...
如果`iframe`与父页面同源,可以通过修改`iframe`的`src`属性的URL查询参数来传递数据: ```javascript // 父页面设置 document.getElementById('myIframe').src += '?data=' + encodeURIComponent('我是数据'); /...
URL传值是一种常见的网页间传递数据的方法,但这种方式很容易受到中间人攻击或者数据泄露的风险。为了提高安全性,通常会采用加密技术对传输的数据进行保护。本文将详细介绍一种基于数据加密标准(Data Encryption ...
在网页开发中,有时我们需要将JavaScript(JS)中的数据传递给Adobe Flash(SWF)文件,以便在Flash内容中使用这些数据。这个过程通常涉及到跨域通信,因为JS和SWF被视为不同的域。以下是实现“通过js文件,传值给...
当创建新窗体时,可以通过传递参数给窗体的构造函数来传递数据。例如,在窗体A中创建窗体B的实例时,将需要传递的值作为参数传入,这样窗体B在初始化时就可以获取到这些值。 3. **委托与事件**: 委托是.NET框架...
QueryString 是通过URL参数传递值的方式,简单易用,适用于传递单个或少量不敏感的数据。例如,在 `a.aspx` 中点击按钮后,会将 `Label1` 的文本通过 `name` 参数添加到 URL,并重定向到 `b.aspx`。在 `b.aspx` 中...
本主题涉及两个核心知识点:Java中的参数传递机制以及如何实现杨辉三角的算法。 首先,我们来讨论Java中的参数传递。在Java中,函数参数的传递方式只有两种,即按值传递(Pass by Value)和按引用传递(Pass by ...
在编程语言中,参数传递是函数调用时传递实参给形参的方式。Java和C++对待参数传递有着不同的处理机制,这主要体现在值传递、引用传递和指针方式上。 首先,我们来看Java的值传递。Java中,所有的参数传递都是基于...
本文将详细探讨Vue3中如何使用`setup`语法糖格式来实现父子组件的数据传递,包括`defineProps`和`defineEmits`这两个关键函数的用法。 ### 1. `defineProps`: 接收父组件传递的数据 在Vue3中,父组件向子组件传递...
在处理URL参数时,可能会遇到一些特殊字符问题,比如本文提到的“URL的参数中有加号传值变为空格”的问题。这个问题源于URL编码的规则。 URL编码是一种将特殊字符转换为ASCII码的过程,以便于在网络传输中正确解析...
这种方式不仅使数据传递变得简单,还能确保数据的实时性和安全性,因为事件订阅者只有在数据真正改变时才会收到通知。同时,由于主窗体和子窗体之间没有直接的引用,降低了耦合度,有利于代码的维护和扩展。 在项目...
例如,在一个函数中,你可以定义一个Block作为参数,当该函数执行完成时,会调用这个Block来传递结果。Block还可以用来简化代码,避免创建单独的回调函数。 其次,**单例模式**是一种设计模式,保证一个类只有一个...
由于只有UI主线程才可以操作桌面UI,那么在多线程中,其它线程的数据若要显示出来,可以通过全局共用变量来实现,或者通过线程通信的方式来实现,本例程就是通过UI上的按钮启动线程,在线程中发送信号到UI主线程,并...
使用Block进行数据传递,可以直接将Block作为参数传递给方法,当需要返回结果时,直接在Block内执行。这种方式更加灵活,不需要显式定义接口,适合一次性使用的回调。例如,UIWebView的`...
通过Block作为参数,可以在函数或方法之间传递代码块,实现复杂的数据交互。 4. **KVO(Key-Value Observing)**:KVO允许对象监听另一个对象的某个属性变化,当被观察的属性改变时,会自动调用观察者的回调方法。 ...
在Android应用开发中,页面之间的跳转和数据传递是至关重要的功能。Kotlin作为一种现代、类型安全且极其适合Android开发的编程语言,提供了简洁而高效的方式来处理这些任务。本篇文章将深入探讨如何使用Kotlin在...