美文网首页
08Dart语言基础-类与对象

08Dart语言基础-类与对象

作者: Mark_Liu_JS | 来源:发表于2021-11-05 09:22 被阅读0次

1.类的基本使用

void main(List<String> args) {
  // Dart所有的东西都是对象,所有的对象都继承自Object类。
  // Dart中的类都是单继承的
  Person person = new Person();

  // 调用方法
  person.show();

  // 修改属性
  person.name = "jack";
  person.age = 18;

  // 访问属性
  print(person.name + ', ${person.age}');

  person.show();
}

// 定义类
class Person {
  String name = "";
  int age = 0;

  void show() => print("$name, $age");
}

2.构造函数

void main(List<String> args) {
  // 构造函数的功能主要用于在类的对象创建时定义`初始化`的状态
  // Dart语言中的构造函数分为`默认构造函数`和命名构造函数
  // 构造函数的命名必须和类名`完全相同`, 没有返回值

  // 1. 如果不显式写构造函数,默认提供一个无参构造

  // 默认的缺省构造
  // Person p = Person(); // new 关键字可以不写
  // print(p);

  // 2. 一旦显式提供构造函数,默认的缺省构造将不再提供,
  // 构造函数有且只能有一个
  // 构造函数可以简写
  Person p = Person('jack', 18);
  print(p);

  // 3. 命名构造可以有一堆 类名.xxx
  Person p2 = Person.init();
  print(p2);

  p2 = Person.setupInfo('rose', 22);
  print(p2);

  // 4.常量构造
  // 要使用常量构造方法,创建出相同的对象,使用const关键字
  // 如果是将结果赋值给const修饰的标识符时,const可以省略.
  Point point3 = const Point(10, 20);
  const point4 = Point(10, 20);
  print(identical(point3, point4));
}

// ========

class Person {
  var name;
  int age = 0;

  // 构造函数可以简写
  Person(this.name, this.age);

  // Person(var name, int age) {
  //   print('有参构造');
  //   this.name = name;
  //   this.age = age;
  // }

  // Person(); // 构造函数只能有一个,因为不能重载

  // 命名构造
  Person.setupInfo(var name, int age) {
    this.name = name;
    this.age = age;
  }

  Person.init({var name, int age = 0}) {
    this.name = name;
    this.age = age;
  }
}

class Point {
  final int x;
  final int y;

  // 在构造函数前加上 const 变成常量构造
  const Point(this.x, this.y);
}

3.初始化列表

void main(List<String> args) {
  // 初始化列表,在C++中有类似的语法
  // Dart中我们也可以在构造函数体运行之前初始化实例变量
  // 所有的成员变量都是final, C++是有包含有const的成员

  Rect r = Rect(10, 20);
  print(r.circle);
}

class Rect {
  final int width;
  final int height;

  final int circle; // 周长

  // Rect(this.width, this.height) {
  //   this.circle = width * height; // 'circle' can't be used as a setter because it's final.
  // }

  // 上面的方法不行,除非三个值全部用构造,除了这个方法,我们还可以使用初始化列表
  Rect(this.width, this.height) : circle = ((width + height) * 2) {
    print("初始化列表");
  }
}

4. 重定向构造与工厂构造

void main(List<String> args) {
  // 1.重写向构造:在一个构造函数中去调用另一个构造函数
  Person p = Person.setupInto('jack', 20);

  // 2.工厂构造
  // Dart提供了factory关键字, 用于通过工厂去获取对象,  如果对象存在直接返回,否则创建

  Person p1 = Person.map({'name': 'rose', 'age': 18});
  Person p2 = Person.map({'name': 'jack', 'age': 22});
  print(identical(p1, p2)); // true, 因为是直接获取对象

  // 3.利用工厂构造来实现单例
  Singleton s1 = Singleton();
  Singleton s2 = Singleton();
  print(identical(s1, s2));
}

class Person {
  String name;
  int age;
  static var _cache;

  Person(this.name, this.age) {
    print("我被调用了");
    this.name = name;
    this.age = age;
  }
  Person.setupInto(String name, int age) : this(name, age);

  // 工厂构造
  factory Person.map(Map map) {
    if (Person._cache == null) {
      Person._cache = Person.setupInto(map['name'], map['age']);
      print("创建对象");
    }

    return Person._cache;
  }
}

class Singleton {
  static final Singleton _singleton = Singleton.internal();

  factory Singleton() {
    print('Singleton 工厂构造被调用');
    return _singleton;
  }

  Singleton.internal() {
    print('internal 被调用了');
  }
}

5.setter && getter

