Dart与Java的语法及概念异同点汇总

变量

Dart定义变量时可以不预先定义变量类型,程序会自动推断类型
定义变量可以通过 var 关键字来申明变量

var name = '李白';
int age = 99;

常量

Dart定义常量用 final 和 const 关键字来修饰符
const值不变,一开始就得赋值
final 可以开始不赋值,但只能赋值一次
final 不仅有const的编译时常量的特性,最重要的它是运行时常量,并且final是惰性初始化,即在运行时第一次使用前才初始化
常量是永远不改量的量,用final或const修饰它,而不是使用var或其他变量类型

// const 常量
 const PI = 3.14159;
 print('PI: $PI');

 // final 常量
 final PI_2 = 3.1415;
 print('final常量 PI_2: $PI_2');

 final a = new DateTime.now();
 print(a);  // 2020-03-05 12:02:05.759293

 // const a = new DateTime.now();   // 报错
 // final 和 const 区别:
 // final 可以开始不赋值,但只能赋一次;
 // final不仅有const的编译时常量的特性,最重要的它是运行时常量,并且final是惰性初始化,即在运行时第一次使用前才初始化。

new一个对象的时候,new关键字可以省略。

class Person(){
}
main(){
  Person p = Person();
}

构造函数

class Person{
  String name;
  num age;
  Person(this.name,this.age);
  //以上写法等同于以下
  Person(String name,num age){
    this.name = name;
    this.age = age;
  }
}

命名构造函数

Dart不支持构造函数重载,但是可以用可选参数代替。命名构造函数也是可以代替java的重载的。

class Person{
  String name;
  num age;
  Person.haha(){
  }
}
main(){
  Person p = new Person.haha();
}

继承

主要概念基本同java相同,唯一有区别的就是子构造继承父构造的声明方式
这里是通过super+初始化列表的方式调用父类的构造函数。

class Children extends Person{
  Children(String name,num age):super(name,age){
  }
}

抽象类

抽象类声明与java相同,都是abstract关键字声明,抽象方法则与之不同。
抽象方法在Dart中声明方式不加方法体既是抽象方法。

abstract class Animal{
  eat();//抽象方法
}

多态

定义:允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行效果。
父类定义一个方法不去实现,让每个子类实现,每个子类有不同的表现。

class Dog extends Animal{
  @override
  eat(){
      print("吃骨头");
  }
}
main(){
  Animal dog = new Dog();
  dog.eat();
}

接口

dart没有interface关键字定义接口,而是普通类和抽象类都可以被当做接口被实现
同样使用implements关键字进行实现。
但是dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象类中的属性和方法全部需要复写一遍。
而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像java接口那样的方式,一般会使用抽象类。
建议使用抽象类定义接口

泛型

泛型是为了解决类,方法,接口的重用性,以及对不特定数据类型的支持(类型校验)。
Dart的泛型和java基本相同。

T getData<T>(T value){
  return value;
}

新概念


mixins

mixins的中文意思是混入,就是在类中混入其他功能,
在Dart中可以用mixins实现类似多继承的功能。
因为mixins随着Dart的版本一直在变,以下示例的是2.x版本使用mixins的条件。
1,作为mixins的类只能继承自Object类,不能继承其他类。
2,作为mixins的类不能有构造函数。
3,一个类可以mixins多个mixins类。
4,mixins绝不是继承也不是接口,而是一种全新的特性。
5,如果两个mixins类里有相同名称的方法,会调用后面的mixins类。

class A{
  a(){}
  run(){}
}
class B{
  b(){}
  run(){}
}
class C with A,B{
}
main(){
  C c = new C();
  c.a();
  c.b();
  c.run();//会打印后者,后者会覆盖前者,就是B里的run

  c is A;//true
  c is B;//true
  c is C;//true
}

计算属性

class Rect{
  get area{
    return this.height * this.width;
  }
  set 
}
//调用
Rect rect = new Rect();
rect.area;

初始化列表

