类的声明与使用
// 类的声明class Person {// 类属性声明String name;int age;int sex;// 普通构造函数Person(String name, int age, [int sex = 1]) {this.name = name;this.age = age;this.sex = sex;}// 方法声明void getInfo() {print('My name is ${name}, my age is ${age}, and I am a ${sex == 1 ? 'man' : 'woman'}');}// 修改类属性void changeName(String name) {if (name != null) {this.name = name;}}}
类的引入
实例化 Person 类
Person p = new Person(‘ada’, 20, 0);
p.getInfo();
静态成员
静态方法只能访问静态属性,不能访问非静态属性。
class Person {static String name;int age;static void setName(String name) {Person.name = name;// this.age = 20; // error}void printName() {print('name is ${Person.name}');}}void main() {Person p1 = new Person();p1.printName(); // name is nullPerson.setName('postbird');p1.printName(); // name is postbirdprint(Person.name); // postbird}
? 、is 、as 和 .. 操作符
? 操作符用于判断如果实例存在则调用方法,否则不调用
is 用于判断是否归属于某个类的实例或者子类
as 用于声明某个实例当做某个类使用,比如 子类 as 父类
.. 级联操作符用于串联操作
extends 继承
子类继承父类使用 extends 关键字,dart 没有多继承
重写方法最好加上 @override 注解,便于协作
子类构造方法中,如果要初始化父类构造方法,使用 super 关键字,比如 Dog(String name, int age, [String nickName]) : super(name, age);
子类中调用父类的方法使用 super.fun()
类的 多态
多态举个例子通俗来讲,就是将改变子类实例的类型是父类,父类能够调用子类中同名的方法,输出结果与子类相同,但是不能调用父类没有子类中拥有的方法。
实际上就是将子类的方法覆盖父类的方法。
Animal d1 = new Dog(); 虽然是 new Dog() 但是 d1 的类型是 Animal,因此调用 d1.speak() 时,实际上调用 d1 子类的方法差不多,但是因为 Animal 没有 run 方法,因此不能调用 d1.run()。
class Animal {speak() {}}class Dog extends Animal {@overridespeak() {print('wang!');}run() {print('dog run!');}}void main() {print('---------多态------------');Animal d1 = new Dog();Dog d2 = new Dog();d1.speak(); // wang!// d1.run(); // Error: The method 'run' isn't defined for the class 'Animal'.d2.speak(); // wang!d2.run(); // dog run!}
