学习笔记02
由于之前学的东西都没有记下来,而学习笔记又不易过长,所以分做几部分。
Dart语言基础
基本简介
在学一门编程语言之前,我会对这门语言最基础的“脾气”进行了解,像:是否完全面向对象,强弱类型语言之类的。以下就是对Dart语言的整理。部分借鉴自博客.
-
Dart跟Java一样,一切都是对象,一切对象都是class的实例,哪怕是数字类型、方法甚至null都是对象,所有的对象都是继承自Object
-
虽然Dart是强类型语言,但是否声明变量类型是可选的因为Dart可以自动推断变量类型
-
Dart支持范型,List表示一个整型的数据列表,List则是一个对象的列表,其中可以装任意对象
-
Dart支持顶层方法(如main方法),也支持类方法或对象方法,同时,支持顶层变量,也支持类变量或对象变量,同时你也可以在方法内部创建方法
-
Dart中变量可以以字母或下划线开头,后面跟着任意组合的字符或数字
-
Dart 没有 public、private、protected 这些关键字,变量名以"_"开头意味着对它的 lib 是私有的。
-
没有初始化的变量都会被赋予默认值 null。
-
final的值只能被设定一次。const 是一个编译时的常量,可以通过 const 来创建常量值,var c=const[];,这里 c 还是一个变量,只是被赋值了一个常量值,它还是可以赋其它值。实例变量可以是 final,但不能是 const。
-
编程语言并不是孤立存在的,Dart也是这样,他由语言规范、虚拟机、类库和工具等组成:
- SDK:SDK 包含 Dart VM、dart2js、Pub、库和工具。
- Dartium:内嵌 Dart VM 的 Chromium ,可以在浏览器中直接执行 dart 代码。
- Dart2js:将 Dart 代码编译为 JavaScript 的工具。
- Dart Editor:基于 Eclipse 的全功能 IDE,并包含以上所有工具。支持代码补全、代码导航、快速修正、重构、调试等功能。
-
不负责任的来说,如果说
C#
=C++
+VB
+Java
,那么Dart
=Java
+Python
。
准确的说,上面的东西我也都还没有完全搞明白。还是需要多多学习。
变量与常量
1.变量声明与初始化
-
调用的变量name包含对String值为“张三” 的对象的引用,name推断变量的类型是String,但可以通过指定它来更改该类型,如果对象不限于单一类型(没有明确的类型),请使用Object或dynamic关键字。
// 没有明确类型,编译的时候根据值明确类型 var name = ‘Bob’; Object name = '张三'; dynamic name = '李四'; // 显示声明将被推断类型, 可以使用String显示声明字符串类型 String name = 'Bob' ;
2.final and const
-
一个
final
变量只能被初始化一次;const
变量是一个编译时常量,(Const
变量是隐式的final
) -
final
的顶级或类变量在第一次使用时被初始化。 -
被
final
或const
修饰的变量无法再去修改其值。 -
flnal
或者const
不能和var
同时使用。 -
const
关键字不只是声明常数变量,您也可以使用它来创建常量值,以及声明创建常量值的构造函数,任何变量都可以有一个常量值。 -
简单的说一下,
const
是编译时常量,而final
时运行时常量,final
比const
要求更严格。// The final variable 'outSideFinalName' must be initialized. final String outSideFinalName // Members can't be declared to be both 'const' and 'var' const var String outSideName = 'Bill'; // Members can't be declared to be both 'final' and 'var' final var String name = 'Lili'; const speed = 100; //速度(km/h) const double distance = 2.5 * speed; // 距离 = 时间 * 速度 final speed2 = 100; //速度(km/h) final double distance2 = 2.5 * speed2; // 距离 = 时间 * 速度
数据类型
1.num
-
num
是数字类型的父类,有两个子类int
和double
。 -
int
根据平台的不同,整数值不大于64位。在Dart VM上,值可以从-263到263 - 1,编译成JavaScript的Dart使用JavaScript代码,允许值从-253到253 - 1。 -
double
64位(双精度)浮点数,如IEEE 754标准所规定。int a = 1; print(a); double b = 1.12; print(b); // String -> int int one = int.parse('1'); // 输出3 print(one + 2); // String -> double var onePointOne = double.parse('1.1'); // 输出3.1 print(onePointOne + 2); // int -> String String oneAsString = 1.toString(); // The argument type 'int' can't be assigned to the parameter type 'String' //print(oneAsString + 2); // 输出 1 + 2 print('$oneAsString + 2'); // 输出 1 2 print('$oneAsString 2'); // double -> String 注意括号中要有小数点位数,否则报错 String piAsString = 3.14159.toStringAsFixed(2); // 截取两位小数, 输出3.14 print(piAsString); String aString = 1.12618.toStringAsFixed(2); // 检查是否四舍五入,输出1.13,发现会做四舍五入 print(aString);
2.String
-
Dart里面的
String
是一系列 UTF-16 代码单元。 -
单引号或者双引号里面嵌套使用引号。
-
用 或{} 来计算字符串中变量的值,需要注意的是如果是表达式需要${表达式}
String singleString = 'abcdddd'; String doubleString = "abcsdfafd"; String sdString = '$singleString a "bcsd" ${singleString}'; String dsString = "abc 'aaa' $sdString"; print(sdString); print(dsString); String singleString = 'aaa'; String doubleString = "bbb"; // 单引号嵌套双引号 String sdString = '$singleString a "bbb" ${doubleString}'; // 输出 aaa a "bbb" bbb print(sdString); // 双引号嵌套单引号 String dsString = "${singleString.toUpperCase()} abc 'aaa' $doubleString.toUpperCase()"; // 输出 AAA abc 'aaa' bbb.toUpperCase(), 可以看出 ”$doubleString.toUpperCase()“ 没有加“{}“,导致输出结果是”bbb.toUpperCase()“ print(dsString);
3.其余数据类型
在此不多做赘述,感觉跟Java大同小异。若之后,发现有不一样的地方,再行补充。
运算符
1.类型测试操作符
as
、is
和is!
操作符是我之前没有碰到过的。
操作符 | 含义 |
---|---|
as |
类型转换 |
is |
当对象是相应类型时返回 true |
is! |
当对象不是相应类型时返回 true |
如果obj
实现了T
所定义的接口,那么obj is T
将返回 true
。比如,obj is Object
必然返回 true
。
使用啊as
操作符可以把一个对象转换为特定类型。一般来说,如果在is
测试之后还有一些关于对象的表达式,可以把as
当做是is
测试的一种简写。下面举个例子:
if (emp is Person) {
// Type check
emp.firstName = '永动机';
}
也可以通过as
来简化代码:
(emp as Person).firstName = '永动机';
注意:上面两段代码并不相等。如果emp的值为 null 或者不是一个 Person 对象,第一段代码不会做任何事情,第二段代码会报错 。
2.级联操作符
又是一个没有见过的操作符。
级联..
允许对同一对象执行一系列操作。除了函数调用,还可以访问同一对象上的字段。这通常会省去创建临时变量的步骤,并允许编写更多的级联代码。下面举个例子:
querySelector('#confirm') // 获取一个对象
..text = 'Confirm' // 使用它的成员
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
第一个方法调用querySelector()
,返回一个selector
对象。遵循级联符号的代码对这个selector
对象进行操作,忽略任何可能返回的后续值。
前面的例子相当于:
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
你也可以嵌套你的级联。例如:
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = '[email protected]'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
在返回实际对象的函数上构造级联要小心。例如,以下代码失败:
var sb = StringBuffer();
sb.write('foo')
..write('bar'); // 错误:没有为“void”定义的方法“write”。
sb.write()
调用返回void
,你不能在void
上构建级联。
注意:严格来说,级联的“双点”符号不是运算符。这只是Dart语法的一部分。
未完待续