引发我思考的就是下面这个错误提示 Only static members can be accessed in initalizers
什么 ???😮 double number=generateData();
dart 类可不可以这样写
☕ java 可以呀,what🤔 ,为啥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可以出现在成员变量初始化、初始化代码块、构造方法、成员方法中。
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️⃣ 处代码已经报错了
解释这个问题先说一下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 类名 查看字节码可以看到。
dart开发语言概览
【Java面试题】对于构造方法的疑问?——与类的初始化
java对象初始化详解