面向對象編程(OOP)的三個基本特徵是:封裝、繼承、多態sql
Dart全部的東西都是對象,全部的對象都繼承自Object類。數據庫
Dart是一門使用類和單繼承的面嚮對象語言,全部的對象都是類的實例,而且全部的類都是Object的子類編程
一個類一般由屬性和方法組成。ide
class Person {
// String name = '張三';
// int age = 32;
String name;
int age;
// 構造函數在實例化的時候觸發
// Person() {
// print('構造函數在實例化的時候觸發');
// }
// Person(String name, int age) {
// this.name = name;
// this.age = age;
// }
Person(this.name, this.age);
// 命名構造函數
Person.setInfo(String name, int age) {
this.name = name;
this.age = age;
}
void getInfo() {
print('${this.name}---${this.age}');
}
void setInfo(int age) {
this.age = age;
}
}
void main() {
Person p2 = new Person('Hiraku', 29);
p2.setInfo(28);
p2.getInfo();
Person p3 = new Person.setInfo('Hiraku', 29);
p3.getInfo();
}
複製代碼
_
表示私有屬性class Reac {
num height;
num width;
Reac(this.height, this.width);
get area {
return this.height * this.width;
}
}
void main() {
Reac r = new Reac(8, 16);
print('面積:${r.area}');
}
複製代碼
class Reac {
num height;
num width;
Reac(this.height, this.width);
set reacHeight(num val) {
this.height = val;
}
get area {
return this.height * this.width;
}
}
void main() {
Reac r = new Reac(8, 16);
r.reacHeight = 1;
print('面積:${r.area}');
}
複製代碼
class Reac {
num height;
num width;
Reac():height = 20, width = 30{
print('${this.height}===${this.width}');
}
set reacHeight(num val) {
this.height = val;
}
get area {
return this.height * this.width;
}
}
void main() {
Reac r = new Reac();
print('面積:${r.area}');
}
複製代碼
class Person {
static String name = '張三';
static void show() {
print(name);
}
}
void main() {
print(Person.name);
Person.show();
}
複製代碼
class Person {
static String name = '張三';
int age=20;
static void show() {
print(name);
}
void printInfo() { /*非靜態方法能夠訪問靜態成員以及非靜態成員*/
// print(name); // 訪問靜態屬性
// print(this.age); // 訪問非靜態屬性
show(); // 調用靜態方法
}
static void printUserInfo() {// 靜態方法
print(name); // 靜態屬性
show(); // 靜態方法
// print(this.age); // 靜態方法無法訪問非靜態的屬性
// this.printInfo(); // 靜態方法無法訪問非靜態的方法
// printInfo();
}
}
void main() {
// print(Person.name);
// Person.show();
// Person p = new Person();
// p.printInfo();
Person.printUserInfo();
}
複製代碼
?
條件運算符 (瞭解)as
類型轉換is
類型判斷..
級聯操做 (連綴) (記住)class Person {
String name;
int age;
Person(this.name, this.age);
printInfo() {
print('${this.name}--${this.age}');
}
}
void main() {
Person p;
p.printInfo(); // 報錯
p?.printInfo();
print(p is Person); // true
print(p is Object); // true
}
void main() {
var p1;
p1 = '';
p1 = new Person();
(p1 as Person).printInfo();
}
void main() {
Person p1 = new Person('Hiraku', 29);
p1.printInfo(); // Hiraku--29
p1.name = '馬紅琴';
p1.age = 18;
pi.printInfo(); // 馬紅琴--18
p1..name = '馬紅琴'
..age = 18
..pringInfo(); // 馬紅琴--18
}
複製代碼
extends
關鍵詞來繼承父類getter
和 setter
class Person {
String name;
int age;
Person(this.name, this.age);
Person.work(this.name) { // 命名構造函數
print('${this.name} is working');
};
void printInfo() {
print('${this.name}--${this.age}');
}
void isJoking() {
print('${this.name}---is joking');
}
}
class Web extends Person {
String sex;
Web(String name, int age, String sex) : super(name, age) {
this.sex = sex;
}
void printFun() {
print('${this.name}--${this.age}--${this.sex}');
}
}
class Design extends Person {
String sex;
Design(String name, int age, String sex) : super.work(name) {
this.age = age;
this.sex = sex;
}
void printFun() {
super.isJoking(); // 子類調用父類的方法
print('${this.name}--${this.age}--${this.sex}');
}
@overage
void printInfo() { // 複寫父類方法
print('姓名:${this.name}');
}
}
void main() {
Web w = new Web('Hiraku', 29, '女');
Design d = new Design('Hiraku', 29, '女');
w.printFun();
d.printFun();
}
複製代碼
Dart中抽象類: Dart 抽象類主要用於定義標準,子類能夠繼承抽象類,也能夠實現抽象類接口。函數
abstract
關鍵字來定義extends
抽象類和 implements
的區別:ui
abstract class Animal { // 抽象類用 abstract 定義
Animal();
eat(); // 抽象方法,主要用來約束子類,不能使用 abstract 定義,而是沒有方法體的方式定義抽象方法
run();
printCommonFunc() {
print('我是抽象類的抽象方法');
}
}
class Dog extends Animal {
@override
eat() { // 必須得實現抽象方法
print('小狗在吃骨頭');
}
@override
run() {
print('小狗在遛彎');
}
printInfo() {
print('我是小狗');
}
}
class Cat extends Animal {
@override
eat() {
print('小貓在吃貓食');
}
@override
run() {
print('小貓在散步');
}
printInfo() {
print('我是小貓咪');
}
}
void main() {
Dog d = new Dog();
d.eat();
d.run();
Cat c = new Cat();
c.eat();
c.run();
Animal animalDog = new Dog();
animalDog.eat();
animalDog.printCommonFunc();
// animalDog.printInfo(); // 報錯,由於子類的實例賦值給父類的引用
Animal animalCat = new Cat();
animalCat.eat();
}
複製代碼
abstract class Db { // 看成接口:規範 規定
String uri; // 數據庫鏈接地址
add();
save();
delete();
}
class Mysql implements Db {
@override
String uri;
@override
add() {
// TODO: implement add
return null;
}
@override
delete() {
// TODO: implement delete
return null;
}
@override
save() {
// TODO: implement save
return null;
}
}
class MongoDb implements Db {
@override
String uri;
@override
add() {
// TODO: implement add
return null;
}
@override
delete() {
// TODO: implement delete
return null;
}
@override
save() {
// TODO: implement save
return null;
}
}
複製代碼
abstract class A {
String name;
printA();
}
abstract class B {
printB();
}
class C implements A,B {
@override
String name;
@override
printA() {
print('printA');
}
@override
printB() {
// TODO: implement printB
return null;
}
}
void main(){
C c=new C();
c.printA();
}
複製代碼
class Animal {
String name;
int age;
Animal(this.name, this.age);
funcAnimal() {
print('${this.name}--${this.age}');
}
}
class A {
String info = 'This is a attribute in A';
funcA() {
print('我是 A');
}
}
class B {
funcB() {
print('我是 B');
}
}
class C extends Animal with A, B {
C(String name, int age) : super(name, age);
funcC() {
print('我是 C 的方法');
}
}
void main() {
C c = new C('小貓', 3);
c.funcA();
c.funcB();
c.funcC();
c.funcAnimal();
print(c.info);
print(c is A); // true
print(c is Animal); // true
}
複製代碼