1.类的引入
什么是类?
类是一种蓝图,或者说是一种模板,可能这样说大家会有点懵,接下来我举几个例子:
狗是一种类,人是一种类,汽车也是一种类
还有一个概念,叫做对象(实例),结合对象,可能会帮你更好的了解类与对象是什么意思
拿刚刚说的狗举例,狗是一种类,而小狗就是一种实例对象,黄色的狗也是实例对象
不知道你是否发现了,这个类与对象的关系,可以类比于函数里面形参与实参的关系
形参是一种模板,类也是一种模板
实参是传入的实际参数,对象则是根据类创建出来的具体实例
那么为什么需要类?
因为如果没有类,如果有大量的方法,或者有大量的数据,
那么这些数据和方法就会混在一起,不方便管理,所以需要类来管理这些数据和方法。
那么接下来,正式进入dart中类的学习。
2.类(class)
//定义一个简单的类:
class Dog{
}
这里定义了一个最为简单的类,也是类的基本结构,开头使用class,然后名称一般使用驼峰命名法,后面接上一个大括号。
2.1 添加属性
目前看来,这个类是空的,接下来我们可以往其中添加一些属性:
class Dog{
String name = "大黄"; //狗的名字
String breed = "土狗"; //狗的品种
int age = 3; //狗的年龄
}
现在,看的出来这个狗有了三个初始属性,那么接下来,我们就可以添加方法(函数)啦
2.2 添加方法(函数)
方法是类中定义的函数,它们描述了对象的行为。
class Dog{
String name = "大黄"; //狗的名字
String breed = "土狗"; //狗的品种
int age = 3; //狗的年龄
//方法
void bark(){
print("小狗$name在叫");
}
void eat(String food){
print("小狗$name在吃$food");
}
void info(){
print("小狗的名字是$name,小狗的品种是$breed,小狗的年龄是$age");
}
}
这里我们添加了三个方法:bark,eat,info,后续都可以通过对对象的调用使用这些方法。这里值得注意的是,方法的内部可以直接调用类的属性。如bark中调用了Dog的属性name。
2.3 创建和使用对象
创建对象的过程叫做实例化。如何创建对象?如下:
class Dog{
String name = "大黄"; //狗的名字
String breed = "土狗"; //狗的品种
int age = 3; //狗的年龄
//方法
void bark(){
print("小狗$name在叫");
}
void eat(String food){
print("小狗$name在吃$food");
}
void info(){
print("小狗的名字是$name,小狗的品种是$breed,小狗的年龄是$age");
}
}
void main(){
Dog dog1 = Dog();
Dog dog2 = Dog();
print(dog1.name); //大黄
print(dog2.name); //大黄
print(dog2.age); //3
print(dog2.age); //3
}
在main方法中,dog1和dog2就是对象,他们都有着一样的方法(bark,eat,info)和一样的类给的属性(name,breed,age),通过打印的结果也可以看出。
2.4 修改属性与调用方法
class Dog{
String name = "大黄"; //狗的名字
String breed = "土狗"; //狗的品种
int age = 3; //狗的年龄
//方法
void bark(){
print("小狗$name在叫");
}
void eat(String food){
print("小狗$name在吃$food");
}
void info(){
print("小狗的名字是$name,小狗的品种是$breed,小狗的年龄是$age");
}
}
void main(){
Dog dog1 = Dog();
Dog dog2 = Dog();
dog1.name = "小紫";
dog1.age = 4;
dog1.breed = "未知品种1";
print(dog1.name); //小紫
print(dog2.name); //大黄
dog2.bark();
dog2.eat("骨头");
}
如果想要修改对象的属性,可以直接进行修改,这里可以看出,对dog1的属性修改之后,打印出来的结果是修改之后的属性,当然,由于修改的是对象的属性,所以不会对另外一个对象的属性产生影响。
如果想要调用方法,参考dog2,可以看见调用方法也是很简单,注意格式以及是否需要传参即可。
2.5 构造函数初步
目前,我们在创建 Dog 对象时,它的属性都已经被我们在类定义里写死。如果我们想在创建对象的时候就指定它的属性值,该怎么办呢?这时候就需要构造函数。
构造函数是一个特殊的方法,它的名字必须和类名完全一样。它在创建对象时自动被调用,通常用来初始化对象的属性。
class Car {
String ? brand; // 品牌
String ? color; // 颜色
int ? speed; // 速度
// 构造函数,用于初始化对象的属性
Car(String b, String c, int d){
this.brand = b;
this.color = c;
this.speed = d;
print("一个$brand的$color的汽车被制造出来了,最高速度可达$speed");
}
void start(){
print("$color的$brand汽车正在启动");
}
}
void main(){
Car car1 = Car("宝马","红色",200);
car1.start();
}
这里要注意的是,由于最新版的dart有空安全,非空类型的属性必须初始化。所以要么让属性非空,要么将属性标记为可空,这里的操作就是标记为可空。这里需要介绍下this关键字。
this 关键字: 在构造函数或方法内部,this 关键字指向当前对象实例。当参数名和属性名相同时,用 this.属性名 可以明确指定是类的实例属性。
那么在这里,很明显的,这里就是指向类的实例属性。对于这类情况,其实还有一种写法,更为的简便,如下:
class Car {
String ? brand; // 品牌
String ? color; // 颜色
int ? speed; // 速度
// 构造函数,用于初始化对象的属性
Car(this.brand, this.color, this.speed){ //<----变化处
print("一个$brand的$color的汽车被制造出来了,最高速度可达$speed");
}
void start(){
print("$color的$brand汽车正在启动");
}
}
void main(){
Car car1 = Car("宝马","红色",200);
car1.start();
}
可以看见,我们可以直接将this写进去,这样减少了代码行数,在一定程度上降低了编写代码的负担程度
那么今天就先到这里啦,祝大家天天开心!代码一遍就通!没有debug的烦恼!