一.類的組成部分及調用方式
class Person{
//聲明變量類型
String name;
int age;
String sex;
//默認構造函數(shù)最初寫法
Person (String name,int age,String sex){
print("默認構造函數(shù)函數(shù)體里的打印");
}
//默認構造函數(shù)簡寫誓篱,可以使用this(和上面構造函數(shù)二選一抡爹,推薦簡寫)
Person({this.name,this.age,this.sex});
//命名構造函數(shù)
Person.now(){
print('命名構造函數(shù)now的函數(shù)體打印');
}
//類的普通方法(void表示函數(shù)沒有返回值)
void printInfo(){
print("類的printInfo方法::${this.name}--${this.age}--${this.sex}");
}
//setter方法敢课,關鍵字set聲明的方法,一般用于設置單個屬性值
set setInfo(String name){
this.name=name;
}
//getter方法负蠕,關鍵字get聲明的方法他托,一般用來獲取類的某些屬性
get getInfo{
return "getter方法::${this.name}--${this.age}--${this.sex}";
}
}
void main(){
Person p1=new Person('張三',20,'man');//實例并調用類的默認構造函數(shù)
Person p2=new Person.now();//實例并調用類的命名構造函數(shù)
p1.printInfo();//調用printInfo方法
p1.setInfo="李四";//調用set方法重寫屬性
print(p1.getInfo);//打印get方法拿到的數(shù)據(jù)
}
二.extends繼承礼仗、覆寫父類方法及super關鍵字
//父類 Person
class Person {
String name;
int age;
Person(this.name,this.age);
Person.now(){
print('now');
}
printInfo(){
print("父類方法::$name--$age");
}
}
//子類 Son
class Son extends Person {
String sex;
//繼承父類屬性并將實例化時傳來的sex賦值到this.sex
Son(String name,int age,String sex):super(name,age){
this.sex=sex;
}
run(){
super.printInfo();//調用父類方法-使用super.方法名()
print(this.name);//調用父類屬性-使用this.
}
@override //覆寫父類同名方法約定使用@override標注
printInfo() {
print("此方法覆寫父類同名方法::$name--$age");
}
}
void main(){
Son s1=new Son("王五",23,"女");
s1.run();
s1.printInfo();
}
三.abstract抽象類
- 特點:
1.使用abstract關鍵字定義一個抽象類
2.定義方法不實現(xiàn)祸憋,讓子類去實現(xiàn)
3.不可直接實例抽象類--調用時體現(xiàn)
- 應用場景:
定義一個類的標準会宪,適用于定義接口
abstract class Animal {
eat();
run();
}
class Dog extends Animal {
eat(){
print('Dog--eat');
}
run(){
print('Dog--run');
}
}
void main(){
// var a1=new Animal(); //不可直接實例抽象類
Dog d1=new Dog();//可以實例繼承抽象方法的子類
d1.eat();
d1.run();
}
四.Mixin混入
- 特點:(配合代碼理解)
1.作為被Son繼承的mixin類 只可以繼承自Object類 不可繼承自其它類
2.作為被Son繼承的mixin類 不可有構造函數(shù)
3.繼承多個類重復的方法肖卧,后面覆蓋前面的處理方式
4.繼承后的Son子類is類型檢測時 同屬于A,B,Person 結果都為true
5.mixin不是繼承 不是接口 是新特性
- 應用場景:
可實現(xiàn)多繼承
class Person {
String name;
Person(this.name);
printInfo(){
print("${this.name}");
}
}
// class A extends Person{ //錯誤代碼:作為被Son繼承的mixin類 只可以繼承自Object類 不可繼承自其它類
// A(String name):super(name); //錯誤代碼:作為被Son繼承的mixin類 不可有構造函數(shù)
// printInfo(){
// print("${this.name}");
// }
// }
class A {
printInfo(){
print("A");
}
}
class B {
printInfo(){
print("B");
}
}
class Son extends Person with A,B {//with后的A蚯窥、B兩個類以mixin形式被繼承
Son(String name):super(name);
}
void main(){
Son s1=new Son('我是abc');
s1.printInfo();//打印字符串B
}
五.接口
abstract class Db1 {
add();
}
abstract class Db2 {
save();
}
class Mysql implements Db1,Db2 { //多個接口應用場景 使用implements接口1,接口2......
@override
add() {
print('add');
}
save() {
print('save');
}
}
void main(){
Mysql m1=new Mysql();
m1.add();
m1.save();
}
六.類設置初始變量值
class Person {
String name;
int age;
Person():name="張三",age=21{
}
printInfo(){
print("${this.name}--${this.age}");
}
}
void main(){
Person p1=new Person();
p1.printInfo();//張三--21
}
七.類的靜態(tài)屬性
//使用static關鍵字聲明的屬性和方法視為靜態(tài)成員
class Person {
String name;
int age;
static String sex="女";
Person(this.name,this.age);
printInfo(){
print(this.name);
}
printInfo2(){
print(sex);//非靜態(tài)方法可以訪問靜態(tài)成員
}
static void staticfn(){
print(name);//靜態(tài)方法不可以訪問非靜態(tài)成員
}
static void staticfn2(){
print(sex);
}
}
void main(){
Person p1=new Person("張三",20);
}
八.類的私有屬性
- 實現(xiàn)私有的條件:
1.私有成員聲明時變量名前要有_
2.將帶有私有成員的類分離出去
//存放私有屬性方法的private.dart文件
class Person {
String name;
int age;
String _sex;//私有屬性
Person(this.name,this.age,this._sex);
myfn1(){
print('myfn1');
}
_myfn2(){//私有方法
print('myfn2');
}
getSelfValue(){//普通方法拋出私有屬性
return this._sex;
}
getSelfFn(){//普通方法調用私有方法
return this._myfn2();
}
}
//要調用私有成員的文件
import 'libs/private.dart';
void main(){
Person p1=new Person("張三",20,"男");
//實例可以訪問普通屬性塞帐、方法
print(p1.name);
p1.myfn1();
//實例不可以訪問私有屬性拦赠、方法
// print(p1._sex);
// p1._myfn2();
//為了可以訪問私有屬性 調用普通方法拋出私有屬性
print(p1.getSelfValue());
//為了可以訪問私有方法 調用普通方法拋出私有方法
p1.getSelfFn();
}
九.泛型
//泛型類
class Person<N,A> {
N name;
A age;
Person(this.name,this.age);
set setInfo(N n){ //調用此方法必須傳入N類型數(shù)據(jù)
this.name=n;
}
get getInfo{
return "{name:${this.name},age:${this.age}}";
}
}
void main(){
Person p1=new Person<String,int>('張三', 111);
p1.setInfo='李四';
print(p1.getInfo);//name:李四,age:111
}
//泛型方法
T getData1<T>(T name){ //校驗返回類型
return name;
}
getData2<T>(T name){ //不校驗返回類型
return 123;
}
void main(){
print(getData1<String>("張三"));
print(getData2<String>("張三"));
}
//泛型接口
abstract class Person<T> {
getValue(String key);
setValue(String key,T value);
}
class Man<T> implements Person<T> {
@override
getValue(String key) {
return null;
}
@override
setValue(String key,T value) {
print("Man--設置$key=$value");
}
}
class Woman<T> implements Person<T> {
@override
getValue(String key) {
return null;
}
@override
setValue(String key,T value) {
print("Woman--設置$key=$value");
}
}
main(){
Person p1=new Man<int>();//實例時尖括號傳入類型
p1.setValue("鍵值", 111);//調用對應方法按照聲明時一致類型傳入即可
}
十.庫的使用
// 1.自定義庫 使用import "libs/selfApi.dart"; 直接調用即可
// 2.引入dart的內置庫 使用import "dart:io"; 直接調用即可
// 3.引入第三方庫
// (1).找到你要用的庫 https://pub.dev/packages
// (2).創(chuàng)建一個pubspec.yaml配置文件 name--名稱 description--描述 dependencies--依賴的庫:版本
// (3).終端運行pub get下載依賴庫
// (4).看文檔按照指定方式具體使用
卡布奇諾、![]()