我尝试使用传递给构造函数的值初始化下面的类变量,但它不起作用。 我尝试了直接在构造函数声明方法,是正确的,但是我想知道这个方法的问题
void main() {
var humanInstance = new Human(1001, 'david', 'jemi', 'us');
humanInstance.sleep();
}
class Human {
int id;
String firstName;
String lastName;
String nationality;
Human(int id, String firstName, String lastName, String nationality){
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.nationality = nationality;
}
void sleep() {
print("$firstName is sleeping now...");
}
}
我得到了这些错误:
tempCodeRunnerFile.dart:7:7: Error: Field 'id' should be initialized because its type 'int' doesn't allow null.
int id;
^^
tempCodeRunnerFile.dart:8:10: Error: Field 'firstName' should be initialized because its type 'String' doesn't allow null.
String firstName;
^^^^^^^^^
tempCodeRunnerFile.dart:9:10: Error: Field 'lastName' should be initialized because its type 'String' doesn't allow null.
String lastName;
^^^^^^^^
tempCodeRunnerFile.dart:10:10: Error: Field 'nationality' should be initialized because its type 'String' doesn't allow null.
String nationality;
^^^^^^^^^^^
为了让你的程序工作,你必须声明变量
late
:
void main() {
var humanInstance = Human(1001, 'david', 'jemi', 'us');
humanInstance.sleep();
}
class Human {
late int id;
late String firstName;
late String lastName;
late String nationality;
Human(int id, String firstName, String lastName, String nationality){
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.nationality = nationality;
}
void sleep() {
print("$firstName is sleeping now...");
}
}
在 Dart 中,如果实例变量没有显式初始化,则实例变量会隐式初始化为 null,但这种初始化仅适用于可为 null 的变量。但是,在 Human 类中,您声明了不可为 null 的变量 id、firstName、lastName 和国籍,它们不能为 null。因此,Dart 要求您在使用它们之前显式初始化它们。 Dart 提供了直接在构造函数参数中初始化实例变量的快捷方式。
class Human {
int id;
String firstName;
String lastName;
String nationality;
// Constructor with instance variable initialization shortcut
Human(this.id, this.firstName, this.lastName, this.nationality);
void sleep() {
// Using instance variables
print("$firstName is sleeping now...");
}
}
在 Dart 中,如果某个字段有一个合理的默认值并且对于所有实例都相同,则可以在声明实例变量时直接使用该默认值。这样,您不需要在构造函数中显式初始化它。让我们将其应用到您的 Human 类中:
void main() {
var humanInstance = Human(1001, 'david', 'jemi', 'us');
humanInstance.sleep();
}
class Human {
int id;
String firstName;
String lastName;
String nationality;
// Constructor
Human(this.id, this.firstName, this.lastName, [this.nationality = 'unknown']);
void sleep() {
print("$firstName is sleeping now...");
}
}
还有另一个解决方案,您可以为字段设置默认值:
class Human {
int id = 0;
String firstName ='';
String lastName = '';
String nationality = '';
// Constructor
Human(int id, String firstName, String lastName, String nationality) {
// Initializing instance variables within the constructor
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.nationality = nationality;
}
void sleep() {
// Using instance variables
print("$firstName is sleeping now...");
}
}