前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Dart】006-类的定义和使用

【Dart】006-类的定义和使用

作者头像
訾博ZiBo
发布2025-01-06 14:50:49
发布2025-01-06 14:50:49
9600
代码可运行
举报
运行总次数:0
代码可运行

【Dart】006-类的定义和使用

在编程中, 的目的是组织 数据功能 ,起到封装的作用,提供解决某类特定问题的方案,或方案中的某一环节。

一、类的定义

1、概述

类通过 class 关键字进行定义,其后单词表示 类的名称 。名称之后,通过 {} 表示类定义的作用域,在其中定义类的 成员变量成员方法

代码语言:javascript
代码运行次数:0
运行
复制
class ${className}{
	// 类体
}

2、简单定义与实例化

代码示例
代码语言:javascript
代码运行次数:0
运行
复制
void main(List<String> arguments) {
  // 实例化对象
  Student student = Student('张三', 18);
  // 访问成员变量
  print(student.name);
  print(student.age);
  // 修改成员变量
  student.name = '李四';
  student.age = 20;
  // 再次访问成员变量
  print(student.name);
  print(student.age);
}

/// 学生类
class Student {
  /// 名字
  String name;

  /// 年龄
  int age;

  Student(this.name, this.age);
}
运行结果
代码语言:javascript
代码运行次数:0
运行
复制
张三
18
李四
20

3、成员方法

代码示例
代码语言:javascript
代码运行次数:0
运行
复制
void main(List<String> arguments) {
  // 实例化对象
  Student student = Student('张三', 18);
  // 调用成员方法,获取学生的基本信息描述
  String info = student.getStudentInfo();
  // 打印信息
  print(info);
}

/// 学生类
class Student {
  /// 名字
  String name;

  /// 年龄
  int age;

  Student(this.name, this.age);

  /// 获取学生的基本信息描述
  String getStudentInfo() {
    return '姓名:${this.name},年龄:${this.age}';
  }
}
运行结果
代码语言:javascript
代码运行次数:0
运行
复制
姓名:张三,年龄:18
箭头函数写法
代码语言:javascript
代码运行次数:0
运行
复制
/// 获取学生的基本信息描述
String getStudentInfo() => '姓名:${this.name},年龄:${this.age}';

4、get 与 set 关键字

概述

getset 关键字修饰的是 成员方法 ,其实本质上来说它们只是一种简写方式,常用于对 成员变量 的维护。它只不过是个语法糖而言,本质上仍是方法。

代码示例
代码语言:javascript
代码运行次数:0
运行
复制
void main(List<String> arguments) {
  // 实例化对象
  Student student = Student('张三', 18);
  // getName
  print(student.getName);
  // setName
  student.setName = '李四';
  print(student.getName);
  // getStudentInfo
  print(student.getStudentInfo);
}

/// 学生类
class Student {
  /// 名字
  String name;

  /// 年龄
  int age;

  Student(this.name, this.age);

  /// 获取名字的get方法
  String get getName => name;

  /// 设置名字的set方法
  set setName (String name) => this.name = name;

  /// 获取学生基本信息
  String get getStudentInfo => '姓名:$name,年龄:$age';
}
运行结果
代码语言:javascript
代码运行次数:0
运行
复制
张三
李四
姓名:李四,年龄:18

二、类的构造方法

1、特点

构造方法作为一种特殊的函数,在定义上有一些独有的特点:

  • 【1】构造方法在声明时无 返回值
  • 【2】构造方法 可以 没有方法体。
  • 【3】在参数列表中可以通过 this.成员 ,可以为成员变量进行赋值。

2、完整版的构造方法

简化版
代码语言:javascript
代码运行次数:0
运行
复制
Student(this.name, this.age);
完整版
代码语言:javascript
代码运行次数:0
运行
复制
Student(String name, int age)
    : this.name = name,
	this.age = age;

3、使用命名参数

代码语言:javascript
代码运行次数:0
运行
复制
Student(this.name, { required int thisAge }) : age = thisAge;

4、命名构造

一个类多个构造!

代码语言:javascript
代码运行次数:0
运行
复制
/// 学生类
class Student {
  /// 名字
  String name;

