Dart基本知识-变量以及常量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010221508/article/details/89181403
  • var 是一种不指定类型声明变量的方式

     var str = "test";
     var a = 1;
     var b = false;
    

    var是一个关键字,并不是一个类型,这种不指明类型的变量的类型为dynamic。

  • $variableName 或者 ${expression}
    字符串插值:在字符串字面量中引用变量或者表达式。

     var host = "http://v.juhe.cn/"
     var url = "${host}article/list/0/json"
     var name = "city";
     var content = "this is a $name";
    
  • dart语言的几个重要概念

  1. 所有能够使用变量引用的都是对象,每个对象都是一个类的实例,在Dart语言中甚至连数字、方法和null都是对象,所有的对象都继承自Object类。
  2. 使用静态类型可以清晰表明你的意图,并可以让静态分析工具来分析你的代码,但这并不是强制性的,没有指定类型的变量为dynamic类型
  3. Dart支持定义静态函数和实例函数,你还可以在方法中定义方法(嵌套方法或者局部方法)。
  4. Dart支持定义静态变量和实例变量,实例变量有时被称为域或者属性。
  5. 和Java不同的是Dart没有public、protected和private关键字。如果一个标识符以_开头,则表示此标识符在这个类中是私有的。
  6. 标识符可以以字母或者_开头,后面可以使字母和数字组合。
  7. 声明不指明类型的变量用var,没有初始化的变量自动获得一个null值,类型为数字的变量如果没有初始化也为null,因为每一个能使变量引用的都是对象,包括数字类型。
  8. 在声明变量的时候,可以加上具体类型,对于局部变量,这里准守代码风格推荐部分的建议,使用var而不是具体类型定义变量。
  • final和const
    final和const是修饰常量的,final是运行时常量,const是编译时常量。顶级final变量或者类中的final变量在第一次使用的时候初始化。
    实例变量可以使用final修饰而不能用const修饰,因为实例变量不能作为编译时常量的。
    final变量实例:

    final name = "bob";
    

    const变量为编译时常量,如果const变量在类中,请定义为static const,可以直接定义const和其值,也可以定义一个const变量使用其他const变量的值来初始化其值。

     const bar = 10000;
     const bam = 1.01 * bar;
    

    const不仅可以只用来定义常量,还能定义构造函数为const类型的,这种类型创建的构造函数是不可改变的,

     // Note: [] 创建一个空的list.
     // const [] 创建一个不变的list.
     var foo = const [];   // foo只是目前是一个空的不变的list.
     final bar = const []; // bar永远只能是这个空的不变的list.
     const baz = const []; // barz 是一个编译时空的不变的list.
     
     // 你可以改变foo的引用,因为foo不是final类型的,也不是const类型的
     // 即便它曾经引用过一个编译时常量.
     foo = [];
     
     // 你不可以改变bar和baz的引用因为它们是fianl类型的和const类型的.
     // bar = []; // Unhandled exception.
     // baz = []; // Unhandled exception.
    
  • 什么是编译时常量和运行时常量?
    编译时常量就是在代码编译的时候,这个常量就被存入到引用它的类的常量池中了,与定义它的类没有什么关系了,运行时引用编译时常量,并不会使定义这个常量的类被加载

    运行时常量是在代码运行时才会被赋值。

     public class GetClass { 
         public static void main(String[] args) { 
             System.out.println(Test.name);//① 
             System.out.println(Test.score);//② 
             System.out.println(Test.age);//③ 
         } 
     } 
     
     class Test 
     { 
         public static int age = 23; 
         public static final String name = "shanxi"; 
         public static final Integer score = 85; 
         static  
         { 
             System.out.println("Test static block"); 
         } 
     }
    

    如果单独运行代码①输出:

     shanxi
    

    如果单独运行代码②输出:

     Test static block
     85
    

    如果单独运行代码③输出:

     Test static block
     23
    

    Test类中的name就属于编译时常量,在编译的时候,它就会存放到引用它的类GetClass的常量池中。在执行代码的时候,调用Test.name并不会加载Test类。
    Test类中的age不属于常量,它属于类Test的属性,所以调用它的时候会加载Test类。
    Test类中的score属于Test类的运行时常量,在运行时才会为它赋值,调用它会加载Test类。
    能做编译时常量的情况如下

    Oracle的官方文档 15.28 Constant Expressions 详细的解释了,什么是 Compile-time Constant

     1. 原始类型字面量,或者String字面量
     2. 能转型为原始类型字面量,或String字面量的常量
     3. 一元运算符(+,-,~,!,但不包含++, --) 和1,2组成的表达式 
     4. 多元运算符(*,/和%)和1,2组成的表达式
     5. 附加运算符( additive operators) (+ 或 -)与之前几条组成的表达式
     6. 位移运算符(<<,>>, >>>)和之前几条组成的表达式
     7. 关系运算符(<,<=,>,>= ,不包括 instanceof)与之前几条组成的表达式
     8. 关系运算符(==,!=)与之前几条组成的表达式
     9. 位运算符(&, ^, |)与之前几条组成的表达式
     10. 条件与和条件或运算符(&&, ||) 与之前几条组成的表达式
     11. 三元运算符 (?:)和之前几条组成的表达式
     12. 带括号的表达式,括号内也是常量表达式
     13. 引用常量变量的简单变量 
     14. 类中的常量变量引用,使用类的全限定名或类名进行引用(String.class)
    

    意思就是原始类型字面量和String字面量以及他们组成的表达式才能作为编译时常量。
    而Integer不属于原始类型,也不属于String类型,所以它不能作为编译时常量。

猜你喜欢

转载自blog.csdn.net/u010221508/article/details/89181403