Dart我们可以在构造函数运行之前初始化实例变量。
这种写法来自c++,效率比域初始化高。

class Rect{
  Rect():height=11,width=2{
  }
}

对象操作符

【?】 条件运算符
【as】 类型转换,类似java的强转
【is】 类型判断,类似java的instanceof,这略过
【..】 连级操作(连缀),类似构建者模式,链式调用

Person p;
p.getInfo();//空指针
p?.getInfo();//不报错

var p = '';
p = new Person();
(p as Person).getInfo();

p1..name="哈哈"
  ..age = 20
  ..print();

async和await关键字

这两个关键字的使用只需记住两点,
1,只有在async方法里面才能使用await关键字调用方法。
2,如果调用别的async方法必须使用await关键字。

async是让方法变成异步,
await是等待方法执行完成。

main() async{ //await必须在async方法里面执行
  var result = await testAsync(); //必须使用await调用async方法
  print(result);
}
testAsync async{
  return 'hello';
}

拓展


Dart中的库

Dart中的库主要有三种。
1,我们自定义的库。

import 'lib/xxx.dart';

2,系统内置库。

import 'dart:math';
import 'dart:io';
import 'dart:convert';

3,Pub包管理系统中的库。
https://pub.dev/packages
https://pub.flutter-io.cn/packages
https://pub.dartlang.org/flutter
1,需要在自己项目根目录新建一个pubspec.yaml文件。
2,在pubspec.yaml文件配置名称,描述,依赖等信息(去网站看步骤即可)。
3,然后运行pub get 命令获取包下载到本地。
4,项目中引入库 import 'package:http/http.dart' as http; 看文档使用。

pubspec.yaml

name:xxx
description:A new flutter project.
dependencies:
  http:^0.12.0+2
  data_format:^1.0.6

1,冲突解决:

当引入的库里有相同名称标识符的时候,如果是java我们通常是写完整的包名路径来指定。

import 'package:lib1/lib1.dart'
import 'package:lib2/lib2.dart' as lib2;

Element element1 = new Element();//Use Element from lib1
lib2.Element element2 = new lib2.Element();//Use Element from lib2

2,部分导入:

如果只需要导入库的一部分(方法),有两种模式:
模式一:只导入需要的部分(方法),使用show关键字,如下面例子所示:

import 'package:lib1/lib1.dart' show foo;

模式一:隐藏不需要的部分(方法),使用hide关键字,如下例子所示。

import 'package:lib2/lib2.dart' hide foo;

3,延时加载:

懒加载的最大好处是可以减少APP的启动时间。
懒加载使用deferred as关键字来指定,如下例子所示。

import 'package:deferred/hello.dart' deferred as hello;

当需要使用的时候,需要使用loadLibrary()方法来加载。

greet() async{
  await hello.loadLibrary();
  hello.printGreeting();
}

4,part(分片)

一般库太大了用此关键字把库分成很多片段,使用时再进行导入

5,export(导出)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 一. Dart入口方法 每一个flutter项目的lib目录里面都有一个main.dart。这个文件就是flutt...
    骑马纵天下阅读 2,523评论 0 1
  • Dart我们有不得不学的理由,因为有Flutter这尊大神在啊,但是像有的大神这样潇洒,现阶段我还做不到 如果您熟...
    前行的乌龟阅读 2,280评论 0 12
  • 上篇博客我们学习了dart中的集合、动态变量和函数相关的内容,本篇博客将对dart的类操作,异步编程和事件驱动进行...
    逐梦々少年阅读 15,371评论 3 23
  • 总结 1.晚上11:50之前睡,早上7:30之前起 周一晚到周五早 每天早上sleeptown打卡 周一到周六✔ ...
    Laplace2Hash阅读 122评论 0 0
  • “当我们专注在做一件事情, 它本身都有一种宿命感在里面。” 李安已经获得了三座奥斯卡金像奖,但是他还是会把自己放到...
    無比阅读 209评论 0 0