类的声明与使用
// 类的声明
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 null
Person.setName('postbird');
p1.printName(); // name is postbird
print(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 {
@override
speak() {
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!
}