新手求助, dart 类创建和方法执行。

120 天前
 Dnlyao

代码如下

  Test().change();
  Test();
}

class Test {
  factory Test() => Test.print();
  var a = 1;
  change() {
    a = 2;
    print('change$a');
  }

  Test.print() {
    print('print$a');
  }
}

为什么会出现这样的结果

print1
change2
print1

最好能详细讲解一下,或者给出相关关键词,我自己去查资料

1400 次点击
所在节点    Flutter
12 条回复
AoEiuV020JP
120 天前
没看出什么会让人困惑的点,明显是每次创建 Test 时打印 print1 ,一共两次, 调 change 时打印了 change2 ,
jifengg
120 天前
不如楼主你说说你原本希望是啥结果,这样大家就知道你哪里不清楚了。
我和一楼一样,觉得没啥困惑点。
Dnlyao
120 天前
@jifengg 忘记说了,不好意思。就 change 先执行,想着是 a 一局被修改成 2 了,想着 print()打印的应该是 a=2 。
Dnlyao
120 天前
还有个问题,使用了工厂模式,他是会直接调用一次吗?就像第一次打印。我的理解是,main 中 1.change()。2 是 print().只有两个打印。
jifengg
120 天前
1:`factory Test() => Test.print();`
这里换成
```
factory Test(){
Test.print();
}
```
能让你更好理解。


2:
`Test().change();`
等价于:
```
var t = Test(); // 就是你定义的 factory
t.change();
```

这么拆解下来,能理解为什么先打印“print1”了吧?
Dnlyao
120 天前
@jifengg 理解,感谢回复。那为什么 a 的值会改不了,第一次是 1 ,因为初始化时是 1 ,然后 change 方法,a 不是应该是 2 吗?
jifengg
120 天前
@Dnlyao

```
print1
change2
print1 <------- 你是问这里为什么是 1 ?你认真的?
```
Dnlyao
120 天前
@jifengg 认真,真的理解不了这个。a 不是类里面的变量吗? change 方法改变了,为什么调用了,还是不行。还是说每次调用,等于 new Test()这样调用?
AoEiuV020JP
111 天前
9 天了,虽然没人回复,但我想楼主应该已经解决了吧,或者已经放弃编程了,
两个 Test()是生成了两个 Test 类的对象, 分别包含不同的 a ,第一个 Test 中的 a 确实改成 2 了, 但第二个 Test 中的 a 还是初始化时给的 1 ,
Dnlyao
110 天前
@AoEiuV020JP 理解,感觉半懂。感谢
sikong31
102 天前
这是成员变量,不是类变量,更不是捕获局部变量。成员变量自然每次创建都会是初始化的值
Dnlyao
102 天前
@sikong31 懂了,谢谢你。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1067916

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX