Dart 面向对象 上(二)
2020-02-12 本文已影响0人
向日花开
Dart 也是面向对象的语言,同样有着封装、继承、多态的特性。
类
类的定义
同 Java 一样使用 class 关键字申明一个类,final 修饰的属性,不能被外部重新赋值,只可读,不可写。
//类的定义, class 作为关键字声明
class Person {
//共有变量
String name;
//私有变量
int _age;
//final修饰的属性,不能被外部重新赋值,只可读,不可写
final String phone = '12345678901';
//类方法
String show() {
String msg = "name:${this.name}\tage:${this._age}\tphone:${this.phone}";
print(msg);
return msg;
}
}
类的权限
Dart 类中默认的权限都是公开的,在变量或者方法名前面加下划线"_”的前缀即为私有变量或方法。
//私有变量
int _age;
//私有方法
void _info(){
String msg = "name:${this.name}\tage:${this._age}\tphone:${this.phone}";
print(msg);
}
类的实例化
Java 中类的实例化需要用到 new 关键字,dart 实例化也一样,或者直接省略 new 关键字,获得对象 。
Person person = new Person();
Person person1 = Person();
person.name = "person";
person1.name = "person1";
person.show();
person1.show();
Getter 和 Setter 方法
对于类的私有变量,我们不可以直接访问,赋值。我们可以通过 get 和 set 方法来获取和赋值。
//getter setter 方法
//get 获取age
int get age => _age;
//set 设置age
set age(int value) {
_age = value;
}
构造方法
常见的有参无参构造方法
//动物类定义
class Animal {
String name;
int age;
//1.默认的无参构造函数
//Animal() {}
//2.Dart语法糖有参构造方法,因为Dart 不能重载,所以默认的注释
Animal(this.name,this.age);
//类方法
void show() {
String msg = "name:${this.name}\tage:${this.age}";
print(msg);
}
}
void main(){
Animal animal1 = new Animal();
animal1.name = "猫咪";
animal1.age = 1;
animal1.show();
Animal animal2 =new Animal("Dog", 2);
animal2.show();
}
命名构造方法
定义: 类名.方法名(),和一些自己需要赋值的参数。
作用:可以灵活的根据需要定义多个自己需要的构造函数。
//3.命名构造方法
Animal.withNew(String name,int age){
this.name=name;
this.age=age;
}
Animal animal3 = Animal.withNew("猪", 1);
animal3.show();
常量构造方法
当类的属性设置一次之后,就不会再设置了,那么这个类就可以声明为常量类,常量类的属性使用 final 修饰,而构造方法使用 const 修饰。
//4.常量构造方法
//如果需要将对象作为常量,就需要将构造方法声明为常量构造方法
//使用常量构造方法的对象,属性和构造方法都为常量,属性使用final修饰,构造方法使用const修饰
//常量型对象运行时更快,如果对象的值设置一次后就不会改变,可以使用这种方式
class Animal1 {
final String name;
final int age;
const Animal1(this.name, this.age);
//类方法
void show() {
String msg = "name:${this.name}\tage:${this.age}";
print(msg);
}
}
const animal4 = Animal1("驴", 10);
animal4.show();
工厂构造方法
///5.工厂构造方法演示
class Logger {
static Logger _cache;
// 工厂构造方法:
// 不仅仅是构造方法,更是一种模式
// 有时候为了返回一个之前已经创建的缓存对象,原始的构造方法已经不能满足要求
// 那么可以使用工厂模式来定义构造方法
factory Logger() {
if (_cache == null) {
_cache = Logger._internal();
}
return _cache;
}
Logger._internal();
void log(String msg) {
print(msg);
}
}
参数列表构造方法
初始化列表的格式,在构造方法名后加 :属性=值,不同的变量用逗号分隔。
// 6.参数列表构造方法
class Animal2 {
String name;
int age;
final String id;
//
Animal2(String name, this.age)
: name = name,
id = "12";
}
静态成员
- 静态方法,只能访问静态成员。
- 实例方法,既能访问静态成员,也可以访问实例成员
对象操作符
安全对象操作符(?)
判断一个对象为空不用在写 if 判断,直接如下:
Person person;
//?.对象操作符,在对象为null时,不会进行调用
person?.show();
as 操作符
将对象强制转为某一类型,如果类型强转出错则会抛出异常。
//没有推断出Person,类型为dynamic
var person2;
//因为类型为dynamic,可以赋值任意类型
person2 = "";
//as操作符,强转类型,这里是String类型,强转为Person类型会抛出异常。
(person2 as Person).show();
is 操作符
判断对象是否为某个类型的实例。是返回 true,不是则返回 false,dart 通过 is 判断后不需用 as 转型即可使用。
if (person2 is Person) {
print('object is Person');
}
if (person2 is Person) {
//经过了is操作符判断,就不用as操作符再转换再操作
person2.show();
}
..级联操作符
对象后面.. ,即可实现对象的链式调用。
//级联操作符,每次操作后都返回自身,方便链式调用
var person3 = new Person();
person3
..name = 'hello'
..age = 20
..show();
最后
贴一张自己学习Flutter的公众号,感兴趣的小伙伴可以一起学习哦。。。