类-自定义类 , 构造函数 , 类的抽离和调用 , 私有方法和私有属性 , 类中的getter和setter
类(class)
自定义类
类由属性和方法组成,类可以多次实例化
List , Map 是系统自带的类
自定义类要在main入口方法之外定义,自定义类的名称的首字母必须是大写
例1L自定义类
1
2
3
4
5
6
7
8
9
10
11
12class Person{ //自定义类
String name='张三';
int age=20; //类的属性
getInfo(){ //类的方法
print('姓名:$name 年龄:$age');
}
}
main(){ //自定义类要在入口方法外定义
var p1=new Person(); //实例化,吧自定义类Person实例化赋予p1
print(p1.name); //可单独打印出自定义类的某项属性 输出: 姓名:张三
p1.getInfo(); //可单独打印出自定义类的某个方法: 输出: 姓名:张三 年龄:20
}例2: 如何改变例1中的age属性
1
2
3
4
5
6
7
8//在Person类中添加自定义方法
setInfo(int age){
this.age=age;
}
//在实例p1中调用此方法
p1.setInfo(30);
print(p1.age); //输出: 30
p1.getInfo(); //输出: 姓名:张三 年龄:30
类的构造函数
实例化时自动触发的方法,就叫做构造函数
默认构造函数的名字和类的名字相同
例1:构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13class Person{
String name='张三';
int age=20;
getInfo(){
print('姓名:$name 年龄:$age');
}
Person(){ //构造函数
print('这是一个构造函数');
}
}
main(){
var p1=Person(); //构造函数在自定义类实例化后就会自动触发,实例化时可省略new关键词
} //输出: 这是一个构造函数例2:构造函数传入参数,达到动态给Person类改变属性的目的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class Person{
String name;
int age;
Person(String name,int age){ //给构造函数定义形参
this.name=name;
this.age=age;
}
void getInfo(){
print('姓名:$name 年龄:$age');
}
}
main(){
var p1=Person('老念',25); //实例化自定义类同时传入实参
Person p2=Person('张三', 20);
p1.getInfo(); //然后调用Person类的getInfo参数 输出: 姓名:老念 年龄:25
p2.getInfo(); //输出: 姓名:张三 年龄:20
}
//构造函数可简写为一句话
Person(this.name,this.age);
命名构造函数
默认构造函数只有一个,命名构造函数可以有多个,同样可以传入参数
例1:学习常量时的final可调用的DateTime.now中的DateTime是类,now是命名构造函数
1
2
3
4
5final a=new DateTime.now();
print(a);
//a=new DateTime.now();中的new可忽略为
final a=DateTime.now();
print(a); //输出: 2020-04-08 16:46:37.804031例2:命名构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23class Person{
String name;
int age;
Person(this.name,this.age); //简写的构造函数
Person.now(this.name,this.age){ //简写的命名构造函数,可传参姓名和年龄以外还有内容
print(DateTime.now()); //实例化同时会打印出DateTime.now();函数,打印出当前时间
}
void getInfo(){
print('姓名:$name 年龄:$age');
}
}
main(){
var p1=Person('老三', 20); //实例化默认构造函数
var p2=Person.now('老念', 25); //实例化Person类的命名构造函数now
p1.getInfo();
p2.getInfo();
}
//输出:
//2020-04-08 16:53:37.430958
//姓名:老三 年龄:20
//姓名:老念 年龄:25
//注意,print DateTime.now函数在实例化的时候就会自动执行,所以被打印在第一行
抽离自定义类和调用
吧自定义类单独抽离成为一个文件,模块化可随时调用更加方便维护,更加简洁
调用方法为: import’lib/person.dart’; 引号中内容为你的文件所在位置
例1:吧类放在新建文件夹中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20//这里以vscode为例,首先在vscode左侧编辑器中新建一个lib文件夹,然后文件夹中新建文件名为person.dart,然后吧自定义类的全部内容剪切放入此文件中
class Person{
String name;
int age;
Person(this.name,this.age);
Person.now(this.name,this.age){
print(DateTime.now());
}
void getInfo(){
print('姓名:$name 年龄:$age');
}
}
//随后在需要调用person类的工作文件中最顶部输出调用方法
import 'lib/person.dart';
main(){
var p1=Person('老三', 20);
var p2=Person.now('老念', 25);
p1.getInfo();
p2.getInfo();
}
私有方法和私有属性
在方法前加 _ 可让其成为私有方法,私有属性也是如此
私有方法或私有属性所在的类必须被抽出在单独文件,可通过this关键词来调用
私有方法在实例中无法直接调用,但可以在私有方法的类里使用this关键词,方法调用私有方法的方法来间接调用私有方法
例1.1:私有方法和属性的定义
1
2
3
4
5
6
7
8
9
10
11
12
13class Person{
String _name='张三'; //这是一个私有属性
int age;
getName(){
return this._name; //定义一个方法调用私有属性,吧_name返回到getName方法,也可以return _name;
}
_run(){ //这是一个私有方法
print('这是一个私有方法');
}
getRun(){ //同样通过其他方法调用此私有方法
return _run(); //return this._run();
}
}例1.2:私有方法和属性的调用
1
2
3
4
5
6import 'lib/person.dart'; //首先调用person类文件夹
main(){
var p1=Person();
print(p1.getName()); //调用getName方法来调用_name属性 输出: 张三
p1.getRun(); //调用getRun方法来调用_run方法 输出: 这是一个私有方法
}
类中的getter和setter
getter可当做计算属性来用,调用时按照调用属性的方法来调用
例1.1:使用自定义类和方法来计算r的面积
1
2
3
4
5
6
7
8
9
10
11
12class Rect{ //自定义类
num height; //属性高
num width; //属性宽
Rect(this.height,this.width); //结构函数传参宽高
area(){ //自定义方法,吧高*宽的值返回给方法
return height*width;
}
}
main(){
Rect r=Rect(10,4); //实例化Rect类并传参
print('面积:${r.area()}'); //调用area方法输出面积 输出: 面积:40
}例1.2:使用getter来改上面的例子
1
2
3
4
5
6
7
8
9
10
11
12class Rect{
num height;
num width;
Rect(this.height,this.width);
get area{ //使用了getter
return height*width;
}
}
main(){
Rect r=Rect(10,4);
print('面积:${r.area}'); //调用时像调用属性一样不带() 输出: 面积:40
}例2:使用setter方法改变高度,然后用getter计算面积
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class Rect{
num height;
num width;
Rect(this.height,this.width);
get area{
return height*width;
}
set reheight(value){ //setter方法
this.height=value; //可简化为 height=value;
}
}
main(){
Rect r=Rect(10,4);
r.reheight=6; //调用setter改变高度
print('面积:${r.area}'); //输出: 面积:24
}
类中的初始化列表
初始化列表指在实例化之前直接赋值给属性
例:初始化给长和宽数值 此值是在实例化之前赋予的
1
2
3
4
5
6
7
8
9
10
11
12class Rect{
num height;
num width;
Rect():height=10,width=2; //赋予初始化值
get area{
return height*width;
}
}
main(){
Rect r=Rect();
print('面积:${r.area}'); //输出: 面积:20
}