当前位置:网站首页>Dart学习——函数、类
Dart学习——函数、类
2022-06-28 04:56:00 【七冬与小糖】
Dart
实现打印HelloWorld
main(){
print('HelloWrold');
}
在命令行输入dart 文件名.dart即可运行dart文件
- dart的入口是main函数
- 在dart中打印内容使用print
以上是简化版的main函数
完整版的main函数
函数的返回值类型 函数的名称(参数列表){
函数体
}
void main(List<String> args){
print('Hello Flutter');
print(args);
}
在命令行输入dart 文件名.dart 参数即可将参数传入main函数
Dart中变量的声明
Dart通过var / const / final / dynamic 定义变量
- 明确的声明(指定类型)
通过runtimeType属性获取数据类型
// Dart是强类型的语言;变量有自己的类型
void main(List<String> args) {
String name = 'Mike';
int age = 18;
double height = 1.88;
print("$name $age $height");
//打印数据的类型
print(name.runtimeType);
//Mike 18 1.88
//String
}
- 类型推导
void main(List<String> args) {
var name = 'Mike';
const message = 'HelloFlutter';//const定义常量,必须在定义时赋值
final message //final定义常量,可以在运行时赋值
//打印数据的类型
print(name.runtimeType);
//如果想修改数据类型,使用dynamic(动态的)
//String
}
Dart数据类型
1 数字类型 int double
//1、整数类型int
int age = 18;
int hetAge = 0x12;
字符串和数字之间的转化
//字符串 -> 数字
var one = int.parse('111');
var two = double.pare('12.22');
//数字 -> 字符串
var num1 = 11;
var num2 = 12.333;
var num1Str = num1.toString();
var num2Str = num2.toString();
var num2StrD = num2.toStringAsFixed(2);//保留两位小数
2、布尔类型Boolen
注意:Dart中不能判断非0即真,或者非空即真
即不能使用if(非布尔类型)之类的代码
//错误
if(message){
}
3 字符串类型
字符串定义方式。单、双、三引号都可以
void main(List<String> args) {
var message1 = 'hello';
var message2 = "hello";
var message3 = '"
hello
"';//三引号可以换行
}
字符串的拼接
final name = 'why';
final age = 18;
print("name:$name age:$age")
4 集合类型
Dart内置了三种集合类型:List / Set / Map
其中,List可以这样来定义:
void main(List<String> args){
var letters = ['a','b','c','d'];
// List<String> names = ["a","b"];
print('$letters ${letters.runtimeType}')
}
//[a, b, c, d] List<String>
其中,set可以这样定义:
其实就是把[ ]换成{ }就好了。
- Set和List 最大的两个不同就是:Set是无序的,并且元素是不重复的
void main(List<String> args){
Set<int> nums = {
101,111,121,101};
print('$nums ${nums.runtimeType}');
}
//{101, 111, 121} _CompactLinkedHashSet<int>
Set用处之一就是去重
void main(List<String> args){
List<int> nums = [101,111,121,101];
List<int> nums1 = List.from(Set.from(nums));
print('$nums1 ${nums1.runtimeType}');
//[101, 111, 121] List<int>
}
函数的参数
由上面可知函数的定义方式为
返回值类型 函数名称(参数列表){
执行代码
}
Dart中函数的参数分为两种,必传参数、可选参数
必传参数
void printInfo(String name){
print(name);
}
其中 name为必传参数,如果少传参数,就会报错。
可选参数
可选参数分为两种:可选位置参数、可选命名参数
位置可选参数
用[ ]将参数包括起来
int sum(int num1, int num2, [dynamic num3]){
print(num3);
return num1 + num2;
}
以上num3就是可选位置参数
命名可选参数
用{ }将参数包括起来
int sum(int num1, int num2, {
dynamic num3}){
print(num3);
return num1 + num2;
}
sum(num3: 50 , 10 ,20)
函数第一公民
函数可以做参数传给一个函数:
void foo(){
print('name');
}
void fun(Function func){
func();
}
void main(List<String> args) {
fun(foo);
}
//name
函数也可以做为函数的返回值:
void foo(){
print('name');
}
Function fun(Function func){
return func;
}
void main(List<String> args) {
Function bar = fun(foo);
bar();
}
//name
运算符
void main(List<String> args) {
int num = 3;
print(num / 2);//除法运算 1.5
print(num ~/2);//整除运算 1
}
??= 赋值运算
当被赋值的数值已经有值时,采用原来的值,否则赋值新的值。类似 ||
void main(List<String> args) {
var num = 3;
num ??= 4;
print(num); //3
}
void main(List<String> args) {
var num = null;
num ??= 4;
print(num); //4
}
条件运算符
??前面的有值,则赋值前面的值,否则赋值后面的值
void main(List<String> args) {
dynamic num = 'haha';
dynamic message = 'xixi';
num = message ?? 'hehe';
print(num); // xixi
}
类
//定义类
class Person{
String? name;
int? age;
void getname(){
print("它的名字是$name");
}
}
void main(List<String> args) {
final p = Person();
p.name = 'haha';
print(p.name);
}
构造函数
每一个类之中都有一个默认的无参构造函数,希望在创建实例的同时,将属性传入类中,就需要自定义一个构造函数
class Person{
String? name;
int? age;
Person(String name , int age){
this.name = name;
this.age = age;
}
void getname(){
print("它的名字是$name");
}
}
void main(List<String> args) {
final p =Person('张三',18);
print(p.name);
}
语法糖的写法:
class Person{
String? name;
int? age;
Person(this.name,this.age);
void getname(){
print("它的名字是$name");
}
}
void main(List<String> args) {
final p =Person('张三',18);
print(p.name);
}
如果想通过Map进行实例创建:可以通过 \
Person.formMap(Map<String,dynamic> map){
this.name = map['name'];
this.age = map[age];
}
class Person{
String? name;
int? age;
Person(this.name,this.age);
Person.formMap(Map<String,dynamic> map){
this.name = map['name'];
this.age = map[age];
}
void getname(){
print("它的名字是$name");
}
}
void main(List<String> args) {
final p = Person('张三',18);
print(p.name);
Map<String,dynamic> p1 = {
'name':'李四',
'age': 18
};
final p2 = Person.formMap(p1);
print('${p2.name}');
}
类的继承
Dart中使用extend关键字,子类中使用super来访问父类。
class Animal{
int? age;
Animal(this.age);
void eating(){
print('再吃东西');
}
}
class Person extends Animal{
String? name;
Person(this.name,int age):super(age);
}
void main(List<String> args) {
final p = Person('张三',18);
p.eating();
}
抽象类
继承是多态使用的前提。
但是,父类本身可能并不需要对某些方法具体的实现,所以父类中定义的方法,我们可以定义为抽象方法。
什么是抽象方法?在Dart中没有具体实现的方法,就是抽象方法
- 抽象方法,必须存在与抽象类中
- 抽象类是使用abstract声明的类
下面对的代码中,Shape类就是一个抽象类,其中包含一个抽象方法。
//抽象类
abstract class Shape{
getArea();//抽象方法
}
class Circular extends Shape{
dynamic r;
Circular(this.r);
@override
double getArea(){
return r * r * 3.14;
}
}
class rectangle extends Shape{
dynamic width;
dynamic height;
rectangle(this.width,this.height);
@override
dynamic getArea(){
return width * height;
}
}
void calcuAra(Shape s){
print(s.getArea());
}
void main(List<String> args) {
Circular c = Circular(5);
calcuAra(c);
rectangle r = rectangle(30, 20);
calcuAra(r);
}
mixin
mixin Running{
void running(){
print('奔跑');
}
}
mixin Swimer{
void swimming(){
print('游泳');
}
}
class Person with Running,Swimer{
}
void main(List<String> args) {
Person p = Person();
p.swimming();
}
泛型
泛型:就是一种不确定的数据类型。
比如:List<E>E就是泛型。 这种不确定的数据类型需要在使用这个类的时候才能够确定出来。
泛型可以省略,如果省略,默认泛型是Object类型。
泛型的好处:
- 省略了强转的代码。
- 可以把运行时的问题提前到编译时期。
List使用时的泛型写法:
//创建List的方式
var names1 = ['why','kobe','james'];
print(names1.runtimeType);//List<Object>
//限制类型
var names2 = <String>['why','kobe','james',111];//最后一个报错
List<String> names3 = ['why','kobe','james',111];//最后一个报错
Map使用时的泛型写法:
Map<String,dynamic> info2 = {
'name':'张三','age':18};
var info3 = <String,dynamic>{
'name':'张三','age':18};
Location类的定义:泛型方式
class Location<T>{
T x;
T y;
}
边栏推荐
- 基于订单流工具,我们能看到什么?
- Notepad++ -- column editing mode -- Usage / instance
- On the necessity of building a video surveillance convergence platform and its scenario application
- Severe tire damage: the first rock band in the world to broadcast live on the Internet
- 2022年G3锅炉水处理复训题库模拟考试平台操作
- Generate QR code in wechat applet
- 学习太极创客 — MQTT 第二章(五)心跳机制
- TACo:一种关于文字识别的数据增强技术
- 如何学习可编程逻辑控制器(PLC)?
- 羧酸研究:Lumiprobe 磺基花青7二羧酸
猜你喜欢

