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. AWS CSAA -- 03 Identity Access Management IAM

    009 IAM 101 012 IAM Summary 问题汇总: Lab1:对root account进行加固 Lab 2:利用CloudWatch设置BillingAlarm

  2. Linux Transparent Huge Pages 对 Oracle 的影响

    1 Transparent Huge Pages 说明 官网上有2篇文章对THP 做了说明: https://access.redhat.com/solutions/46111 https://acc ...

  3. 固定UIScrollView滑动的方向

    固定UIScrollView滑动的方向 一般而言,我们通过这两个参数CGRectMake以及contentSize就可以自动的让UIScrollView只往一个方向滚动.但我遇到过非常奇葩的情况,那就 ...

  4. Linux 系统其他重要文件

    其他重要目录 /usr /usr/local 通过源码安装,没有特别指定,就在这个文件下用户自编译软件存放地方 /usr/src 源代码程序 + 内核源代码程序存放目录 /var /var/log/m ...

  5. Linux 系统的日志目录

    连接时间的日志 连接时间日志一般由/var/log/wtmp和/var/run/utmp这两个文件记录,通过who查看 who /var/log/wtmp [连接时间日志] who /var/log/ ...

  6. php面试题之一——php核心技术

    一.PHP核心技术 1.写出一个能创建多级目录的PHP函数(新浪网技术部) <?php /** * 创建多级目录 * @param $path string 要创建的目录 * @param $m ...

  7. 【FLEX教程】#007 如何让JS调用SWF里的方法

    HTML中,JS如何调用SWF里面已经封装好的代码呢? 有一些事情Flex没办法实现的,需要通过调用JS来实现. eg: 当浏览器窗体关闭的时候,弹出一个对话框,提示用户是否退出?或者是否保存当前的操 ...

  8. 20165318 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20165318 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验报告封面 课程:Java程序设计        班级:1653班        姓名:孙晓暄    ...

  9. loli的搜索测试-4

    其实这已经是第四次搜索测试了...只不过上两次测试时我不在学校,扔两个链接吧: 测试-2:https://www.luogu.org/blog/user35178/loli-di-sou-suo-ce ...

  10. 【洛谷】【线段树+位运算】P2574 XOR的艺术

    [题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...