Skip to content
On this page

前言

  • 类(Class)是一种用于创建对象的模板,它定义了对象的属性(字段)和方法(函数)。类允许您将数据和功能组合成一个独立的单元,这有助于实现抽象、封装和代码的模块化

class的声明

  • 下面是一个简单的 Person 类的定义
  • 包含 name 和 age 属性 及 构造函数
  • 抽象类 不能被实例化 常用于声明接口方法、有时也会有具体的方法实现。
dart
class Person {
  String name = '';
  int age = 0;

  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
}
// 抽象类 不能被实例化,
abstract class Poin{}

constructor

  • 构造函数:
  • 默认构造函数
  • 具名构造函数
  • 语法糖

默认构造函数

dart
class Person {
  String name = '', habby = '';
  int age = 0;

  // 默认构造函数 和类型相同
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

}


具名构造函数

dart
class Person {
    // 属性
  String name = '', habby = '';
  int age = 0;
  // 具名构造函数 使用 new Person.newConstructor('', '')
  Person.newConstructor(String name, String habby) {
    this.name = name;
    this.habby = habby;
  }
}

构造函数语法糖

dart
class Person {
  String name = '', habby = '';
  int age = 0;

  // 构造函数 语法糖
  Person(this.name, this.age);

   // 等价于下面这种写法
  // Person(String name, int age) {
  //   this.name = name;
  //   this.age = age;
  // }

}

属性和方法

属性和方法

  • 下面是一个学生类
  • 属性:name grade major school
  • 方法:printInfo 打印学生信息
  • 类的属性和方法都可以通过实例化处理的对象访问
dart
class Student {
  // 属性
  String name = '';
  int grade = 1;
  String major = '';
  String school = '';

  // 构造函数
  Student(String name, int grade, String major, String school) {
    this.name = name;
    this.grade = grade;
    this.major = major;
    this.school = school;
  }

  // 方法:打印学生信息
  void printInfo() {
    print('Name: $name');
    print('Grade: $grade');
    print('Major: $major');
    print('School: $school');
  }
}

静态属性和静态方法

  • 静态属性和静态方法 只能通过类名访问 Student.xxx
  • 需要使用static 关键字标识
dart
class Student {
	...
  // 静态属性
  static int totalStudents = 0;

  // 静态方法
  static void printTotalStudents() {
    print('Total students: $totalStudents');
  }
	...
}
// 在外面访问访问
Student.printTotalStudents();
Student.totalStudents;

实例化

  • new ClassName()
  • 2.0后面的版本就可以省略new关键字了
  • 实例化对象
dart
void main() {
  Student student1 =
      new Student('Alice', 11, 'Computer Science', 'ABC High School');
  Student student2 = Student('Bob', 12, 'Physics', 'XYZ School');

	final name = student1.name; // "Alice"
  final major = student1.major; // 'Computer Science'
}

class Student {
  String name = '';
  int grade = 1;
  String major = '';
  String school = '';

  // 静态属性
  static int totalStudents = 0;

  // 构造函数
  Student(String name, int grade, String major, String school) {
    this.name = name;
    this.grade = grade;
    this.major = major;
    this.school = school;
  }

  // 方法:打印学生信息
  void printInfo() {
    print('Name: $name');
    print('Grade: $grade');
    print('Major: $major');
    print('School: $school');
  }

  // 静态方法
  static void printTotalStudents() {
    print('Total students: $totalStudents');
  }
}

继承

  • extends 关键字实现继承
dart
void main() {
	Action a1 = new Action();
  a1.jumpFn(); // I am Jump class
  a1.actionFn(); // I am Action class
}

class Jump {
  void jumpFn() {
    print('I am Jump class');
  }
}

class Action extends Jump {}

继承的父类存在构造函数

dart
void main() {
	Action a1 = new Action(10, 20, '小易');
  a1.jumpFn(); // I am Jump class
  a1.actionFn(); // I am Action class
  a1.height; // 10
  a1.withs; // 20
  a1.name; // 小易
}

class Jump {
  String name = '';

  Jump(this.name);

  void jumpFn() {
    print('I am Jump class');
  }
}

class Action extends Jump {
  int height = 0;
  int withs = 0;
  // String name = '';
  Action(this.height, this.withs, String name) : super(name);

  void actionFn() {
    print('I am Action class');
  }
}

重写父类方法override

dart
void main() {
  Action a1 = new Action();
  a1.jumpNew(); // 222222
}

abstract class Jump {
  void jumpNew() => print('1111111');
}

class Action extends Jump {

  // 重写父类 方法
  @override
  void jumpNew() => print('222222');
}

getter和setter

  • getter和setter就是对属性访问和设置进行拦截及自定义返回
dart
void main() {
  var ph1 = new Phone();
  ph1._price; // 0
  ph1.set(2);
  ph1._price; // 4
}

class Phone {
  int _price = 0;

  get() {
    return _price;
  }

  set(newVal) {
    if (newVal != _price) {
      _price = newVal;
    }
  }
}