類與對象
(1)使用關鍵字class聲明一個類
(2)使用關鍵字new 建立一個對象,new 可以省略
(3)所有對象預設繼承Object類
屬性與方法
屬性預設會生成getter/ setter 方法
使用final聲明的屬性隻有getter方法
屬性和方法通過.通路
方法不能被重載
void main(){
//兩種建立方式
var person=new Person();
var person2=Person();
//預設set|get ,屬性和方法通過.通路
person.name="小紅";
person.age=10;
person.say("Hello Flutter");
//fnal 聲明的屬性隻有getter 方法
// person.gender="";
print(person.name);
}
class Person {
String name;
int age;
final String gender="female";
void say(String str){
print(str);
}
//方法不能被重載
// void say(int data){
// print(data);
// }
}
類及成員可見性
Dart中可見性以library為機關
預設情況下,每一個Dart檔案就是一個庫
使用_表示庫的私有性
使用import導入一個庫
計算屬性
構造方法
如果沒有自定義的構造方法就會有一個預設的構造方法
如果存在自定義構造方法,則預設構造方法無效
構造方法不能重載
命名構造方法
使用命名構造方法,可以實作多個構造方法
使用類名.方法的形式實作
void main() {
var dog=Dog("小狗",2,"2kg");
var dog2=Dog.withName("小狗2","3kg");
var dog3=Dog.withAge(3,"2kg");
print(dog3.age);
}
class Dog {
String name;
int age;
final String weight;
// Dog(String name,int age,String weight){
// this.name=name;
// this.age=age;
// this.weight=weight;
// }
Dog(this.name,this.age,this.weight);//這種方式是在構造方法被調用前對屬性指派
//命名構造方法
Dog.withName(String name,this.weight){
this.name=name;
}
Dog.withAge(this.age ,this.weight);
}
常量構造方法
如果類是不可變狀态,可以把對象定義為編譯時常量
使用const 聲明構造方法,并且所有變量都變為final
使用const聲明對象,可以省略
void main() {
//常量構造方法
const cat=const Cat("貓");
}
//常量構造方法
class Cat{
final String name;
const Cat(this.name);
}
工廠構造方法
工廠構造方法類似于設計模式中的工廠模式
在構造方法前添加關鍵字factory 實作一個工廠構造方法
在工廠構造方法中可傳回對象
初始化清單
(1)初始化清單會在構造方法體執行之前執行,常用于設定final變量的值
(2)使用逗号分隔初始化表達式
//使用import導入一個庫
import 'package:flutter_app/dart/fruit.dart';
void main() {
var person=Person("male");
var person2=Person.withParameters("小明",8,"male");
print(person.gender);
print(person2.age);
}
class Person {
String name;
int age;
final String gender;
Person(String gender) : gender = gender;
Person.withParameters(String name, int age, String gender)
: name = name,
age = age,
gender = gender;
}
靜态成員
(1)使用static 關鍵字來實作類級别的變量和函數
(2)靜态成員不能通路非靜态成員,非靜态成員可以通路靜态成員
(3)類中的常量需要使用 static const 聲明
void main() {
LogUtil.e();
}
class LogUtil {
//類中的常量需要使用 static const 聲明
static const String defalut_msg="defalut_msg";
static String msg = "error";
//靜态成員不能通路非靜态成員
static void e() {
print(msg);
}
//非靜态成員可以通路靜态成員
void i() {
print(msg);
}
}
對象操作符
void main() {
Person person;
//條件操作符:對象為空的時候不會調用後面的方法(work)
person?.work();
//類型轉換
var person2;
person2 = new Person();
(person2 as Person).work();
//是否是指定類型
var person3;
if (person3 is! Person) {
print("person3不是Person類型");
}
person3 = new Person();
if (person3 is Person) {
print("person3是Person類型");
}
//級聯操作
var person4 = new Person();
person4
..name = "小明"
..age = 8
..work();
}
class Person {
String name;
int age;
void work() {
print("Work……");
}
}
對象Call方法
void main() {
var person = new Person();
person
..name = "小明"
..age = 8;
//可以被當作方法調用
// person();
//可以當作方法,傳遞參數與傳回參數
print(person("小明", 8));
}
class Person {
String name;
int age;
// void call() {
// print("name $name, age $age");
// }
String call(String name, int age) {
print("name $name, age $age");
return name;
}
}