美文网首页Flutter圈子FlutterFlutter
Dart与Java的语法及概念异同点汇总

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

作者: JuliusL | 来源:发表于2020-04-07 23:49 被阅读0次

变量

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(导出)

相关文章

网友评论

    本文标题:Dart与Java的语法及概念异同点汇总

    本文链接:https://www.haomeiwen.com/subject/kjmpphtx.html