3.5 静态成员 – 《简单易懂的Dart》

3.5.1 静态变量

Dart中的静态变量使用static修饰,静态变量在类未实例化时才能使用.

class A{  
  static String helloworld='helloworld';

  void say(){
    print(helloworld);
  }
}

void main(){  
  print(A.helloworld);
  A a=new A();
  a.say();
}

上面这段代码中,我们创建了一个A类,A类有一个静态成员变量helloworld和一个方法say.

执行这段代码,输出了两个helloworld.

这表明:

1.静态变量helloworld可以通过外部直接访问,不需要将A类实例化.

2.实例化后的A类也可以访问该静态变量.

需要注意的是,在say方法中不可使用this.helloworld对自身进行引用,因为helloworld实际上存在于A类中,而不是实例本身,同理,a.helleworld也是不能使用的.

3.5.2 静态方法

在比较前面的章节我就提到过,方法和变量都是对象,所以静态方法作为一个Function对象也是使用static关键字修饰的.

静态方法同样具有静态变量的两个特性:

1.静态方法可以通过外部直接访问.

2.实例化后也可以访问,但实际上静态方法处于类的定义体中.

class A{  
  static String helloworld='helloworld';

  static void say(){
    print(helloworld);
  }
}

void main(){  
  print(A.helloworld);
  A.say();
}

3.5.3 静态成员访问

将实例化后将无法通过外部直接调用static成员.

比如下面这段代码是不可行的:

class A{  
  static String helloworld='helloworld';

  static void say(){
    print(helloworld);
  }
}

void main(){  
  A a=new A();
  a.say();
}

静态成员与实例成员是分开的,静态成员处于类的定义体中,实例成员处于类的实例中.

正因如此,修改静态成员时也会影响到实例成员:

class A{  
  static String helloworld='helloworld';

  static void change(){
    helloworld='hellodart';
  }

  void say(){
    print(helloworld);
  }
}

void main(){  
  A a=new A();
  A.change();
  a.say();
}

输出结果为hellodart.

同理,可以通过实例成员去修改静态成员.

结论:静态成员除了不能通过 实例.静态成员 的形式访问外,几乎可以随意访问和修改,这可能留下一些安全上的隐患.