7.Classes-类(Dart中文文档)
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中文文档)的更多相关文章
- 6.Exceptions-异常(Dart中文文档)
异常是用于标识程序发生未知异常.如果异常没有被捕获,If the exception isn't caught, the isolate that raised the exception is su ...
- 2.Built-in types-基本数据类型(Dart中文文档)
初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart语言内置如下数据类型: numbers strings booleans lists (所谓的数组) maps ...
- 1.Variables-变量(Dart中文文档)
初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. 如下是变量定义和赋值的示例 var name = 'Bob'; 变量存储的是一个引用地址.如上的变量name指向了一个值 ...
- 8.Generics 泛型(Dart中文文档)
这篇翻译的不好 如果你看API文档中的数组篇,你会发现类型一般写成List.<...>的写法表示通用类型的数组(未明确指定数组中的数据类型).通常情况泛型类型用E,T,S,K,V表示. W ...
- 4.Operators-操作符(Dart中文文档)
Dart有如下操作符: Description Operator unary postfix expr++ expr-- () [] . ?. unary prefix -expr !expr ~ex ...
- 5.Control flow statements-流程控制(Dart中文文档)
你可以使用如下流程控制符: if and else for loops while and do-while loops break and continue switch and case asse ...
- 3.Functions-函数(Dart中文文档)
初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart是完全的面向对象的语言,甚至函数也是一个Function类型的对象.这意味着函数可以赋值给变量或者作为函数的参数 ...
- Flutter 中文文档网站 flutter.cn 正式发布!
在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. ** 极速 (Fast)**: ...
- PyTorch官方中文文档:torch.nn
torch.nn Parameters class torch.nn.Parameter() 艾伯特(http://www.aibbt.com/)国内第一家人工智能门户,微信公众号:aibbtcom ...
随机推荐
- web 应用响应乱码问题
非西欧语系乱码原因 在没有设置任何内容类型或编码之前,HttpServletResponse使用的字符编码默认是ISO-8859-1.也就是说,如果直接输出中文,在浏览器上就会看到乱码. 有两种方式可 ...
- hornor8改user模式为debug模式
在学习Android软件安全的过程中,经常要用到Android的动态调试.但是呢,一般的Android应用在发布的时候都是发布版的不能直接被调试,为了能使Android应用能够支持调试就需要对Andr ...
- mybatis 在存储Integer、bigdecimal等java数据类型时,将0存成null
我们的项目中,有关于金额的计算,所以,一般在java环境中我们使用bigdecimal来做运算和存储金额信息.数据库sqlServer2008用的float类型 问题是,当我将金额赋值成0时,很意外的 ...
- leetCode题解 Student Attendance Record I
1.题目描述 You are given a string representing an attendance record for a student. The record only conta ...
- font-family:中文字体的英文名称 (宋体 微软雅黑)
宋体 SimSun 黑体 SimHei 微软雅黑 Microsoft YaHei 微软正黑体 Microsoft JhengHei 新宋体 NSimSun 新细明体 PMingLiU 细明体 Ming ...
- Windows 7系统启动MongoDB失败解决办法?
问题现象: 1.在配置Python环境安装MongoDB时发现在“服务”里面手动启动失败,报错如下: 2.在cmd里面也无法启动,注意这里要以管理员身份启动cmd哦 问题解决: 1.需要先在bin下执 ...
- Error loading XML document: dwz.frag.xml 处理方式
问题:直接用IE打开index.html弹出一个对话框:Error loading XML document: dwz.frag.xml 方案一(已经验证): 转自:http://blog.csdn. ...
- Redis学习---基础学习[all]
什么是NoSQL型数据库 NoSQL数据库---NoSQL数据库的分类 Redis学习---NoSQL和SQL的区别及使用场景 Redis学习---负载均衡的原理.分类.实现架构,以及使用场景 什么是 ...
- Exchange & Office 365最小混合部署
前言 这篇文章的主题是混合部署~ 混合使得本地组织和云环境像一个单一的.协作紧密的组织一样运作.当组织决定进行混合部署,达到本地Exchange Server和Office 365共存的状态时,就会面 ...
- C++实现一个Vector3空间向量类(转)
转自:http://www.2cto.com/kf/201311/260139.html ector2,3,4类在DirectX中都有现成的可以调用,不过要实现其中的功能其实也不难,也都是一些简单的数 ...