V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Dnlyao
V2EX  ›  Flutter

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

  •  
  •   Dnlyao · Aug 26, 2024 · 2316 views
    This topic created in 609 days ago, the information mentioned may be changed or developed.

    代码如下

      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
    
    

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

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


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

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

    ```
    print1
    change2
    print1 <------- 你是问这里为什么是 1 ?你认真的?
    ```
    Dnlyao
        8
    Dnlyao  
    OP
       Aug 27, 2024
    @jifengg 认真,真的理解不了这个。a 不是类里面的变量吗? change 方法改变了,为什么调用了,还是不行。还是说每次调用,等于 new Test()这样调用?
    AoEiuV020JP
        9
    AoEiuV020JP  
       Sep 5, 2024   ❤️ 1
    9 天了,虽然没人回复,但我想楼主应该已经解决了吧,或者已经放弃编程了,
    两个 Test()是生成了两个 Test 类的对象, 分别包含不同的 a ,第一个 Test 中的 a 确实改成 2 了, 但第二个 Test 中的 a 还是初始化时给的 1 ,
    Dnlyao
        10
    Dnlyao  
    OP
       Sep 5, 2024
    @AoEiuV020JP 理解,感觉半懂。感谢
    sikong31
        11
    sikong31  
       Sep 13, 2024   ❤️ 1
    这是成员变量,不是类变量,更不是捕获局部变量。成员变量自然每次创建都会是初始化的值
    Dnlyao
        12
    Dnlyao  
    OP
       Sep 14, 2024
    @sikong31 懂了,谢谢你。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4715 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 10:06 · PVG 18:06 · LAX 03:06 · JFK 06:06
    ♥ Do have faith in what you're doing.