Dart语言中类和Java语言中都很类似,但是也有一些区别
1.类的定义和初始化
- 默认或生成set/get方法
- 使用final修饰的只有get方法
- 属性和方法通过
.
来房访问 - 方法不能被重载
- Dart中可见性以库为单位,默认情况下一个Dart文件就是一个库
- _用来表示私有性
class Student {
String name;
int age;
final String adress;
Student(names, age) {
this.name = names;
this.age = age;
}
void print_Info() {
print("name=$name,age=$age");
}
}
//初始化
Student student = new Student("张一博", 26);
student.name = "Tom";
student.print_Info();
2.类计算属性
void main() {
//创建对象设置属性
Yuan yuan = new Yuan();
yuan.height = 100;
yuan.width = 20;
// 设置圆面积属性
print(yuan.area);
//设置圆width属性
yuan.area = 100;
print(yuan.width);
// 获取圆周长属性
print(yuan.zhouchang)
yuan.zhouchang = 100;
print(yuan.width);
}
class Yuan {
num width;
num height;
//计算属性 area 面积 属性
num get area {
return width * height;
}
//设置属性
set area(value) {
width = value / 5;
}
//计算属性 area 周长 属性
num get zhouchang => (width + height) * 2;
//计算属性 width 属性
set zhouchang(value) => width = value / 2 - 20;
int getAre() {
return width * height;
}
}
3.类的构造方法
Dart中类的构造和Java中构造不太一样,Dart中类的构造不能重载,必须通过特定方式来创建不同的构造方法。
/**
* 构造方法创建注意
*
* 构造方法不能重载
*
*/
class Person {
String name;
int age;
final String adress;
Person(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 多个构造方法通过以下方式
*/
Person.withName(String name) {
this.name = name;
}
Person.withAge(int age) {
this.age = age;
}
Person.withInfo(String name, int age) {
this.name = name;
this.age = age;
}
/**
* final 属相通过可以通过以下构造方法赋值
*/
Person.withAllInfo(this.name, this.age, this.adress);
void printPersonInfo() {
print("name=$name,age=$age");
}
}
//对象创建
Person person=new Person.withAge(20);
Person person=new Person.withInfo("tom",20);
person.printPersonInfo();
除了普通的构造方法外还有一种工厂构造方法,工厂构造方法可以返回一个对象
/**
* 工厂构造方法,可以返回一个对象
*/
class Looger {
String name;
static Map<String, Looger> cache = new Map();
factory Looger(String name) {
if (cache.containsKey(name)) {
return cache[name];
} else {
Looger looger = new Looger._internal(name);
cache[name] = looger;
return looger;
}
}
//私有构造方法
Looger._internal(this.name);
printInfo(msg) {
print(msg);
}
}
4.类对象操作符符号
- ? 判断对象是否为空
- as 对象转换
- is 判断是否属于某个类型
- … 级联调用,类似java中的build模式
class Man {
String name;
int age;
Man(this.name, this.age);
printManInfo() {
print("name=$name,age=$age");
}
}
//对象操作符号
//? 判断对象是否为空
Man man;
man?.printManInfo();
// as 对象转换
var mans;
mans = "hello";
mans = new Man("tom", 20);
(mans as Man).printManInfo();
//is 判断是否属于某个类型
if (mans is Man) {
(mans as Man).printManInfo();
}
// .. 级联调用,类似java中的build模式
Man manss = new Man("tom", 25);
manss
..name = "zhang"
..age = 10
..printManInfo();
================================
name=tom,age=20
name=tom,age=20
name=zhang,age=10
5.类对象Call方法
编写call方法可以吧对象看作方法一样进行调用
class Man {
String name;
int age;
Man(this.name, this.age);
printManInfo() {
print("name=$name,age=$age");
}
void call(){
print("name=$name,age=$age");
}
}
Man man5=new Man("tom", 20);
man5();
===================================
name=tom,age=20