`
DoubleEO
  • 浏览: 157787 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

参数到底怎样传递?只有传值!!

阅读更多
只有传值!!
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

分享到:
评论
3 楼 qtalen 2010-01-02  
283933851 写道
应该说是 传递的是栈的副本 比较好一点

是的,基本类型在栈里面,会把值拷贝一份传过去。对象类型会把对象在栈里的引用拷贝一份传过去。对象本身在堆里面,不会复制
2 楼 283933851 2009-12-30  
应该说是 传递的是栈的副本 比较好一点
1 楼 nepenthe 2009-06-16  
靠,完全晕乎乎...

相关推荐

    winform委托窗口传值实例

    委托的声明通常包含方法的返回类型和参数列表,这使得我们可以确保只有与委托兼容的方法才能被赋值给它。 接下来,让我们看一个简单的委托定义例子: ```csharp public delegate void ValueTransfer(string value)...

    ios 委托代理传值demo

    例如,可以定义一个名为`ValueTransferProtocol`的协议,其中有一个`transferValue:`方法,接受传递的值作为参数。 ```swift protocol ValueTransferProtocol { func transferValue(_ value: Any) } ``` 2. **...

    VC MFC 窗口间参数传递 带说明文档

    在这个主题中,我们将深入探讨如何在MFC应用中进行窗口间的参数传递。 窗口间参数传递通常涉及到两种情况:一是主窗口向子窗口传递数据,二是不同子窗口间的通信。在MFC中,有多种方法可以实现这种通信,包括消息...

    IOS页面传值

    在iOS开发中,页面间的参数传递是常见的需求,它使得应用程序能够流畅地在不同界面间传递数据,确保用户操作的连续性。本文将详细介绍如何在iOS应用中实现页面之间的值传递,主要关注Objective-C和Swift两种语言的...

    android中activity管理及界面传值

    当你启动一个Activity时,可以将数据作为额外参数附加到Intent上,然后在目标Activity中通过`getIntent().getExtras()`获取这些数据。例如: ```java // 发送Activity Intent intent = new Intent(this, ...

    iframe父子传值

    如果`iframe`与父页面同源,可以通过修改`iframe`的`src`属性的URL查询参数来传递数据: ```javascript // 父页面设置 document.getElementById('myIframe').src += '?data=' + encodeURIComponent('我是数据'); /...

    url传值加密 DEC 加密过程

    URL传值是一种常见的网页间传递数据的方法,但这种方式很容易受到中间人攻击或者数据泄露的风险。为了提高安全性,通常会采用加密技术对传输的数据进行保护。本文将详细介绍一种基于数据加密标准(Data Encryption ...

    通过js文件,传值给flash

    在网页开发中,有时我们需要将JavaScript(JS)中的数据传递给Adobe Flash(SWF)文件,以便在Flash内容中使用这些数据。这个过程通常涉及到跨域通信,因为JS和SWF被视为不同的域。以下是实现“通过js文件,传值给...

    窗体间传值的几种方法,不同界面传值

    当创建新窗体时,可以通过传递参数给窗体的构造函数来传递数据。例如,在窗体A中创建窗体B的实例时,将需要传递的值作为参数传入,这样窗体B在初始化时就可以获取到这些值。 3. **委托与事件**: 委托是.NET框架...

    ASP.NET的几种页面传值方法

    QueryString 是通过URL参数传递值的方式,简单易用,适用于传递单个或少量不敏感的数据。例如,在 `a.aspx` 中点击按钮后,会将 `Label1` 的文本通过 `name` 参数添加到 URL,并重定向到 `b.aspx`。在 `b.aspx` 中...

    java学习参数传递 杨辉三角,大学java作业题

    本主题涉及两个核心知识点:Java中的参数传递机制以及如何实现杨辉三角的算法。 首先,我们来讨论Java中的参数传递。在Java中,函数参数的传递方式只有两种,即按值传递(Pass by Value)和按引用传递(Pass by ...

    java及C++中传值传递、引用传递和指针方式的理解

    在编程语言中,参数传递是函数调用时传递实参给形参的方式。Java和C++对待参数传递有着不同的处理机制,这主要体现在值传递、引用传递和指针方式上。 首先,我们来看Java的值传递。Java中,所有的参数传递都是基于...

    vue3父子组件传值.doc

    本文将详细探讨Vue3中如何使用`setup`语法糖格式来实现父子组件的数据传递,包括`defineProps`和`defineEmits`这两个关键函数的用法。 ### 1. `defineProps`: 接收父组件传递的数据 在Vue3中,父组件向子组件传递...

    URL的参数中有加号传值变为空格的问题(URL特殊字符)

    在处理URL参数时,可能会遇到一些特殊字符问题,比如本文提到的“URL的参数中有加号传值变为空格”的问题。这个问题源于URL编码的规则。 URL编码是一种将特殊字符转换为ASCII码的过程,以便于在网络传输中正确解析...

    C# 两个窗体之间实时传递数据的实例

    这种方式不仅使数据传递变得简单,还能确保数据的实时性和安全性,因为事件订阅者只有在数据真正改变时才会收到通知。同时,由于主窗体和子窗体之间没有直接的引用,降低了耦合度,有利于代码的维护和扩展。 在项目...

    iOS传值Demo.zip

    例如,在一个函数中,你可以定义一个Block作为参数,当该函数执行完成时,会调用这个Block来传递结果。Block还可以用来简化代码,避免创建单独的回调函数。 其次,**单例模式**是一种设计模式,保证一个类只有一个...

    Qt5_QThread_信号传递

    由于只有UI主线程才可以操作桌面UI,那么在多线程中,其它线程的数据若要显示出来,可以通过全局共用变量来实现,或者通过线程通信的方式来实现,本例程就是通过UI上的按钮启动线程,在线程中发送信号到UI主线程,并...

    ios-传值.zip

    使用Block进行数据传递,可以直接将Block作为参数传递给方法,当需要返回结果时,直接在Block内执行。这种方式更加灵活,不需要显式定义接口,适合一次性使用的回调。例如,UIWebView的`...

    ios-iOS八种传值.zip

    通过Block作为参数,可以在函数或方法之间传递代码块,实现复杂的数据交互。 4. **KVO(Key-Value Observing)**:KVO允许对象监听另一个对象的某个属性变化,当被观察的属性改变时,会自动调用观察者的回调方法。 ...

    Kotlin实现页面互相跳转和互相传值源代码

    在Android应用开发中,页面之间的跳转和数据传递是至关重要的功能。Kotlin作为一种现代、类型安全且极其适合Android开发的编程语言,提供了简洁而高效的方式来处理这些任务。本篇文章将深入探讨如何使用Kotlin在...

Global site tag (gtag.js) - Google Analytics