Dart——类

150 阅读3分钟

Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类

创建类

class Persion{
    // name 不可为空 可以增加late 或默认值
    late String name ;
    // age 不可为空 可以增加late 或默认值
    int age = 0 ;
    void getInfo(){
        print("$name $age");
    }

}

构造函数

//创建类
class Persion{
 late String name  = "哈哈";
  int age  = 0 ;
  void getInfo(){
    print("$name $age");
  }
  // 默认构造函数
  Persion(){
  }
}
class Persion{
 late String name;
 late int age;
 // Persion(String name,int age){
 //  this.name = name;
 //  this.age = age;
 // }
 // 下面是上面的简写,是等价的
 Persion(this.name,this.age);
}
class Persion{
 late String name;
 late int age;
 // 这样写需要加 late 
  Persion(String name,int age){
    this.name = name;
    this.age = age;
  }
}

class Persion1{
   String name;
   int age;
   // 这样写不需要加late 
   Persion1(this.name,this.age);

}

Dart命名构造函数

Dart里面构造函数可以写多个,这个时候我需要通过命名构造函数来实现。

回顾一下我们前面用到的命名构造函数,下面代码表示实例化DateTime调用它的命名构造函数。

//调用的就是命名构造函数
var data = new DateTime.now();
class Persion{
 late String name;
 late int age;
 // 默认构造函数
 Persion(this.name,this.age);
 Persion.now(){
  print("命名构造函数");
 }
 Persion.setInfo(String name,int age){
  this.name = name;
  this.age = age;
 }
}

var p1 = new Persion('哈哈', 45);
var p2 =  new Persion.now();
var p3 = new Persion.setInfo('呵呵', 60);

// 最新版本创建对象可以不加new 
var p4 =  Persion('哈哈', 45);

Dart中我们也可以在构造函数体运行之前初始化实例变量

class Persion{
  String name;
  int age;
  Persion():name = "哈哈",age = 20{
  }

}

私有方法和私有属性

Dart和其他面向对象语言不一样,Data中没有 public private protected这些访问修饰符符。 但是我们可以使用 _ 把一个属性或者方法定义成私有。

class Persion{
 //私有属性
 late String _name;
 late int age;
 getName(){
  return this._name;
 }
 //私有方法
 _run(){
 }
}

Dart中的静态成员

1、使用static 关键字来实现类级别的变量和函数。 2、静态方法不能访问非静态成员,非静态方法可以访问静态成员

简单使用
void main(List<String> args) {
  print(Persion.name);
  Persion.show();
}

class Persion{
  static String name = '哈哈';
  static void show(){
    print(name);
  }
}
class Persion{
  static String name = "哈哈";
  int age = 20;
  static void show(){
    print(name);
  }
  // 非静态方法可以访问静态成员
  void printInfo(){
    print(name); //静态成员
    print(age);
  }
  static void printUserInfo(){
    print(name);
    show();
    // print(age); 不可访问
    // printInfo(); 不可访问
  }
}

Dart中的静态成员 中 as 类型转换 is类型判断 ..级联操作

class Persion{
 late String name;
 late int age;
 // 这样写需要加 late
  Persion(String name,int age){
    this.name = name;
    this.age = age;
  }
  void printInfo(){
    print("$name -- $age");
  }
}

void main(List<String> args) {
  Object p = Persion('哈哈', 20);
  // 判断类型
  if (p is Persion){
    p.name = "呵呵";
  }
  (p as Persion).printInfo();
  print(p is Object);

  Object b = Persion('大聪明', 20);
  // 类型转换
  (b as Persion).printInfo();
  
  var p2 = Persion('哈哈', 34);
  p2 ..name = '小李'
     ..age = 30
     ..printInfo();
}

Dart中类的继承

Dart中类的继承

  1. 子类使用extends关键词来继承父类。
  2. 子类会继承父类里面可见的属性和方法,但是不会继承构造函数。
class Persion{
  String name = '';
  int age = 20;
  void printInfo(){
    print('$name -- $age');
  }
}

class Web extends Persion{

}
void main(List<String> args) {
  var w = Web();
  w.name = '哈哈';
  w.printInfo();
}
class Persion{
  String name = '';
  int age = 20;
  void printInfo(){
    print('$name -- $age');
  }
  Persion(this.name,this.age)
}

class Web extends Persion{
  // 子类不会继承父类的构造方法,
 Web(String name, int age): super(name,age);

}
class Persion{
  String name = '';
  int age = 20;
  void printInfo(){
    print('$name -- $age');
  }
  Persion(this.name,this.age)
}

class Web extends Persion{
  // 新增属性
  late String sex;
  // 子类不会继承父类的构造方法,
 Web(String name, int age,String sex): super(name,age){
   this.sex = sex;
 }
}
// 调用父类的 自定义构造函数
class Persion{
  String name = '';
  int age = 20;
  void printInfo(){
    print('$name -- $age');
  }
  Persion(this.name,this.age);
  Persion.info(this.name,this.age);
}

class Web extends Persion{
  late String sex;
  // super.info 调用父类的 自定义构造函数
 Web(String name, int age,String sex): super.info(name, age){
   this.sex = sex;
 }
}
// override 重写父类的方法
class Persion{
  String name = '';
  int age = 20;
  void printInfo(){
    print('$name -- $age');
  }
}

class Web extends Persion{
 // 重写父类的方法
 @override
  void printInfo() {
    // TODO: implement printInfo
    super.printInfo();
  }
}