# 变量与常量
Dart中定义变量有两种方式:
- 一、静态类型语言常用的方式,显式指定变量类型。
- 二、动态语言的常用方式,不指定类型,由vm自动推断。
一切变量皆是对象,每个对象都是类的实例。int、double、函数、 null 等都是对象,所有对象都继承自 Object 类。下面我们看看如何声明变量:
变量是一个引用,未初始化的变量值是Null如下:
import 'dart:core';
void main() {
String name;
print('$name'); //输出为null
}
上面我们提到了显示指定变量类型如下:
import 'dart:core';
void main() {
String name ="toimc";
int age =10;
print('$name''----$age'); //输出:toimc----10
}
动态语言的常用方式,不指定类型,由vm自动推断。
import 'dart:core';
void main() {
String name ="toimc";
name ='周伯通';
print('$name'); //输出:周伯通
}
Dart 语言是强类型语言,无法将一个已声明具体变量类型的变量赋值为另一个无继承关系的变量
import 'dart:core';
void main() {
String name ="toimc";
name =10;
print('$name');
}
这种赋值的时候就会报错:
import 'dart:core';
void main() {
int age =10;
age =10.0; //这种在赋值的时候就已经报错
print('$age');
}
但是这个地方有个需要注意的地方就是int 和double 类都是num的子类如下面写法是合法。
import 'dart:core';
void main() {
num age =10;
age =10.0; //这种在赋值合法
print('$age');
}
# var
var:在声明变量在赋值的那一刻,就已经决定了它是什么类型。
上面这句话是什么意思尼?其实很简单:
import 'dart:core';
void main() {
//age 已经确定为num类型并为其赋值18岁,如果你赋值字符串,那么就会报错
var age =18;
age ='18';
print('$age');
}
import 'dart:core';
void main() {
//age 已经确定为num类型并但是没有为其赋值,如果你赋值字符串那么是正确
var age;
age =18;
age ='18';
print('$age');
}
# Object
一切变量皆是对象,每个对象都是类的实例。int、double、函数、 null 等都是对象,所有对象都继承自 Object 类
import 'dart:core';
void main() {
Object age ='18';
age =18;
print('$age');
}
Flutter中,大多数情况,定义自定义的类型(组件),申明时即可以使用自定义的类型来进行申明,后续会介绍到。
# dynamic
dynamic类似java中的Object ,所以声明的变量行为与Object一样,使用也是一样,但是我们需要知道的是:dynamic不是在编译时确定类型的,而是在运行时:这句话有点懵,到底是什么意思呢?
import 'dart:core';
void main() {
dynamic name ='toimc';
print(name.runtimeType); //输入:String
name =18;
print(name.runtimeType); //输入:int
}
说明:
在声明变量的时候,也可以选择加上具体 类型:String name = “toimc”
没有初始化的变量自动获取一个默认值为 null(类型为数字的 变量如何没有初始化其值也是 null)。
对于局部变量,按照dart官方建议使用var来声明变量
# final与const
final 和const 从本质上看不出区别:如果你希望一个变量在赋值后其引用不能再改变,可以通过final或const这两个关键字来实现。
final是运行时常量,final的要求是其声明的变量在赋值以后是不能在改变:
const是编译期常量。这里关键点区分什么是编译时常量,说白了就是其定义的值必须是一个字面常量值如下:
void main() { const name = '' }
final有两种使用场景
- 类中的变量声明,必须在声明时赋值。
- 类中的成员变量声明,可以在声明时候赋值,也可以通过构造函数赋值如: