arrow-left arrow-right brightness-2 chevron-left chevron-right circle-half-full dots-horizontal facebook-box facebook loader magnify menu-down rss-box star twitter-box twitter white-balance-sunny window-close
java-dart比较 - 类
5 min read

java-dart比较 - 类

类的概述

官方概述:Dart 是一种基于类和 mixin 继承机制的面向对象的语言。 每个对象都是一个类的实例,所有的类都继承于 Object. 。 基于Mixin 继承意味着每个类(除 Object 外)都只有一个超类,一个类中的代码可以在其他多个继承类中重复使用。

概述跟java基本一致,只是在实际写法中,dart做了很多优化,有很多简化的语法糖。

类的构造函数

命名区别

dart的构造函数一个名称只能有一个函数,默认构造函数名称就是类名,如果要定义多个构造函数,那么就要定义其他的别名,规则是类名.别名(参数列表),例如:

class ClsA {
  int a;
  int b;

  // 传统构造函数,自己赋值参数 [代码1]
  ClsA(int a) {
    this.a = a;
  }

  // dart的语法糖,this.a代表参数也代表赋值【代码2】
  ClsA(this.a, this.b); // 这里会报错,因为已经有了一个默认名称的构造函数

  // 自定义名称的构造函数【代码3】
  ClsA.Cons(this.a);

  void printHello() {
    print('hello world: ${a}');
  }
}

在代码2中,会报错,是因为已经有了ClsA(int a)的构造函数,虽然代码2的构造函数是多个参数的,但dart中,函数的区分,无法通过参数的多少来界定。所以同一个名称的构造函数或者普通成员方法,不管参数有多少,都只能有一个名称。

image-20200605141711067
image-20200605144848396

构造函数继承性区别

dart的默认构造函数天生继承父类的构造函数,并且不会被覆盖,而java就不会,java需要调用super显示调用。

class A {
  A() {
    print('hello world a');
  }
}

class B extends A {
  B() {
    print('hello world b');
  }
}

void main() {
  var b = B();
}

输出:

hello world a
hello world b

dart中也有super关键字,只是调用的方式不一样:

class A {
  A() {
    print('hello world a');
  }
}

class B extends A {
  B() : super() { // 紧随构造方法括号之后,加上冒号和super调用
    print('hello world b');
  }
}

void main() {
  var b = B();
}

输出同上。

dart如果父类包含有参的默认构造函数,那么子类必须显示调用父类的构造函数,而Java则没有这样的要求,java可以覆盖或者定义不同参数的构造函数。

class A {
  int a;
  A(this.a) {
    print('hello world a');
  }
}

class B extends A {
  B(); // 这里报错!!!
}
image-20200605144113187

正确的解法:

class A {
  int a;
  A(this.a) {
    print('hello world a');
  }
}

class B extends A {
  B() : super(1);
}

类的实例化

dart类的实例化,不需要用new关键字,直接把类名当普通函数来调用即可,而java是必须用new来生成对象的。

接口与class并存,但interface已消失

dart中不存在interface的关键字,但接口还是存在的,并且接口变成了类,就是说,任何一个类都可以视作是一个接口,区分就是如果你用implements来实现它,那么它里面的除构造函数外的其他任何成员(成员变量和成员方法),你都要重新实现。

//接口学习
class InterA {
  // 成员变量,包含在接口里,需要实现getter方法
  final a = null;

  // 构造函数,不包含在接口中
  InterA.test() {
    print('hello interface a');
  }

  // 成员方法,包含在接口中,需要重新实现
  void hello() {
    print('hello interface function');
  }
}

class SuperClass implements InterA {

  get a => 'this is a';

  @override
  void hello() {
    print('hello override function');
  }
}

void main() {
  SuperClass().hello();
}

总之,任何类都可以作为接口,只要是被implements了。

为类添加新功能:mixin

什么是mixin:Mixin 是复用类代码的一种途径, 复用的类可以在不同层级,之间可以不存在继承关系,通过 with 后面跟一个或多个混入的名称,来 使用 Mixin。

用我的话讲就是,with后面带一个或多个类,可以复用这些类的方法。当然如果Mixin不希望作为常规类被使用,可以用mixin关键字替换class

// mixin学习
class ClsMixin {
  var a = 1;
  void hello() {
    print('hello mixin class');
  }
}

mixin NoClsMixin {
  var a = 2;
  void hello() {
    print('hello no class mixin');
  }
}

class MyClass1 with ClsMixin {

}

class MyClass2 with NoClsMixin {

}

void main() {
  MyClass1().hello();
  print(MyClass1().a);

  MyClass2().hello();
  print(MyClass2().a);
}

输出:

hello mixin class
1
hello no class mixin
2

当然,如果一个类要被作为一个mixin,那么它不能有显式的构造方法(就是根本不能写任何的构造方法),如下图:

image-20200605160031670

static的关键字和java一致

被修饰后的函数或者成员变量,均属于类,而不属于对象,不能访问this

泛型的使用和java一致,并无差别

var names = <String>['Seth', 'Kathy', 'Lars'];   // 初始化为全部为String类型的List集合对象
var uniqueNames = <String>{'Seth', 'Kathy', 'Lars'}; // 初始化为全部为String的Set集合对象
var pages = <String, String>{ // 初始化为key和value都是String的Map集合对象
  'index.html': 'Homepage',
  'robots.txt': 'Hints for web robots',
  'humans.txt': 'We are people, not machines'
};

类型判定

java中使用instanceOf关键字,dart则是is

Enjoying these posts? Subscribe for more

Subscribe now
Already have an account? Sign in
You've successfully subscribed to Tester Ming - UI自动化领域专家.
Success! Your account is fully activated, you now have access to all content.
Success! Your billing info is updated.