我的密码
class Book {
String title;
String author;
int numOfPages;
Book(String title, String author, int pages) {
this.title = title;
this.author = author;
this.numOfPages = pages;
}
}
void main() {
Book bk = Book("Modern Operating Systems", "S.Tannabeaum", 1250);
print(bk.title);
}嘿,我是个飞镖和编程新手。实际上,我想要创建一个类,它的构造函数和其中的三个实例。当我想从这个类中创建一个对象时,我发现了这个错误!
发布于 2021-06-27 17:00:02
代码中有两个问题。首先,Dart中的构造函数有两个“阶段”,首先初始化对象,然后运行构造函数体,然后将对象返回给构造函数的调用方。
这意味着您首先要创建一个Book对象,而不需要设置这三个变量。是的,您稍后将在构造函数体中设置这些变量,但此时为时已晚。
下一个问题是,如果您没有在Dart中设置变量的值,那么它总是默认为null值。对于Dart 2.12,默认情况下我们得到了非空类型(NNBD),这意味着Dart中的所有类型都不允许值null,除非指定。您可以通过在类型名称之后键入一个null值来指定该?值的有效性。例如,String?允许变量指向String对象或null。
在本例中,我们不需要指定可空类型,因为问题主要是需要将变量的初始化从构造函数体移到对象的初始化阶段,如下所示:
class Book {
String title;
String author;
int numOfPages;
Book(String title, String author, int pages)
: this.title = title,
this.author = author,
this.numOfPages = pages;
}同样的内容可以重写如下,这也是建议的方法:
class Book {
String title;
String author;
int numOfPages;
Book(this.title, this.author, this.numOfPages);
}因为我们在这里直接指的是每个字段,所以我们想要给出一个值。然后,Dart将使用构造函数中的参数自动分配值。
如果构造函数使用了很多参数,那么使用命名参数可能更容易读懂。这里的required关键字意味着我们提供了一个给定的命名参数。如果未指定,则命名参数是可选的(这意味着我们大多数提供默认值或允许null使参数有效):
class Book {
String title;
String author;
int numOfPages;
Book({
required this.title,
required this.author,
required this.numOfPages,
});
}
void main() {
final book = Book(
title: "Modern Operating Systems",
author: "S.Tannabeaum",
numOfPages: 1250,
);
print(book.title); // Modern Operating Systems
}https://stackoverflow.com/questions/68152851
复制相似问题