一个关于Dart错误提示的思考

前情提要

引发我思考的就是下面这个错误提示 Only static members can be accessed in initalizers
在这里插入图片描述


什么 ???😮 double number=this.generateData(); dart 类可不可以这样写
☕ java 可以呀,what🤔 ,为啥java可以呢?

正片 🎉

java 类声明

public class Test {
    //调用成员方法,并把返回值返回赋给成员变量num
    public double number = this.generateData();
    private String name;

    //初始化代码块
    {
        System.out.println("----初始化代码块----" + this);
    }

    //构造方法
    public Test(String name) {
        this.name = name;
        System.out.println("构造方法----" + this);
    }

    private double generateData() {
        System.out.println("---generateData---");
        return Math.random() * 100;
    }

    @Override
    public String toString() {
        return "Test{" +
                "number=" + number +
                ", name='" + name + '\'' +
                '}';
    }
}

在一个类中this是指向当前类的实例对象的引用。在java类中this可以出现在成员变量初始化、初始化代码块、构造方法、成员方法中。

Dart 类声明

import 'dart:math';
class Test {
  //0️⃣
  double number=this.generateData();
  String name;

  Test(String name)
      : number = 10.0,
        name = "jack" {
    print('number=$number');
  }

  double generateData()=>Random(10).nextDouble();
}

看上去和java差不多,但是在 0️⃣ 处代码已经报错了

在这里插入图片描述

提示说 这个this 引用是无效的,那把this 去掉呢,结果还是错

在这里插入图片描述

提示说初始化只能访问静态成员,这里的成员(members)是指变量和方法。这个说法在dart文档 使用列的成员 中有说明

解惑 😎

解释这个问题先说一下dart 类组成
在这里插入图片描述

① 处是实例变量(或者说成员变量)
② 处初始化列表
③ 处是构造函数
④ 处是成员方法

💡 如果你在声明一个实例变量的时候就将其初始化(而不是在构造函数或其它方法中),那么该实例变量的值就会在对象实例创建的时候被设置,该过程会在构造函数以及它的初始化器列表执行前。dart 类 实例变量
⚠ 构造函数尚未执行,实例对象也就还未初始化,因此所有的实例成员都不能被访问,但是类成员可以。 dart 类 构造函数
在这里插入图片描述

根据上面💡 和 ⚠ 可知,实例变量赋值时在构造函数之前,构造函数之前 实例对象还未初始化,所以不能赋值阶段不能调用成员方法。
**总结:**dart类中可以访问this的地方有 构成函数、成员方法、初始化列表的等号的左边。

又惑 😣

dart 不行,那为啥java可以?

public static void main(String[] args) {
        Test test = new Test("kk");
    }

上面是java上创建对象的一种方式。对象创建的过程不是简单的执行构造方法那么简单。
1.首页要判断这个类是否已经加载,如果没有加载就开始执行加载操作
2.分配内存
3.java 虚拟机会调用一个 方法进行对象初始化,它和构造方法是对应的,这个方法是自动创建的,可以通过 javap -v 类名 查看字节码可以看到。
在这里插入图片描述

创建对象其实是调用了方法,写过jni的同学应该有印象,jni创建java对象是就是调用方法。
在 方法中会将变量初始化、初始化代码块、构造方法等按照顺序执行。所以java如果 public double number = this.generateData(); 这样写,实际上是在 方法中执行的。




以上就是我对这~~ 货 ~~惑的理解,如果有分析不对的地方,望大佬指正。

参考链接


dart开发语言概览
【Java面试题】对于构造方法的疑问?——与类的初始化
java对象初始化详解


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值