0%

Dart学习笔记 (六)

-自定义类 , 构造函数 , 类的抽离和调用 , 私有方法和私有属性 , 类中的getter和setter

类(class)

自定义类

  • 类由属性方法组成,类可以多次实例化

  • List , Map 是系统自带的类

  • 自定义类要在main入口方法之外定义,自定义类的名称的首字母必须是大写

    例1L自定义类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class 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
    13
    class 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
    21
    class 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
    5
    final 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
    23
    class 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
    13
    class 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
    6
    import '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
    12
    class 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
    12
    class 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
    16
    class 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
    12
    class Rect{
    num height;
    num width;
    Rect():height=10,width=2; //赋予初始化值
    get area{
    return height*width;
    }
    }
    main(){
    Rect r=Rect();
    print('面积:${r.area}'); //输出: 面积:20
    }
-------------本文有底学海无涯-------------