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实例化,打印对象数据类型,初始化实例变量,访问实例变量。

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

    关注

    9

    文章

    1878

    浏览量

    33070
  • 函数
    +关注

    关注

    3

    文章

    3866

    浏览量

    61308
  • Class
    +关注

    关注

    0

    文章

    52

    浏览量

    19515
  • Dart
    +关注

    关注

    0

    文章

    9

    浏览量

    1727
收藏 人收藏

    评论

    相关推荐

    Java序列的机制和原理

    对序列对象的其他描述。Java的序列算法序列算法一般会按步骤做如下事情:◆将对象实例相关的元数据输出。◆递归地输出
    发表于 07-10 07:27

    如何实例Ag3497x?

    其他USB仪器)智能地我想以编程方式发现传输名称。我不知道如何实例Ag3497x,所以我可以访问所有的方法和属性。上面我被迫输入一个字符串“USB0 :: 0x0957 ....”我想发现有多少设备
    发表于 10-14 12:13

    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静态方法与方法

    例子,如下这段代码中,run 普通的实例方法,eat 是静态方法,jump 是方法。class Animal: def __init__(self, name):self.name = name
    发表于 03-07 16:56

    python的继承

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

    python的多态和的property属性

    python的多态多态,是指在同一型下的不同形态。比如下面这段代码class People: def speak(self):passclass American(People): def
    发表于 03-09 16:38

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

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

    dart-collab同步型文档编辑工具

    ./oschina_soft/dart-collab.zip
    发表于 05-24 09:18 3次下载
    <b class='flag-5'>dart</b>-collab同步型文档编辑工具

    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

    Dart 3将成为100%健全的空安全语言

    Dart 通过一系列的静态和运行时检查来提供健全的空安全。每一个使用了空安全的 Dart 库都会拥有所有的静态检查和更严格的编译期的错误提醒。对于包含了空安全库的混合模式程序也是如此。
    的头像 发表于 12-12 14:48 463次阅读