所谓一步一个脚印,以前学习东西总是模棱两可,这次解决了下次可能再遇到类似的问题总是会出现一些问题 现在开始就要学会追根究底,现在总不能看表面
注意点:看了些资料关于构造函数自己也总结了一下:
1.子类的构造函数必须调用父类构造函数,子类的默认构造函数调用父类的默认构造函数 ,子类的命名构造函数有两种调用方式,一种是默认调用父类的未命名无参数构造函数,另一种是指定调用父类的构造函数
2.子类不可以继成父类的构造函数
3.若父类只有命名构造函数,那么子类必须指定父类命名构造函数,因为父类没有实现默认构造函数,子类如果没有指定调用父类构造函数,子类会默认调用父类的默认构造函数,而父类没有实现 就会报错!!!
在使用继承类最好先实现默认构造函数,这样子类不会出现莫名的错误
以下是构造函数的种类:
1.默认构造函数(未命名无参数的构造函数),子类没有实现构造函数,则会自动生成一个默认构造函数,并且会默认调用父类的默认构造函数
2.命名构造函数,
A.xxx(){},关于调用父类的构造函数,这里是默认调用父类的默认构造函数
A.xxx():super(type typename){}这里是指定调用父类的构造函数
3.重定向构造函数 A.xxx():this(type typename){}
4.常量构造函数:如果你的类需要成为永远不会更改的对象,则可以使这些对象成为编译时常量。 定义const构造函数要确保该类的所有实例变量都是final。父类中有常量构造函数,则子类可不含有常量构造函数
5.工厂构造函数
在实现不用总是创建新的类对象的时候,可以使用factory关键字。 例如,工厂构造函数可能从缓存中返回实例,或者它可能返回子类型的实例:
class Logger {
final String name;
bool mute = false;
//工厂构造函数无法访问this,所以这里要用static
//维护一个缓存的Map对象,
static final Map<String, Logger> _cache =
<String, Logger>{};
//调用该构造函数的时候,会从Map中取出对象
factory Logger(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final logger = Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
Logger._internal(this.name);
void log(String msg) {
if (!mute) print(msg);
}
}
//调用
var logger = Logger('UI');
logger.log('Button clicked');