void main(List<String> args) {
  // getter的定义方式 get+方法名
  // setter的定义方式 set+方法名(参数)
  // 注意:getter方法是没有( )的。返回值类型可以不用声明。
  // setter方法有且只能接收一个参数

  // 注意调用方式,是以属性修改的方式,不是以函数调用的方式。
  Person p = Person();
  p.name = 'jack'; // 这样是不会调用 setter和getter的
  print(p.name);

  // 调用 setter getter的正确姿势
  p.setName = 'rose';
  print(p.getName);
}

class Person {
  var name;

  // set方法
  set setName(String name) {
    print('设置');
    this.name = name;
  }

  // get 方法
  get getName {
    print('获取');
    return this.name;
  }
}

6. 对象运算符

void main(List<String> args) {
  // is 是父类或当前类
  // is! 不是
  // as 转换
  // ?
  // .. 级联运算
  int data = 100;
  print(data is num); // true
  print(data is int); // true

  num n = 100;
  print(n is int); // true
  print(n is Object); // true

  print((n as int).runtimeType); // int
  // print((n as double)); // 转换失败

  var p;
  p?.show(); // 如果 p 为 null, 不执行 show()方法,这和Swfit相同的

  Person p2 = Person(name: 'jack', age: 20);
  p2
    ..name = 'rose'
    ..age = 18
    ..show();
}

class Person {
  String name = "";
  int age = 0;

  Person({this.name = "", this.age = 0});

  void show() => print("$name, $age");
}

7. static关键字

void main(List<String> args) {
  // static的用法与其它语言几乎是一样的
  // 使用 static 关键字来实现类级别的变量和函数
  // 静态方法不能访问非静态成员,非静态方法可以访问静态成员
  // 这些和其它语言几乎是一样的

  Person.printInfo();
  Person.country = "美国";

  Person p = Person();
  p.show();
  // p.country = "ABC"; // 不允许在界面,通过对象来访问静态成员
  // p.printInfo(); // 同上
}

class Person {
  String name = "";
  static String country = "中国";

  static printInfo() {
    // print(name); // 错误,不能访问非静态成员
    print(country);
  }

  void show() {
    country = "abc"; // 在类内,非静态成员可以访问静态成员
    print("$name, $country");
  }
}

8.类的分离与私有属性

  • Peron文件
class Person {
  String _name = "";

  set setName(String name) {
    _name = name;
  }

  get name => _name;
}

  • main文件
import './person.dart';

void main(List<String> args) {
  // Dart 中没有 public private protected这些访问修饰符
  // Dart中使用 _ (下划线) 把一个属性或者方法定义成私有
  // 私有属性在同一文件,都是可以访问的
  Student stu = Student();
  stu._name = 'jack';

  Person p = Person();
  // p._name = 'jack'; // 不能访问

  // 通过 getter和setter来访问
  p.setName = "rose";
  print(p.name);
}

class Student {
  String _name = "";
}

相关文章

  • 08Dart语言基础-类与对象

    1.类的基本使用 2.构造函数 3.初始化列表 4. 重定向构造与工厂构造 5.setter && getter ...

  • 原型与原型链

    参考文章:原型与原型链 1.类是面向对象语言实现信息封装的基础,类的实例称为对象 2.JavaScript这门语言...

  • 类和对象

    Java是一门面向对象的语言,面向对象是Java这门语言的灵魂,也是面向对象设计的重要理论与实践基础。 类 语法 ...

  • 深入理解python之类的创建过程

    类是面向对象编程理论的基础,python作为一门支持面向对象的语言,其在类的创建机制上,与传统的编译型静态语言有着...

  • 第一章:熟悉OC

    OC语言特性:-1. OC是在C的语言基础上添加了面向对象特性。 -2. OC与C++,JAVA等面向对象的语言类...

  • 3. Java面向对象编程

    类与对象[1] Java是面向对象的汇编语言(面向机器)—— c语言(面向过程)—— java语言(面向对象) 类...

  • Swift3.x - 类和结构体

    类的介绍和定义 Swift也是一门面向对象的开发语言。 面向对象的基础就是类,类产生对象。 Swift如何定义类:...

  • 怎样学习一门新语言

    学习新语言 语法基础:入门概述、quick start、数据结构、流程控制与异常处理、函数、模块与组件、类与对象、...

  • 接上面的基础语法(Swift中类的使用)

    类的介绍和定义 1.Swift 也是面向对象的语言,面向对象的基础是类,类产生的对象,那么Swift中如何定义类呢...

  • 原型链_继承

    概述 大部分面向对象的编程语言,都是基于“类”(class)作为对象体系的语法基础。JavaScript 语言不是...

网友评论

      本文标题:08Dart语言基础-类与对象

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