之前面试的时候遇到了这个问题,回答的很差,后面写的面经中稍微解答了这个问题,但是不太详细,就单独开一篇文章来说下这个问题。

首先给个结论,dart是值传递。我们每次调用函数,传递过去的都是对象的内存地址,而不是这个对象的复制。

先来看段代码

main(){

Test a = new Test(5);

print("a的初始值为:${a.value}");

setValue(a);

print("修改后a的值为: ${a.value}");

}

class Test{

int value = 1;

Test(int newValue){

this.value = newValue;

}

}

setValue(Test s){

print("修改value为100");

s.value = 100;

}

输出结果为:

a的初始值为:5

修改value为100

修改后a的值为:100

从这里可以看出是值传递,如果只是复制了一个对象,然后把这个新建的对象地址传递到函数里面的话,setValue()函数中的修改是不会影响到main函数中的a的,因为二者所引用的内存地址是不一样。

有些人可能会以以下代码反驳我:

main(){

int s = 6;

setValue(s);

print(s); //输出6,而不是7

}

class Test{

int value = 1;

Test(int newValue){

this.value = newValue;

}

}

setValue(int s){

s += 1;

}

你看,这输出的不是6吗,在dart中一切皆为对象,如果是引用传递,那为什么是6啊。

答案是这样的,在setValue()方法中,参数s实际上和我们初始化int s = 6的s不是一个对象,只是他们现在指的是同一块内存区域,然后在setValue()中调用s += 1的时候,这块内存区域的对象执行+1操作,然后在堆(类比java)中产生了一个新的对象,s再指向这个对象。所以s参数只是把main函数中的s的内存地址复制过去了,就比如java中的:

public class Test {

public static void main(String[] args) {

Test a = new Test();

Test b = a;

b = new Test();

}

}

我们只要记住一点,参数是把内存地址传过去了,如果对这个内存地址上的对象修改,那么其他位置的引用该内存地址的变量值也会修改。千万要记住dart中一切都是对象。

dart参数传方法_Dart是值传递还是引用传递?相关推荐

  1. dart参数传方法_Dart语法

    1.Dart程序运行的入口是main函数,所以写一段Dart程序时,必须要有main函数 void main(List args){ print("Hello Dart"); } ...

  2. dart参数传方法_为 JavaScript 开发人员准备的 Dart 参考教程

    Dart 是 Flutter 主要的开发语言,这一篇文章主要为 JavaScript 开发人员准备的 Dart 教程,我会用很详细的对比来参考,力争 JavaScript 开发人员可以快速的熟练使用 ...

  3. dart参数传方法_Flutter必备Dart语言快速入门

    作为Flutter专属的开发语言(当然Dart不知如此,也可以开发Web和服务端),面对对象.高性能.多端一致.热更新是Dart的优势所在,是Flutter开发必须掌握的语言,也正是Flutter的流 ...

  4. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  5. Java中传参数--值传递和引用传递

    ** Java中传参数–值传递和引用传递 ** 在Java中,传参数分为值传递和引用传递. 在Java中的数据类型分为两大类:一类是引用类型,也叫类类型(除了String以外的所有复合数据类型,包括数 ...

  6. 【值传递和引用传递之外的第三种传值方式 - 传名参数】

    引言 先看下Scala 的以下方法该如何调用那? class Demo {val assertIsOpen = truedef test(isTrue: () => Boolean): Unit ...

  7. 形参与实参, 值传递与引用传递, ref参数与out参数的区别和联系?

    一. 形参与实参 1.先来一例子: fun(int a) {........} Main () {   int b=0;   fun(b); } 其中,a是形参,b是实参. 2.再看理论定义 形参出现 ...

  8. java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

    java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java编程语言只有值传递参数. 当一个对象实 ...

  9. 【Java】探究Java方法的参数传递是值传递还是引用传递

    测试思路 每个更改形参的方法,返回值都是void,不同方法的参数设置不同类型. 注意在方法内测地址的时候在改之前测一下,才能看出传入参数是不是传了地址.(注意反正OS的内存地址是虚拟的,JVM中的也是 ...

  10. python是值传递还是引用传递_Python里参数是值传递还是引用传递?

    Python就是把一些参数从一个函数传递到另一个函数,从而使其执行相应的任务.但是你有没有想过,参数传递的底层是如何工作的,原理又是怎样的呢? 实际工作中,很多人会遇到这样的场景:写完了代码,一测试, ...

最新文章

  1. GCC 同时编译多个 C/C++ 文件
  2. 【leetcode】Roman to Integer
  3. 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第七章 App Widgets...
  4. Android之EventBus框架源码解析下(源码解析)
  5. Ajax单元测试傻瓜教程
  6. Leetcode 之Count and Say(35)
  7. 使用Sense操作ElasticSearch CRUD
  8. Oracle开发常用知识
  9. 《大话设计模式》——外观模式
  10. new thread后会阻塞主程序吗_阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...
  11. 自反而缩,虽千万人,吾往矣。
  12. php 常用时间处理函数,PHP date函数常用时间处理方法_PHP
  13. 语音识别结合应用场景之后
  14. 《剑指offer》面试题27——二叉搜索树与双向链表(C++)
  15. 金蝶与旺店通集成解决方案(金蝶为主)
  16. js+php+mysql写的rpg网页游戏引擎源码-DotK改进版
  17. HTML 学习总结2 框架 表单
  18. 蝴蝶曲线python_蝴组词有哪些?除了蝴蝶还可以组什么?蝴字的基本字义
  19. Webpack的基本使用
  20. TFT和STN液晶区别

热门文章

  1. 【JavaScript知识点五】javascript 流程语句
  2. stl空间配置器alloc
  3. CentOS 下安装maven3.04
  4. [DELPHI] 使用mod函数换行
  5. 【GIS开发者】(GISDeveloper) 11-14期 提供下载
  6. Spring源码之FactoryBean接口的作用和实现原理
  7. SpringBoot项目获取Spring容器中的bean
  8. 创业维艰,技术人创业如何少走弯路?
  9. Gallery 3D+倒影 滑动切换图片示例
  10. 开发移动网页应用的一些技术指导