让你看懂dart中静态成员和继承

静态属性和静态方法

在dart中,我们可以通过关键字
static来定义静态属性和静态方法。

需要注意的是:
静态方法不能访问非静态属性【结论1】
非静态方法可以访问静态成员【结论2】
我们通过下面的一段代码来解释【结论1】和【结论2】

访问静态属性或者调用静态方法
直接通过类来访问

访问静态属性和静态方法

void main() {
  // 调用静态方法
  PerSonInfo.showInfo();
  // 访问静态属性
  print(PerSonInfo.name);
}

class PerSonInfo {
  static String name = '张三';
  int age;
  
  static void showInfo() {
     【结论1】
    // 会报错,静态方法中,不能够访问非静态属性
    // print(age);
    print(name);
  }

  // 非静态方法中可以访问静态成员【结论2】
  show() {
    print('姓名$name');
    print('年龄$age');
  }
}

级联操作符 .. 的使用

void main() {
  var p = new PerSonInfo('张三', 10);
  // p.name = '李四';
  // p.age = 50;
  // p.show();
  
  //等价上面的代码
  p
    ..name = '李四'
    ..age = 50
    ..show();
}

class PerSonInfo {
  String name;
  int age;
  PerSonInfo(this.name, this.age);
  show() {
    print(this.name);
    print(this.age);
  }
}

dart中的继承

我们都知道dart一门面向对象的语言
那么面向对象的语言中
有继承、封装、多态、这三个基本特征

继承:
子类使用extends关键字来继承父类
子类会继承父类中可见的属性和方法
但是不会去继承父类中的构造函数
子类是可以去重写父类中的方法
下面我们写一个Grils类去继承父类PerSonInfo
虽然Grils类中什么都没没有写
我们看一下是否可以继承父类中的属性和方法
void main() {
  var g = new Grils();
  g.show();
}

class PerSonInfo {
  String name='张三';
  int age=10;
  show() {
    print(this.name);
    print(this.age);
  }
}
class Grils extends PerSonInfo {}

继承时需要注意的点

class PerSonInfo {
  String name = '张三';
  int age = 10;
  PerSonInfo(this.name,this.age);
  show() {
    print(this.name);
    print(this.age);
  }
}

//Grils 会报错
//因为子类是不能够去继承父类中的构造方法的
class Grils extends PerSonInfo {}
遇见的问题:
如果我们不要PerSonInfo类的构造函数
那么这个PerSonInfo类只能够输出一个人的信息
如何解决了

子类调用父类的构造函数super

void main() {
  var g = new Grils('李四',30);
  g.show();
}

class PerSonInfo {
  String name = '张三';
  int age = 10;
  PerSonInfo(this.name,this.age);
  show() {
    print(this.name);
    print(this.age);
  }
}

class Grils extends PerSonInfo {
  //super我们可以理解为调用父类中的额构造并且赋值 
  Grils(String name, int age) : super(name, age);
}

子类可以有自己的属性和方法

void main() {
  var g = new Grils('李四', 30, '女');
  g.show();
  g.say();
}

class PerSonInfo {
  String name = '张三';
  int age = 10;
  PerSonInfo(this.name, this.age);
  show() {
    print(this.name);
    print(this.age);
  }
}

class Grils extends PerSonInfo {
  //子类中自己的属性
  String sex;
  Grils(String name, int age, String sex) : super(name, age) {
    this.sex = sex;
  }
  
  //子类中自己的方法
  say() {
    print('你好呀');
  }
}

优先调用子类方法的如果子类没有在去找父类

void main() {
  var g = new Grils();
  g.say();//输出  你好呀,我是子类
}

class PerSonInfo {
  say() {
    print('你好呀,我是父类');
  }
}

class Grils extends PerSonInfo {
  
  say() {
    print('你好呀,我是子类');
  }
}

给命名构造函数传递参数

void main() {
  var g = new Grils('李四', 30, '女');
  g.show();
  g.say();
}

class PerSonInfo {
  String name = '张三';
  int age = 10;
  PerSonInfo(this.name, this.age);
  PerSonInfo.mingFun(this.name, this.age);

  show() {
    print(this.name);
    print(this.age);
  }
  say() {
    print('你好呀,我是父类');
  }
}

class Grils extends PerSonInfo {
  String sex;
  Grils(String name, int age, String sex) : super.mingFun(name, age) {
    this.sex = sex;
  }

  say() {
    print('你好呀,我是子类');
  }
}

复写父类中的方法

在项目的实际开发中
父类中的方法可能不在适用了
那么这个时候我们可以重写父类中的方法
重写父类中的方法可以让代码变得可以扩展
覆写父类中的方法,不需要添加分号
@override
void main() {
  var g = new Grils('李四', 30, '女');
  g.say();
}

class PerSonInfo {
  String name;
  int age;
  PerSonInfo(this.name, this.age);
  say() {
    print('你好呀,我是父类');
  }
}

class Grils extends PerSonInfo {
  String sex;
  Grils(String name, int age, String sex) : super(name, age) {
    this.sex = sex;
  }
  // 覆写父类中的方法,不需要添加分号
  @override
  say() {
    print('你好呀,我是子类');
  }
}
作者:流年少年
出处:https://www.cnblogs.com/ishoulgodo/

想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

支付宝
微信
本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
如果文中有什么错误,欢迎指出。以免更多的人被误导。
原文地址:https://www.cnblogs.com/ishoulgodo/p/15087254.html