Dart面向对象编程(一)

370 阅读2分钟
原文链接: www.jianshu.com

类与对象

  • 使用关键字class声明一个类
  • 使用关键字new创建一个对象,new可以省略
  • 所有对象都继承Object类

属性与方法

  • 属性默认会生成setter和getter方法
  • 使用final声明的属性,只有getter方法
  • 属性和方法通过.来访问
  • 方法不能被重载 【与java区别,后面会提到mixins多继承也与java不同】
  • 使用_修饰的类,属性与方法为私有方法,作用域为当前library(库)
    '''
    void main() {
    var p = Person();
    p.name = "Tom";
    p.age = 22;
    p.work(); //name is Tom,age is 22,he is worker
    }

class Person {
String name;
int age;

//箭头函数以及插值表达式
work() => print("name is $name,age is $age,he is worker");
//报错不能重载
// work(String work){
//
// }
}
'''

计算属性

'''
void main() {
var rect = Rect();
rect.width = 20;
rect.height = 10;
print(rect.area); //200

rect.area=300;
print(rect.width);//15
}

class Rect { num width, height;

//计算属性
num get area {
return width * height;
}

set area(value) {
width = value / 20;
}

//面积方法
getArea() => width * height;
}

'''

构造方法

  • 没有定义构造方法,默认会生成一个

  • 存在自定义构造方法,则默认构造方法无效

  • 构造方法不能重载
    '''
    void main(){
    var p = Person("yxjie", 28, "your heart");

    var p2 =Person.withAddress("你的肺"); }

class Person{; String name;

int age;

final String address;//只能通过语法糖方式赋值

// Person(String name,int age){
// this.name=name;
// this.age=age;
// }

//与上面等价
Person(this.name,this.age,this.address);
//定义多个构造方法
Person.withAddress(this.address);
}
'''

常量构造方法

'''
void main(){
var p = Person("Jerry", 16);
// p.name="hhah";//报错
}
class Person{
final String name;
final int age;
const Person(this.name,this.age);
}
'''

工厂构造方法

''' class AndroidUtil{

final String name;

//工厂构造方法 特点返回一个对象实列
factory AndroidUtil(String name){
return AndroidUtil._innerConstruct(name);
}

AndroidUtil._innerConstruct(this.name);

} '''

初始化列表

  • 初始化列表会在构造方法体执行之前执行
  • 使用逗号分隔初始化表达式
  • 常用语设置final变量的值
    '''
    //初始化列表方式赋值
    Person.withMap(map) : address = map["address"] {
    this.name = map['name'];
    this.age = map["age"];
    }
    '''

静态成员

  • 使用关键字static实现类级别的变量和函数
  • 静态成员不可以访问非静态成员,非静态成员可以访问静态成员
  • 类中常量需要使用 static const 修饰(java中用static final修饰)

对象操作符

  • 条件运算符?.(与Kotlin一样)

  • 类型转换 as (与Kotlin一样)

  • 是否制定类型:is is!

  • 级联操作..
    '''
    void main() {
    var person;
    person?.work(); //不会运行
    var p;
    p = "";
    p = Person();
    (p as Person).work();

    if(p is Person){
    p.work();
    }
    //级联操作
    var p1 = Person();
    p1
    ..name = "jerry"
    ..age = 16;
    }
    class Person {
    work() => print("work ...");
    }
    '''

对象call方法

Dart中对象call方法类似于java中toString方法,区别在于Dart中call方法直接调用对象实列就行,java需要对象.toString()