Dart基础语法-类与变量

在dart中万物皆对象,null、int、bool等都是变量

Dart基础语法-类与变量_第1张图片
万物皆对象

Accessor

对于类来说,所有的变量都不能在外部访问,需要通过setter和getter进行访问。

class Person {
  var a;
  set age(newAge) {
    a = newAge;
  }

  get age {
    return a;
  }
}

实例变量

每个实例都有自己的变量。在变量声明时,初始化为null对象(这点区别与C,null为特殊对象,初始化后,指向内存空间不会包含其他值)。

class Person{
    var age = 0;
}

void main(){ 
    var p1 = Person();
    print(p1.age);
    p1.age = 10;
    var p2 = Person();
    print(p2.age);
}

输出如下:

0
0

由于dart中的变量都不可直接访问,需要通过accessor进行访问(自动生成setter和getter),在变量为可变变量时,自动生成setter和getter。在不可变变量时,生成getter。

类变量(静态变量)

类变量不受实例的影响。类变量声明时,默认初始化为null,在第一次getter调用后才会进行初次化。这可避免前期类变量过度初始化。

如下示例:

class Action {
  num smile(String tip) {
    print(tip);
    return 8;
  }
}

class Person {
  static var age = Action().smile("tip");
}

void main(){ 
  // print(Person.age);   
  Person.age = Action().smile("1");
}

输出

1

打开print(Person.age)输出

tip
1

定义类变量 age,在为主动读取age时,不会触发Action().smile("tip");,可见,类变量的初始化,是一个延迟初始化的过程,需要在获取时才会调用。这个需要注意,在检查变量的值时,触发变量的初始化。

类变量与顶层变量

顶层变量与类变量类似,只是作用域不同。如下,在不进行获取age值时,不会打印任何数据。

var age = Action().smile("tip");
void main(){ 

}

final变量

通过final修饰的变量,在初始化之后就不可进行修改。

final 可以在声明时进行初始化:

final age = 10;

也可以在构造函数中进行初始化

class Person{
final age;
Person(this.age);
}

注:由于final申明变量,不会生成setter,外部在对变量进行赋值的时候,会报错。

变量之间相同判断

由于每个对象都有一个hascode,使用==进行判断,即使参数完全一致,都不会相等。不过可以通过operator进行重新定义,来判断两个对象是否相同。

class Person {
  final age;
  Person(this.age);
  operator == (p) => age == p.age;
}

 var p1 = Person(10);
  var p2 = Person(10);
  if (p1 == p2) {
    print("相同");
  }

类创建的几种方式

class Person{
var name = "张三";
var age = 12;
}
class Person{
var name;
var age;
Person(this.name, this.age);
}
class Person{
var name;
var age;
  Person(a, b){
    a = name;
    b = age;
  };
}
class Person{
var name;
var age;
Person(a, b): a = name, b = age;
}

你可能感兴趣的:(Dart基础语法-类与变量)