Dart是一个面向对象的语言,同时增加了混入(mixin)继承的特性。对象都是由类初始化生成的,所有的类都由Object对象继承。混入继承意味着尽管所有类(除了Object类)只有一个父类,但是类的代码体可以在多个类中重复使用。(个人理解:mixin,extends,implements,extends是类似java单继承,implements类似java的多接口实现,但这些都是运行时使用,mixin应该是在编译时使用,类似于jsp的include,比如 A with B,其实是在编译时,将两个类的代码合并,编译成classes) 。

Using class members 类成员

对象由成员变量和方法构成。你可以用点(.)调用方法或者成员变量

var p = Point(2, 2);

// Set the value of the instance variable y.
p.y = 3; // Get the value of y.
assert(p.y == 3); // Invoke distanceTo() on p.
num distance = p.distanceTo(Point(4, 4));
Use ?. instead of . to avoid an exception when the leftmost operand is null: // If p is non-null, set its y value to 4.
p?.y = 4;

Using constructors 构造方法

你可以用构造方法创建对象,构造方法是ClassName或者ClassName.identifier.下面是构造方法的两种写法:

Point() and Point.fromJson() constructors:

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

下面的构造方法多了new关键字:

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

版本注意:new 关键字在Dart2中是可选的

一些类提供了静态构造方法。当你需要这些创建编译常量对象,可以在构造对象代码前加上const关键字。

var p = const ImmutablePoint(2, 2);

两个相同入参的编译对象常量是相等。

var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1); assert(identical(a, b)); // They are the same instance!

在编译常量上下中,可以忽略后续的const关键字,也可以达到同样效果

// Lots of const keywords here.
const pointAndLine = const {
'point': const [const ImmutablePoint(0, 0)],
'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
};

这是简化的写法:

// Only one const, which establishes the constant context.
const pointAndLine = {
'point': [ImmutablePoint(0, 0)],
'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};

如果用常量构造器初始化对象,但是没有加入const关键字,它将是非常量对象

var a = const ImmutablePoint(1, 1); // Creates a constant
var b = ImmutablePoint(1, 1); // Does NOT create a constant assert(!identical(a, b)); // NOT the same instance!

版本注意: const关键字的忽略写法在Dart2中才有效

Getting an object’s type 获取对象类型

在运行时获取对象的类型,你可以用Object的对象的 runtimeType属性。

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

Instance variables 成员变量

下面是如何定义成员变量:

class Point {
num x; // Declare instance variable x, initially null.
num y; // Declare y, initially null.
num z = 0; // Declare z, initially 0.
}

所有为初始化变量的值是null.

所有成员变量都内置get方法。非final的成员变量内置了set方法。

class Point {
num x;
num y;
} void main() {
var point = Point();
point.x = 4; // Use the setter method for x.
assert(point.x == 4); // Use the getter method for x.
assert(point.y == null); // Values default to null.
}

如果你在成员变量的定义时就进行初始化,在对象创建时,它将先于构造器和初始化列表执行。

Constructors 构造器

类构造器是和类名同名的函数,(其中还有一种命名构造函数的写法,后续介绍)。

class Point {
num x, y; Point(num x, num y) {
// There's a better way to do this, stay tuned.
this.x = x;
this.y = y;
}
}

上面的例子中,thisg关键字可以读取成员变量。

注意:使用this只有在方法参数和成员变量有冲突时才用,其它场景可以不写

如果构造器的入参和成员变量对应,可以直接赋值,可以用如下的简化写法:

class Point {
num x, y; // Syntactic sugar for setting x and y
// before the constructor body runs.
Point(this.x, this.y);
}

Default constructors 默认构造器

如果没有定义构造器,类将提供一个无参构造器,如果类有一个父类,也会调用父类的无参构造器

Constructors aren’t inherited 构造器不可继承

子类不会继承父类的构造器,如果子类没有定义构造器,它只有默认的无参构造器,不会去继承父类的构造器。

Named constructors 命名构造器

Dart可以使用命名构造器去实现多个构造逻辑。

class Point {
num x, y; Point(this.x, this.y); // Named constructor
Point.origin() {
x = 0;
y = 0;
}
}

构造器是不可继承的,这个规则在命名构造器同样有效。如果你想要一个和父类一样的命名构造器,需要在子类的自己定义同样的构造器。

Invoking a non-default superclass constructor 调用父类的非默认构造器

默认情况下,子类的构造器将调用父类的默认构造器。父类构造器先于子类构造器执行,如果子类构造器有初始化执行器列表,它将先于父类构造器执行,如下是执行顺序:

initializer list
superclass’s no-arg constructor
main class’s no-arg constructor

如果父类没有默认构造器,你必须手动调用父类的其它构造器。写法是在子类构造器名后面加上冒号(

7.Classes-类(Dart中文文档)的更多相关文章

  1. 6.Exceptions-异常(Dart中文文档)

    异常是用于标识程序发生未知异常.如果异常没有被捕获,If the exception isn't caught, the isolate that raised the exception is su ...

  2. 2.Built-in types-基本数据类型(Dart中文文档)

    初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart语言内置如下数据类型: numbers strings booleans lists (所谓的数组) maps ...

  3. 1.Variables-变量(Dart中文文档)

    初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. 如下是变量定义和赋值的示例 var name = 'Bob'; 变量存储的是一个引用地址.如上的变量name指向了一个值 ...

  4. 8.Generics 泛型(Dart中文文档)

    这篇翻译的不好 如果你看API文档中的数组篇,你会发现类型一般写成List.<...>的写法表示通用类型的数组(未明确指定数组中的数据类型).通常情况泛型类型用E,T,S,K,V表示. W ...

  5. 4.Operators-操作符(Dart中文文档)

    Dart有如下操作符: Description Operator unary postfix expr++ expr-- () [] . ?. unary prefix -expr !expr ~ex ...

  6. 5.Control flow statements-流程控制(Dart中文文档)

    你可以使用如下流程控制符: if and else for loops while and do-while loops break and continue switch and case asse ...

  7. 3.Functions-函数(Dart中文文档)

    初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart是完全的面向对象的语言,甚至函数也是一个Function类型的对象.这意味着函数可以赋值给变量或者作为函数的参数 ...

  8. Flutter 中文文档网站 flutter.cn 正式发布!

    在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. ** 极速 (Fast)**: ...

  9. PyTorch官方中文文档:torch.nn

    torch.nn Parameters class torch.nn.Parameter() 艾伯特(http://www.aibbt.com/)国内第一家人工智能门户,微信公众号:aibbtcom ...

随机推荐

  1. spring多线程初探

    6月14号  晴  最高温度37   今天很热的一天啊,开发的任务现在正在测试阶段,手头没有什么工作任务,忙里偷闲,丰富一下我的blog. 前两天有个需求:调用第三方接口,这个接口的响应时间有点长,需 ...

  2. map合并,相同键对应的值相加

    最近在做统计钱的计算时遇到的一个需求,需要将一个大类别下的每一种钱进行特定的运算然后获得六年的钱,最后将这些钱按照年份进行汇总,获得总得大类型的六年的钱,在这个过程中采用了这种方法,每次算得钱放在ma ...

  3. npm私有仓库搭建

    背景 Node.js开发本地项目,有时不同项目之间存在依赖,如果不想把项目发布到npm社区的仓库,则需要有自己本地的仓库. 有些公司采用的是内网开发,很多npm资源无法从内网去下载. sinopia( ...

  4. 转载:eclipse 搭建SSH项目(第二篇,有具体的项目例子)

    原文地址:http://blog.csdn.net/yeohcooller/article/details/9316923 读博文前应该注意: 本文提纲:本文通过一个用户注册的实例讲解SSH的整合.创 ...

  5. android 常用adb 及linux 命令

    一.ADB相关 adb shell:进入连接的USB调试模式设备shell命令行下 adb tcpip 5555:将USB连接的调试及的连接方式改为网络远程模式进行调试 这里端口为5555(adb 默 ...

  6. Linux sudo详解

    sudo:控制用户对系统命令的使用权限,root允许的操作.通过sudo可以提高普通用户的操作权限,不过这个权限是需要进行配置才可使用. 常用的命令展示 配置sudo的2种方式 1. visodu 编 ...

  7. int to string & string to int

    #include "stdafx.h" #include <string> #include <sstream> using namespace std; ...

  8. beautifulsoup4-4.3.2的安装

    下载地址:https://www.crummy.com/software/BeautifulSoup/bs4/download/4.5/ 安装成功,亲测可用! 参考文章http://blog.csdn ...

  9. 使用yii的layout,加入<?php echo $content; ?>这句话时,它会自动在子页面上面添加一个div包裹

    使用yii的layout,加入<?php echo $content; ?>这句话时,它会自动在子页面上面添加一个div包裹,而且div的id命名为id=content,这个和已有id重复 ...

  10. 私有仓库harbor安装包括https

    1. 下载离线的 harbor gz包 wget https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-in ...