Flutter-dart引用传递?值传递?

1. 基本数据类型

基本数据类型属于不可变,其表现为值传递 类似面向对象语言 如java

void main() {
  int a = 1;
  // b和a没有关系,b和a都是指向 一个int变量
  int b = a;
  print('>>>> init 常量:a ${a}');
  test(b);
  // b发生变更会重新创建一个int变量赋值给b所以 a指向的值不会变化
  ++b;
  print('>>>> modify 常量:a ${a}');
  print('>>>> modify 常量:b ${b}');
}

void test(int t) {
  t = t + 1;
}
>>>> init 常量:a 1
>>>> modify 常量:a 1
>>>> modify 常量:b 2

2. 对象类型

其在dart同样是引用传递。

void main() {
  Person p = new Person();
  p.age = 10;
  print('>>>> init 对象:p ${p.hashCode} ${p.age}');
  Person p2 = p;
  // 同常量,p2和p都是指向对象
  // 修改p2的对象属性值会同步反映到p 即类似java面向对象语言一样。
  testP(p2);
  print('>>>> modify 对象:p ${p.hashCode} ${p.age}');

  print('-' * 50);
  print('对象模拟变量赋值测试');

  Person p3;
  print('>>>> init 对象:p ${p.hashCode} ${p.age}');
  p3 = p;
  // 区别与上诉直接修改对象属性,这里直接修改对象指向 new新的对象再修改属性值,p就不会变化了 表现同常量
  p3 = new Person();
  testP(p3);
  print('>>>> modify 对象:p ${p.hashCode} ${p.age}');
  print('>>>> 对象:p3 ${p3.hashCode} ${p3.age}');
}

class Person {
  int age = 0;
}

void testP(Person p) {
  print(">>>>>>>>>>>> 修改对象值 <<<<<<<<<<<<<");
  p.age++;
}

>>>> init 对象:p 976145798 10
>>>>>>>>>>>> 修改对象值 <<<<<<<<<<<<<
>>>> modify 对象:p 976145798 11
--------------------------------------------------
对象模拟变量赋值测试
>>>> init 对象:p 976145798 11
>>>>>>>>>>>> 修改对象值 <<<<<<<<<<<<<
>>>> modify 对象:p 976145798 11
>>>> 对象:p3 468643881 1

3. List类型

同样是引用类型,分为深拷贝和浅拷贝

void main() {
  List c = ['a', 'b'];
  print('>>>> init 集合:c ${c.hashCode} ${c}');
  List d = c;
  // 等同于创建新的List赋值给d
  //   d = ['ba','bb'];
  //   d.add('new');
  // 没有d = ['c']; 直接add相当于修改Person对象的age属性 会同步修改d与c
  //   c.add('W');
  // 非深拷贝 修改c会同步修改到d
  testList(c);
  print('>>>> modify 集合:c ${c.hashCode} ${c}');
  print('>>>>集合:d ${d.hashCode} ${d}');

  print('-' * 50);
  c = ['a', 'b'];
  d = List.from(c);
  //   d = ['d','e'];
  // 深拷贝后 修改c不会同步修改到d
  testList(c);
  print('>>>> modify 集合2:c ${c.hashCode} ${c}');
  print('>>>>集合2:d ${d.hashCode} ${d}');
}

void testList(List l) {
  print(">>>>>>>>>>>> 集合添加值 <<<<<<<<<<<<<");
  l.add('test');
}

>>>> init 集合:c 443855167 [a, b]
>>>>>>>>>>>> 集合添加值 <<<<<<<<<<<<<
>>>> modify 集合:c 443855167 [a, b, test]
>>>>集合:d 443855167 [a, b, test]
--------------------------------------------------
>>>>>>>>>>>> 集合添加值 <<<<<<<<<<<<<
>>>> modify 集合2:c 361308235 [a, b, test]
>>>>集合2:d 252117249 [a, b]

重新赋值d = [‘ba’,’bb’];相当于新建一个List赋值给d这时d与c将无关联 各自修改不影响,等同于List.from深拷贝

void main() {
  List c = ['a', 'b'];
  print('>>>> init 集合:c ${c.hashCode} ${c}');
  List d = c;
  // 等同于创建新的List赋值给d
  d = ['ba','bb'];
  //   d.add('new');
  // 直接add相当于修改Person对象的age属性 会同步修改d与c
  //   c.add('W');
  testList(d);
  print('>>>> modify 集合:c ${c.hashCode} ${c}');
  print('>>>>集合:d ${d.hashCode} ${d}');

  print('-' * 50);
  c = ['a', 'b'];
  d = List.from(c);
  //   d = ['d','e'];
  testList(d);
  print('>>>> modify 集合2:c ${c.hashCode} ${c}');
  print('>>>>集合2:d ${d.hashCode} ${d}');
}

void testList(List l) {
  print(">>>>>>>>>>>> 集合添加值 <<<<<<<<<<<<<");
  l.add('test');
}

>>>> init 集合:c 873237492 [a, b]
>>>>>>>>>>>> 集合添加值 <<<<<<<<<<<<<
>>>> modify 集合:c 873237492 [a, b]
>>>>集合:d 306726437 [ba, bb, test]
--------------------------------------------------
>>>>>>>>>>>> 集合添加值 <<<<<<<<<<<<<
>>>> modify 集合2:c 227779671 [a, b]
>>>>集合2:d 862786264 [a, b, test]

4. 数组

修改赋值操作,同步修改

void main() {
  var arrayA = ['Apple', 'Orange'];
  var arrayB = arrayA;
  testArray(arrayB);
  print('>>>> 数组 arrayA: ${arrayA.hashCode} ${arrayA}');
  print('>>>> 数组 arrayB: ${arrayB.hashCode} ${arrayB}');
}

void testArray(var array) {
  print(">>>>>>>>>>>> 集合添加值 <<<<<<<<<<<<<");
  array.add('test');
}

>>>>>>>>>>>> 集合添加值 <<<<<<<<<<<<<
>>>> 数组 arrayA: 94689520 [Apple, Orange, test]
>>>> 数组 arrayB: 94689520 [Apple, Orange, test]

新建’副本操作‘,修改互不影响

void main() {
  var arrayA = ['Apple', 'Orange'];
  var arrayB = arrayA;
  // 相当于新建副本 赋值给arrayA,此时arrayA与arrayB各自修改无关联
  arrayA = ['Banana'];
  print('>>>> 数组 arrayA: ${arrayA.hashCode} ${arrayA}');
  print('>>>> 数组 arrayB: ${arrayB.hashCode} ${arrayB}');
}

void testArray(var array) {
  print(">>>>>>>>>>>> 集合添加值 <<<<<<<<<<<<<");
  array.add('test');
}

>>>> 数组 arrayA: 434056743 [Banana]
>>>> 数组 arrayB: 825518412 [Apple, Orange]

4. 总结

Dart属于引用传递,不管基本数据类型还是对象等,而表现区别于如java等面向对象语言在于Dart的基本数据类型属于不可变,每次赋值修改都会创建’副本‘所以表现为 值传递。而对象、数组等属于可变,对于直接修改对象的属性表现为面向对象语言的引用传递会同步修改源对象,但当使用var a = new A();var b = a;b = new A();此时a与b是属于互不关联其表现就等同于基本数据类型,但区别与面向对象语言Java的表现。

本文链接:https://iichen.cn/?p=872
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