0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在dart实例化类class

CHANBAEK 来源:myfreax 作者:myfreax 2022-12-05 16:55 次阅读

Dart是面对象编程语言并且是基于mixin的继承方式。这意味着Dart不能继承多个类。

每个对象都是class类的实例,并且除了Null不是对象之外,其它对象都是Object派生对象。

基于Mixin的继承意味着每个类只有一个父类,一个类可以在多个类的主体中被重用,但Object对象除外。

Dart的扩展方法 Extension methods使你可以在不改变class类或者创建子类的情况下添加函数到类class。

在本教程中,我们将会说明如何在dart实例化类class,打印对象数据类型,初始化实例变量,访问实例变量。

Class类的成员

对象的成员由函数和数据,有时也成为方法与实例变量组成。当你调用一个方法时,是在一个对象上调用它。该方法可以访问对象的功能和数据。

你可以使用点符号.访问实例的变量和方法。当访问的属性可能为null空时,请使用?.代替.

var p = Point(2, 2);

// 访问p对象y实例变量.
assert(p.y == 2);

// 在对象p调用distanceTo()方法.
double distance = p.distanceTo(Point(4, 4));
// If p is non-null, set a variable equal to its y value.
var a = p?.y;

dart class实例化

你可以创建一个对象使用构造函数,构成函数的名称可以是类名ClassName或者ClassName.identifier

例如下面的代码创建Point 对象,使用Point()Point.fromJson() 构造函数。

你也可以使用可选的new调用构造函数创建对象,通常没有人会使用new关键词创建对象。

var p1 = Point(2, 2);
var p2 = Point.fromJson({'x': 1, 'y': 2});

var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});

某些class类会提供一个常量构造函数,它可用于创建编译常量。要创建常量构造函数,请将const关键词放在构造函数名称的前面。

当创建两个同样的编译时常量,它们的实例是一样的。在常量的上下文,构造函数或者字面量可以省略const关键词。

您可以仅使用一次const关键词,在变量的前面添加const关键词创建常量的上下文。

var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);

assert(identical(a, b)); // 它们是同一个实例
// 这种方式使用非常多的常量关键词
const pointAndLine = const {
  'point': const [const ImmutablePoint(0, 0)],
  'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
};

