类的概述
官方概述: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中,函数的区分,无法通过参数的多少来界定。所以同一个名称的构造函数或者普通成员方法,不管参数有多少,都只能有一个名称。
构造函数继承性区别
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(); // 这里报错!!!
}
正确的解法:
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,那么它不能有显式的构造方法(就是根本不能写任何的构造方法),如下图:
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