活性染料研究:Lumiprobe AF594 NHS 酯,5-异构体

Generate QR code in wechat applet

羧酸研究:Lumiprobe 磺基花青7二羧酸

Extjs图书管理系统源码 智能化图书管理系统源码

氨基染料研究:Lumiprobe FAM 胺,6-异构体

玩转双指针
![[applet] solution document using font awesome Font Icon (picture and text)](/img/1b/d1b738e6e35e59cc4a417df4ea0e8d.png)
[applet] solution document using font awesome Font Icon (picture and text)

学习太极创客 — MQTT 第二章(四)ESP8266 保留消息应用

Necessary skills for test and development: actual combat of security test vulnerability shooting range

Oracledata installation problems
随机推荐
Learn Taiji Maker - mqtt Chapter 2 (IV) esp8266 reserved message application
大促场景下,如何做好网关高可用防护
如何学习可编程逻辑控制器(PLC)?
RxSwift --(1)创建一个项目
Learning Tai Chi Maker - mqtt Chapter II (VI) mqtt wills
代码理解:IMPROVING CONVOLUTIONAL MODELS FOR HANDWRITTEN TEXT RECOGNITION
Severe tire damage: the first rock band in the world to broadcast live on the Internet
Code understanding: implementing volume models for hangwriten text recognition
BioVendor sRAGE蛋白解决方案
CUPTI error: CUPTI could not be loaded or symbol could not be found.
论文详读:IMPROVING CONVOLUTIONAL MODELS FOR HANDWRITTEN TEXT RECOGNITION
2022烟花爆竹经营单位安全管理人员特种作业证考试题库及模拟考试
On the necessity of building a video surveillance convergence platform and its scenario application
?位置怎么写才能输出true
吴恩达深度学习测验题:deeplearning.ai-week1-quiz
学习太极创客 — MQTT 第二章(六)MQTT 遗嘱
Analysis of distributed transaction TCC
2022年材料员-通用基础(材料员)操作证考试题库及答案
Idle interrupt cannot be cleared
整理网上蛋糕商城项目