  /// 年龄
  int age;

  /// 默认对象
  Student.defaultObj(): name = "訾博", age = 27;

  /// 二倍年龄
  Student.doubleAge(this.name, int age): age = age * 2;
}

三、类中的不可变成员与静态成员

1、不可变成员

在前面介绍量的定义时,我们知道 final 关键字修饰的成员只能被赋值一次。如果类的一个成员变量使用 final 进行修饰,就表示这个成员不允许进行修改。

代码示例
代码语言:javascript
代码运行次数:0
运行
复制
void main(List<String> arguments) {
  // 实例化对象
  Student student = Student('张三', 18);
  student.name = "訾博";
}

/// 学生类
class Student {
  /// 名字
  final String name;

  /// 年龄
  final int age;
  
  Student(this.name, this.age);
}
报错
image-20230716160421859
image-20230716160421859

2、静态成员

静态成员由 本身直接访问,不依附于 对象

代码示例
代码语言:javascript
代码运行次数:0
运行
复制
void main(List<String> arguments) {
  print(Student.name);
}

/// 学生类
class Student {
  /// 名字
  static String name = "訾博";
}
运行结果
代码语言:javascript
代码运行次数:0
运行
复制
訾博

3、静态方法

static也可以修饰类的成员方法,称为静态方法

代码示例
代码语言:javascript
代码运行次数:0
运行
复制
void main(List<String> arguments) {
  Student.printName("訾博");
}

/// 学生类
class Student {
  /// 打印名字
  static printName(String name) => print(name);
}
运行结果
代码语言:javascript
代码运行次数:0
运行
复制
訾博

四、成员和类的可见性

在Dart中,成员和类可以具有不同的可见性,这由一些访问修饰符控制。这些修饰符确定了在代码中的哪些位置可以访问类或成员。

Dart中有四种可见性修饰符:

public:默认的可见性修饰符。如果没有显式指定修饰符,类和成员默认为公共的。公共成员可以在任何位置被访问。

private:使用下划线 _ 开头的标识符被视为私有的。私有成员只能在同一个库(文件)中被访问,无法从库的外部访问。

代码语言:javascript
代码运行次数:0
运行
复制
class MyClass {
  String _privateField;

  void _privateMethod() {
    // 私有方法的实现
  }
}

protected:在Dart中没有直接的 protected 关键字,但可以通过约定来模拟 protected 成员。使用下划线 _ 开头的标识符被视为库内部的私有成员,但可以被子类访问。

代码语言:javascript
代码运行次数:0
运行
复制
class MyBaseClass {
  String _protectedField;

  void _protectedMethod() {
    // 受保护方法的实现
  }
}

class MyDerivedClass extends MyBaseClass {
  void accessProtectedMember() {
    _protectedField = 'Value'; // 可以在子类中访问受保护字段
    _protectedMethod(); // 可以在子类中调用受保护方法
  }
}

package-private:在Dart中没有直接的 package-private 关键字,但可以通过约定来模拟。如果在定义类或成员时不使用任何可见性修饰符,它将具有包级私有性。包级私有成员只能在同一个包中被访问。

代码语言:javascript
代码运行次数:0
运行
复制
class _PackagePrivateClass {
  // 包级私有类
}

void _packagePrivateFunction() {
  // 包级私有函数
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【Dart】006-类的定义和使用
  • 一、类的定义
    • 1、概述
    • 2、简单定义与实例化
      • 代码示例
      • 运行结果
    • 3、成员方法
      • 代码示例
      • 运行结果
      • 箭头函数写法
    • 4、get 与 set 关键字
      • 概述
      • 代码示例
      • 运行结果
  • 二、类的构造方法
    • 1、特点
    • 2、完整版的构造方法
      • 简化版
      • 完整版
    • 3、使用命名参数
    • 4、命名构造
  • 三、类中的不可变成员与静态成员
    • 1、不可变成员
      • 代码示例
      • 报错
    • 2、静态成员
      • 代码示例
      • 运行结果
    • 3、静态方法
      • 代码示例
      • 运行结果
  • 四、成员和类的可见性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档