// This is a comment.
单行注释。
内置类型:int String List bool
42
数字字面量
print()
一种方便的显示输出方式。
'...'(或"...")
字符串文字。
$variableName(或)${expression}
字符串插值:包括字符串文字内部的变量或表达式的字符串。
main()
应用程序执行开始的特殊,必需的顶级函数
var
一种声明变量而不指定其类型的方法。
变量的声明方式
这是创建变量并初始化它的示例:
var name = 'Bob' ;
name推断变量的类型String,其后不能使用其他类型对name重新赋值,否则会报类型不匹配异常
如果想阻止推断类型,就是用关键字Object或dynamic类型
举例如下:
void main() {
print('Hello, World!');
var name = "li";
name = 12;//报错
}
bin/untitled4.dart:6:10: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
name = 12;
^
Process finished with exit code 254
我们更改为dynamic
void main() {
print('Hello, World!');
dynamic name = "li";
name = 12;
print(name);
}
运行结果:
Hello, World!
12
显示声明方式:
void main() {
String name = "li";
print(name);//li
}
那么请问,我能不能像使用js的时候直接写 name = "lishimin" 呢?
答案是否定的!
void main() {
name = "李世民";//报错了,说name 是 undefined
}
变量未初始化的默认值是null
在dart中一切都是对象,所以对象的默认值就是null,即便是像java中的基本类型到了dart中默认值照样是null
void main() {
String name;
int a;
dynamic b;
print(name);
print(a);
print(b);
}
运行结果:
null
null
null
final 和 const
如果您从不打算更改变量,请使用final或const代替var或替代类型。最终变量只能设置一次; const变量是编译时常量。
我们类比java,先看下java中的final const static 有什么区别
final:
final修饰类:该类不可继承
final修饰方法:该方法不能被子类覆盖(但它不能修饰构造函数)
final修饰字段属性:属性值第一次初始化后不能被修改
使用final可以提高程序执行的效率,将一个方法设成final后编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。
static:
static修饰成员函数则该函数不能使用this对象
static不能修饰构造函数、函数参数、局部成员变量
static修饰成员字段则当类被虚拟机加载时按照声明先后顺序对static成员字段进行初始化。
static修饰语句块:当类被虚拟机加载时按照声明先后顺序初始化static成员字段和static语句块
static所修饰的方法和字段只属于类,所有对象共享,java不能直接定义全局变量,是通过static来实现的。
java中没有const,不能直接定义常量,是通过static final组合来实现的。
可以知道const就是用来定义常量用的,final也是用来定义常量的,只不过功能比const多了点
注意: 实例变量可以是final但不是const。
1.final必须初始化
void main() {
final String name;
final int a;
final dynamic b;
print(name);
print(a);
print(b);
}
你以为输出三个null,对不起报错了
Error: The final variable ';' must be initialized.
2.final初始化一次后不能重新赋值
void main() {
final String name = "雷洛探长";
name = "颇好";
final int a = 25;
a = 23;
final dynamic b = "五亿啊";
b = 23;
print(name);
print(a);
print(b);
}
bin/untitled4.dart:5:3: Error: Setter not found: 'name'.
name = "颇好";
^^^^
bin/untitled4.dart:7:3: Error: Setter not found: 'a'.
a = 23;
^
bin/untitled4.dart:9:3: Error: Setter not found: 'b'.
b = 23;
^
看到没,被final修饰后没有了setter 方法了,所以不能重新赋值了
3.const
void main() {
var foo = const [ ];
var foo1 = const [1,2,3];
print(foo1);//[1,2,3]
//foo1 是变量可以改变其指向,但它的指向到一个不可变内容的数组
foo1 = const [5,6,7];
print(foo1);
//Cannot modify an unmodifiable list
// foo1[0] = 2;
// print(foo1);//报错
//final修饰一经初始化不可再改变
final bar = const [];
//const 修饰baz不能指向新的数组,且数组内容不可以改变,等价于 const baz = const [];
const baz = [];
}
内置类型
numbers
strings
booleans
lists (also known as arrays)
maps
runes (for expressing Unicode characters in a string)
symbols
Numbers
分两种类型:int double
int 在dartVM 中 的范围是-2的63次方 到 2的63次方减去1
如果dart被编译成js 那么使用js的Numbers 范围是-2的53次方 到 2的53次方减去1
void main() {
int a = 1;
int b = 0xDEADBEEF;//16进制整数
print("a=${a}");
print("b=${b}");
}
double 64位的浮点数,带有小数
void main() {
double y = 1.1;
double exponents = 1.42e5;
print("y=${y}");//1.1
print("exponents=${exponents}");//142000.0
}
numbers 与 strings 互相转换
void main() {
// String -> int
var one = int.parse('1');
print(one == 1);//true
// String -> double
var onePointOne = double.parse('1.1');
print(onePointOne == 1.1);//true
// int -> String
String oneAsString = 1.toString();
print(oneAsString == '1');//true
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);//转换为字符串保留两位小数,四舍五入
print(piAsString == '3.14');//true
// double -> String
String piAsString2 = 3.14159.toStringAsFixed(3);//转换为字符串保留3位小数,四舍五入
print(piAsString2 == '3.142');//true
}
整数有位运算符号:>> 右移 << 左移 & 按位与 | 按位或 || 按位异或
& 按位与 :都是1结果才是1,有一个是0,结果就是0
| 按位或:有一个是1 结果就是1,都是0,结果是0
|| 按位异或:相同为0,不同为1
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
编译时常量计算
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
print(msUntilRetry);//5000
Strings
UTF-16标准,可以使用单引号或者双引号,如果有引号嵌套,单引号嵌入双引号,或者双引号嵌入单引号都是可以的。
void main() {
//单引号
var s1 = 'Single quotes work well for string literals.';
print(s1);
//双引号
var s2 = "Double quotes work just as well.";
print(s2);
//单引号包括单引号,需要转义
var s3 = 'It\'s easy to escape the string delimiter.';
print(s3);
//双引号包括单引号
var s4 = "It's even easier to use the other delimiter.";
print(s4);
//双引号包括双引号,需要转义
var s5 = "Double quotes\" work just as well.";
print(s5);
}
Single quotes work well for string literals.
Double quotes work just as well.
It's easy to escape the string delimiter.
It's even easier to use the other delimiter.
Double quotes" work just as well.
使用模式串 ${a}
void main() {
var s = 'string interpolation';
print("Dart has $s, which is very handy.");
print("Dart has ${s}, which is very handy.");
//下面解释了为啥要用${s}这种情况,$swhich 找不到这个变量
// print("Dart has $swhich is very handy.");
//使用${}完美区分
print("Dart has ${s}which is very handy.");
var S = s.toUpperCase();
print(S);//STRING INTERPOLATION
print(S.toString());//STRING INTERPOLATION
}
网友评论