FlutterDart

Dart 面向对象 上(二)

2020-02-12  本文已影响0人  向日花开

Dart 也是面向对象的语言,同样有着封装、继承、多态的特性。

类的定义

同 Java 一样使用 class 关键字申明一个类,final 修饰的属性,不能被外部重新赋值,只可读,不可写。

//类的定义, class 作为关键字声明
class Person {
  //共有变量
  String name;

  //私有变量
  int _age;

  //final修饰的属性,不能被外部重新赋值,只可读,不可写
  final String phone = '12345678901';

  //类方法
  String show() {
    String msg = "name:${this.name}\tage:${this._age}\tphone:${this.phone}";
    print(msg);
    return msg;
  }
}

类的权限

Dart 类中默认的权限都是公开的,在变量或者方法名前面加下划线"_”的前缀即为私有变量或方法。

  //私有变量
  int _age;
  //私有方法
  void _info(){
    String msg = "name:${this.name}\tage:${this._age}\tphone:${this.phone}";
    print(msg);
  }

类的实例化

Java 中类的实例化需要用到 new 关键字,dart 实例化也一样,或者直接省略 new 关键字,获得对象 。

    Person person = new Person();
    Person person1 = Person();

    person.name = "person";
    person1.name = "person1";

    person.show();
    person1.show();

Getter 和 Setter 方法

对于类的私有变量,我们不可以直接访问,赋值。我们可以通过 get 和 set 方法来获取和赋值。

  //getter  setter 方法

  //get 获取age
  int get age => _age;

  //set 设置age
  set age(int value) {
    _age = value;
  }

构造方法

常见的有参无参构造方法
//动物类定义
class Animal {
  String name;

  int age;

  //1.默认的无参构造函数
  //Animal() {}


  //2.Dart语法糖有参构造方法,因为Dart 不能重载,所以默认的注释
  Animal(this.name,this.age);

  //类方法
  void show() {
    String msg = "name:${this.name}\tage:${this.age}";
    print(msg);
  }
}


void main(){
  Animal animal1 = new Animal();
  animal1.name = "猫咪";
  animal1.age = 1;
  animal1.show();

  Animal animal2 =new Animal("Dog", 2);
  animal2.show();
}

命名构造方法

定义: 类名.方法名(),和一些自己需要赋值的参数。

作用:可以灵活的根据需要定义多个自己需要的构造函数。

 //3.命名构造方法
  Animal.withNew(String name,int age){
    this.name=name;
    this.age=age;
  }

  Animal animal3 = Animal.withNew("猪", 1);
  animal3.show();
常量构造方法

当类的属性设置一次之后,就不会再设置了,那么这个类就可以声明为常量类,常量类的属性使用 final 修饰,而构造方法使用 const 修饰。

//4.常量构造方法
//如果需要将对象作为常量,就需要将构造方法声明为常量构造方法
//使用常量构造方法的对象,属性和构造方法都为常量,属性使用final修饰,构造方法使用const修饰
//常量型对象运行时更快,如果对象的值设置一次后就不会改变,可以使用这种方式
class Animal1 {
  final String name;

  final int age;

  const Animal1(this.name, this.age);

  //类方法
  void show() {
    String msg = "name:${this.name}\tage:${this.age}";
    print(msg);
  }
}

  const animal4 = Animal1("驴", 10);
  animal4.show();

工厂构造方法
///5.工厂构造方法演示
class Logger {
  static Logger _cache;

//  工厂构造方法:
//  不仅仅是构造方法,更是一种模式
//  有时候为了返回一个之前已经创建的缓存对象,原始的构造方法已经不能满足要求
//  那么可以使用工厂模式来定义构造方法
  factory Logger() {
    if (_cache == null) {
      _cache = Logger._internal();
    }
    return _cache;
  }

  Logger._internal();

  void log(String msg) {
    print(msg);
  }
}
参数列表构造方法

初始化列表的格式,在构造方法名后加 :属性=值,不同的变量用逗号分隔。

// 6.参数列表构造方法
class Animal2 {
  String name;

  int age;

  final String id;

  //
  Animal2(String name, this.age)
      : name = name,
        id = "12";
}

静态成员

对象操作符

安全对象操作符(?)

判断一个对象为空不用在写 if 判断,直接如下:

Person person;
//?.对象操作符,在对象为null时,不会进行调用
person?.show();

as 操作符

将对象强制转为某一类型,如果类型强转出错则会抛出异常。

//没有推断出Person,类型为dynamic
var person2;
//因为类型为dynamic,可以赋值任意类型
person2 = "";
//as操作符,强转类型,这里是String类型,强转为Person类型会抛出异常。
(person2 as Person).show();

is 操作符

判断对象是否为某个类型的实例。是返回 true,不是则返回 false,dart 通过 is 判断后不需用 as 转型即可使用。

if (person2 is Person) {
    print('object is Person');
}

if (person2 is Person) {
    //经过了is操作符判断,就不用as操作符再转换再操作
    person2.show();
}
..级联操作符

对象后面.. ,即可实现对象的链式调用。

//级联操作符,每次操作后都返回自身,方便链式调用
var person3 = new Person();
person3
..name = 'hello'
..age = 20
..show();

最后

贴一张自己学习Flutter的公众号,感兴趣的小伙伴可以一起学习哦。。。

上一篇下一篇

猜你喜欢

热点阅读