// 使用const关键词创建常量上下文
const pointAndLine = {
  'point': [ImmutablePoint(0, 0)],
  'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};

如果常量构造函数在常量的上下文外部并且在调用的时候没有使用const关键词,它会创建一个非常量的对象。

var a = const ImmutablePoint(1, 1); // 创建一个常量
var b = ImmutablePoint(1, 1); // 不会创建常量

assert(!identical(a, b)); // 两个不同实例

Dart 打印对象数据类型

要在运行时获得一个对象的类型,你可以访问ObjectruntimeType属性,它会返回对象的类型。

要测试一个对象的类型请使用类型测试操作符,而不是ObjectruntimeType属性。

产品环境,测试对象类型的语句是object is Typeobject is Type 会比object.runtimeType == Type更稳定。

print('The type of a is ${a.runtimeType}');

// is 
if(a is Stream){
  print
}

实例变量

class Point {
  double? x; // 声明instance x,初始值是空null
  double? y; // 声明instance y,初始值是空null
  double z = 0; // 声明instance z,初始值是空null
}

在Dart,所有未初始化的实例变量是的值是空null。所有实例变量都会有一个隐式getter方法*。*

非最终Non-final实例变量和late final实例变量即使没有被初始化也会生成一个隐式的setter方法,更多详细的信息请参考Getters and setters。

如果初始化一个非late实例变量,值会在创建实例的时候被创建。在late实例变量初始化之前构造函数和初始化列表会先被执行。

class Point {
  double? x; // 声明实例变量 x,初始值是空 null
  double? y; // 声明实例变量 y,初始值是空 null
}

void main() {
  var point = Point();
  point.x = 4; // 使用x的setter方法
  assert(point.x == 4); // 使用x的getter方法
  assert(point.y == null); // 值默认是null.
}

实例的变量可以是final,这种情况下final的实例变量必须初始化。要初始化final, 非late实例变量。

请使用构造函数的参数或者使用构造函数的初始化列表。如果你需要在构造函数的主体之后初始化一个final的实例变量。

你可以工厂构造函数或者使用late final。在使用late final的时候要小心,late final没有初始化器添加到API

class ProfileMark {
  final String name;
  final DateTime start = DateTime.now();

  ProfileMark(this.name);
  ProfileMark.unnamed() : name = '';
}

结论

至此,你已经了解dart class的成员组成,dart class实例化,打印对象数据类型,初始化实例变量,访问实例变量。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    10

    文章

    1936

    浏览量

    34569
  • 函数
    +关注

    关注

    3

    文章

    4299

    浏览量

    62352
  • Class
    +关注

    关注

    0

    文章

    53

    浏览量

    19705
  • Dart
    +关注

    关注

    0

    文章

    9

    浏览量

    1741
收藏 人收藏

    评论

    相关推荐

    SystemVerilog中的参数

    类似于声明一个参数的module,我们也可以声明一个参数class。这个参数可以用来实例不同数值和类型的对象。
    发表于 12-01 09:09 2493次阅读

    何在tc377启动软件时检查SSH实例的内存是否已初始

    我有一个关于 SSH 内存初始的问题。 问题是:如何在 tc377 启动软件时检查 SSH 实例的内存是否已初始? 谢谢。
    发表于 05-22 06:48

    Altium19如何在Class中创建,并修改其对应走线颜色

    一. 我们在进行PCB设计的时候,一个PCB板上的信号线,电源线,地线等等太多了。那我们给它分成一的,就是我们常说的在Class中创建的了。我们创建
    发表于 11-26 11:26

    如何使用Python的? 优势有哪些?

    。  2.实例一个是通过在名后面加小括号“()”来实现的:  pupil=Student ()  “小学生”是“学生”这个的一个实例
    发表于 07-30 18:08

    请问如何在Vivado项目中实例hdl系统生成器输出的多个实例

    嗨,如何在Vivado项目中实例hdl系统生成器输出的多个实例?在vivado项目中很容易实例
    发表于 07-31 10:38

    何在VHDL代码中实例LVDS缓冲区吗?

    嗨,我正在为VC707eval板实现一个简单的VHDL程序,并且很难使用系统时钟。时钟是LVDS 200 Hz时钟。我在XDC文件中定义了SYSCLK_P / _N引脚。需要在代码中实例差分输入和输出缓冲区。你知道如何在VHD
    发表于 08-14 09:08

    加载的时机和过程

    加载机制把class文件加载到内存,并对数据进行校验,准备,解析,初始,形成可以被虚拟机直接使用的字节码加载的时机(触发的初始
    发表于 11-04 06:16

    python的理解与使用

    新式的写法,与之对应的是 Python 2 的经典写法。3. 如何实例?定义了之后,就可以通过下边的写法
    发表于 03-07 16:51

    python的继承

    ): def __init__(self, name, age, weight, grade):# 调用父实例方法People.__init__(self, name, age, weight
    发表于 03-08 16:40

    D放大器设计实例,Class D amplifier design example

    D放大器设计实例,Class D amplifier design example 关键字:D放大器,D
    的头像 发表于 09-20 19:12 1222次阅读

    C++封装:的作用域和实例

    C++封装:的作用域和实例
    的头像 发表于 06-29 14:28 3535次阅读
    C++封装:<b class='flag-5'>类</b>的作用域和<b class='flag-5'>实例</b><b class='flag-5'>化</b>

    box2d.dart Dart版的Box2D

    ./oschina_soft/box2d.dart.zip
    发表于 05-31 11:29 0次下载
    box2d.<b class='flag-5'>dart</b> <b class='flag-5'>Dart</b>版的Box2D

    参数Class中的静态属性

    static属性一般是在编译的时候就已经分配了内存,并被这个的所有实例共享, 也就是在仿真时刻0之前就已经完成了静态属性的内存分配。 但是,参数中的静态属性可能有所区
    的头像 发表于 12-02 09:17 1210次阅读

    dart语言的变量声明与初始

    变量是每一们语言的基础,在Dart中所有变量都是对象,并且都有一个初始的值null。
    的头像 发表于 12-08 16:47 1217次阅读

    何在普通中使用内部结构

    访问 public void fun ( ) { Inner in = new Inner(); //实例内部类的对象 in .print(); } //在Outer中的内部类 class
    的头像 发表于 10-10 16:26 400次阅读