Dart学习笔记-面向对象编程

Posted 追到梦的魔术师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart学习笔记-面向对象编程相关的知识,希望对你有一定的参考价值。

一、类与对象,声明、创建及基本特征

1、声明与创建

  • 类与对象
  • 使用关键字class声明类
  • 使用关键字new创建对象,new可省了
var person = Person();

2、Dart 类的特性

  • 属性默认生成getter和setter方法
  • 使用final声明的属性只有getter方法
  • 属性和方法通过.访问
  • 方法不能被重载
class Person
  String name;
  int age;
  void work()
    print("Name is $name,Age is $age,He is working...");
  

  var person = Person();
  person.age = 12;
  person.name = "tom";
  print(person.age);
  person.work();

3、计算属性

  • 顾名思义,计算属性的值是通过计算而来,本身并不存储值
  • 计算属性的赋值,其实是通过计算转换到其他的实例变量
class Rectangle
  num width,height;
  num get area => width * height;

  var rect = Rectangle();
  rect.height = 20;
  rect.width = 10;
  
  print(rect.area);//200

二、构造方法及初始化列表

1、构造方法

  • 如果没有自定义构造方法,则会有个默认构造方法
  • 如果存在自定义构造方法,则默认构造方法无效
  • 构造方法不能重载
class Boy
  String name;
  int age;
  Boy(String name, int age)
    this.name = name;
    this.age = age;
    print("Name is $name,Age is $age");
  
  void work()
    print("Name is $name,Age is $age,He is working...");
  

若存在final属性:

class Boy
  String name;
  int age;
  inal String gender;
  Boy(String name, int age,this.gender)
    this.name = name;
    this.age = age;
    print("Name is $name,Age is $age");
  
  void work()
    print("Name is $name,Age is $age,He is working...");
  

此时属性赋值在构造函数之前执行

构造方法语法糖:

Boy(this.name,this.age,this.gender);

同理属性赋值在构造函数之前执行

命名构造方法:
由于构造方法无法重载,要想给部分属性赋值时,可以采用赋值构造方法

class Boy
  String name;
  int age;
  inal String gender;
  Boy(String name, int age,this.gender)
    this.name = name;
    this.age = age;
    print("Name is $name,Age is $age");
  
  Boy.withGender(this.gender);
  void work()
    print("Name is $name,Age is $age,He is working...");
  

  var boy = Boy.withGender("男");
  boy.work();

常量构造方法:

  • 如果类是不可变状态,可以把对象定义为编译时常量
  • 使用const声明构造方法,并且所有变量都为final
  • 使用const声明对象,可以省略
class Dog
  final String name;
  final int age;
  const Dog(this.name,this.age);

工厂构造方法:

  • 工厂构造方法类似于设计模式中的工厂模式
  • 在构造方法钱添加关键字factory实现一个工厂构造方法
  • 在工厂构造方法中可返回对象
class Factory
  String message;
  factory Factory(String message)
    //message为dart时,实例化,否则返回空
    if(message == "dart")
      return Factory.internal(message);
    else
      return null;
    
  
  Factory.internal(this.message);
 
  var factory = Factory("Java");
  print(factory == null);//true

2、初始化列表

用于解决构造方法传入集合时,final变量的赋值问题

  • 初始化列表会在构造方法体执行之前执行
  • 使用逗号分隔初始化表达式
  • 初始化列表常用于设置final变量的值
class Girle
  String name;
  int age;
  final String gender;
  
  Girle.withMap(Map map) : gender = map["gender"]
    this.name = map["name"];
    this.age = map["age"]; 
  
  
  void work()
    print("Name is $name,Age is $age,Gender is $gender,She is working...");
  

  var map = "name":"tom","age":12,"gender":"女";
  var girle = Girle.withMap(map);
  girle.work();

三、静态成员及对象操作符的使用

1、静态成员

  • 使用static关键字来实现类级别的变量和函数
  • 静态成员不能方位非静态成员,非静态成员可以访问静态成员
  • 类中的常量需要使用static const声明
class Page
  static const int maxPage = 10;
  static int currentPage = 1;
  
  static void up()
    currentPage++;
    print("currentPage = $currentPage");
  
  
  static void down()
    currentPage--;
    print("currentPage = $currentPage");
  

Page.up();//currentPage = 2
Page.down();//currentPage = 1

2、对象操作符

条件成员访问:?.
相当于在执行之前进行判空操作,如果为null则不再执行

  var person;
  person?.age = 12;

此时如果不适用?.则会crash

类型转换:as

  person = "";
  person = Person();
  (person as Person).age = 12;

是否指定类型:"is & is! "用于判断对象的class

  if(person is Person)
    person.age = 12;
  

级联操作

  person..name = "小李"
        ..age = 26
        ..work();

四、对象call方法

如果类实现了call()方法,则该类的对象化可以作为方法使用

class Animal
  String call(name,age)=>"Name is $name, age is $age";

var animal = Animal();
print(animal("小猫",1));//Name is 小猫, age is 1

以上是关于Dart学习笔记-面向对象编程的主要内容,如果未能解决你的问题,请参考以下文章

Flutter学习-dart:dart类和对象

Java基础知识学习笔记

Java学习笔记1-面向对象特性

Java编程思想 学习笔记8

5.1-全栈Java笔记:面向对象的特征继承 | 上

面向对象编程基本部分——java三大特性详解