Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类。

面向对象编程(OOP)的三个基本特征是:封装、继承、多态

封装:封装是对象和类概念的主要特性。封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象调用, 而一部分属性和方法则隐藏。

继承:面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

多态:允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。


  • 构造函数

// class Person{
// String name='张三';
// int age=20;
// //默认构造函数
// Person(){
// print('这是构造函数里面的内容 这个方法在实例化的时候触发');
// }
// void printInfo(){
// print("${this.name}----${this.age}");
// }
// } // class Person{
// String name;
// int age;
// //默认构造函数
// Person(String name,int age){
// this.name=name;
// this.age=age;
// }
// void printInfo(){
// print("${this.name}----${this.age}");
// }
// } class Person{
String name;
int age;
//默认构造函数的简写,通常这么用
Person(this.name,this.age);
void printInfo(){
print("${this.name}----${this.age}");
}
} void main(){ Person p1=new Person('张三',20);
p1.printInfo(); Person p2=new Person('李四',25);
p2.printInfo(); }

区别1:与java的构造函数有点不同的是,dart里面构造函数可以写多个。

class Person{
String name;
int age;
//默认构造函数的简写
Person(this.name,this.age); Person.now(){
print('我是命名构造函数');
} Person.setInfo(String name,int age){
this.name=name;
this.age=age;
} void printInfo(){
print("${this.name}----${this.age}");
}
} void main(){ // var d=new DateTime.now(); //实例化DateTime调用它的命名构造函数
// print(d); //Person p1=new Person('张三', 20); //默认实例化类的时候调用的是 默认构造函数 //Person p1=new Person.now(); //命名构造函数 Person p1=new Person.setInfo('李四',30);
p1.printInfo();
}

区别2:Dart中没有 public private protected这些访问修饰符,但是我们可以使用_把一个属性或者方法定义成私有。

区别3:getter与setter修饰符

class Rect{
double height;
double width;
Rect(this.height,this.width);
// getter修饰符
get area{
return this.height * this.width;
}
// setter修饰符
set areaHeight(value){
this.height = value;
}
} void main() {
Rect r = Rect(10.0,5.0);
print(r.area);
r.areaHeight = 20.0;
print(r.area);
}

 区别4:Dart可以在构造函数体运行之前初始化实例变量

class Rect{

  int height;
int width;
Rect():height=2,width=10{ print("${this.height}---${this.width}");
}
getArea(){
return this.height*this.width;
}
} void main(){
Rect r=new Rect();
print(r.getArea()); }

  • Dart中的静态成员与静态方法

class Person {
static String name = '张三';
static void show() {
print(name);
}
} void main() {
print(Person.name);
Person.show();
}

与java语法基本一样。

静态方法不能访问非静态成员,只能访问静态成员。

非静态方法可以访问非静态成员,也可以访问静态成员。


  • Dart中的对象操作符

条件运算符——?

class Person{
String name;
int age;
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
} void main() {
Person p;
p.printInfo(); // NoSuchMethodError: The method 'printInfo' was called on null.
p?.printInfo(); // 如果p不为null时,执行printInfo方法。否则跳过。
}

类型转换(类似Java中的强制转换)——as

 (p as Person).printInfo();

类型判断——is

if(p is Person){
...
}

级联操作——..

p..name = "李四"
..age = 30
..printInfo();

  • Dart中的super(用于“继承”)

super关键字可以传递参数给父类

class Person {
String name;
num age;
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
} class Web extends Person{
String sex;
Web(String name, num age,String sex) : super(name, age){ // super关键字可以把name和age的值传递给父类
this.sex=sex;
}
run(){
print("${this.name}---${this.age}--${this.sex}");
} } void main(){ Web w=new Web('张三', 12,"男"); w.printInfo(); w.run(); }

super关键字可以调用父类方法

class Person {
String name;
num age;
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
work(){
print("${this.name}在工作...");
}
} class Web extends Person{
Web(String name, num age) : super(name, age); run(){
print('run');
super.work(); //子类调用父类的方法
}
}

  • Dart中的抽象类

Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。

1、抽象类通过abstract 关键字来定义

2、Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法。

3、如果子类继承抽象类必须得实现里面的抽象方法

4、如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法。

5、抽象类不能被实例化,只有继承它的子类可以

extends抽象类 和 implements的区别:

1、如果要复用抽象类里面的方法,并且要用抽象方法约束子类的话我们就用extends继承抽象类

2、如果只是把抽象类当做标准的话我们就用implements实现抽象类

abstract class Animal{
eat(); //抽象方法
run(); //抽象方法
printInfo(){
print('我是一个抽象类里面的普通方法');
}
} class Dog extends Animal{
@override
eat() {
print('小狗在吃骨头');
} @override
run() {
print('小狗在跑');
}
}
class Cat extends Animal{
@override
eat() {
print('小猫在吃老鼠');
} @override
run() {
print('小猫在跑');
} } main(){ Dog d=new Dog();
d.eat();
d.printInfo(); Cat c=new Cat();
c.eat();
c.printInfo(); // Animal a=new Animal(); //抽象类没法直接被实例化 }

  • Dart中的多态

Dart中的多态:

允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。

子类的实例赋值给父类的引用。

多态就是父类定义一个方法不去实现,让继承他的子类去实现,每个子类有不同的表现。

abstract class Animal{
eat(); //抽象方法
} class Dog extends Animal{
@override
eat() {
print('小狗在吃骨头');
}
}
class Cat extends Animal{
@override
eat() {
print('小猫在吃老鼠');
}
} main(){
Dog d=new Dog();
d.eat(); Cat c=new Cat();
c.eat();
}

  • Dart中的接口

和Java一样,dart也有接口,但是和Java还是有区别的。

首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。

同样使用implements关键字进行实现。

但是dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象中的属性和方法全部需要覆写一遍。

而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像Java接口那样的方式,一般会使用抽象类

建议使用抽象类定义接口

/*
定义一个DB库 支持 mysql mssql mongodb
mysql mssql mongodb三个类里面都有同样的方法
*/ abstract class Db{ //当做接口 接口:就是约定 、规范
String uri; //数据库的链接地址
add(String data);
save();
delete();
} class Mysql implements Db{ @override
String uri; Mysql(this.uri); @override
add(data) {
print('这是mysql的add方法'+data);
} @override
delete() {
return null;
} @override
save() {
return null;
} remove(){
return null;
}
} class MsSql implements Db{
@override
String uri; @override
add(String data) {
print('这是mssql的add方法'+data);
} @override
delete() {
return null;
} @override
save() {
return null;
}
} main() { Mysql mysql=new Mysql('xxxxxx'); mysql.add('1243214');
}

  • Dart中的mixins

mixins的中文意思是混入,就是在类中混入其他功能。

在Dart中可以使用mixins实现类似多继承的功能

因为mixins使用的条件,随着Dart版本一直在变,这里讲的是Dart2.x中使用mixins的条件:

1、作为mixins的类只能继承自Object,不能继承其他类
2、作为mixins的类不能有构造函数
3、一个类可以mixins多个mixins类
4、mixins绝不是继承,也不是接口,而是一种全新的特性

class Person{
String name;
num age;
Person(this.name,this.age);
printInfo(){
print('${this.name}----${this.age}');
}
void run(){
print("Person Run");
}
} class A {
String info="this is A";
void printA(){
print("A");
}
void run(){
print("A Run");
}
} class B {
void printB(){
print("B");
}
void run(){
print("B Run");
}
} class C extends Person with B,A{
C(String name, num age) : super(name, age); } void main(){
var c=new C('张三',20);
c.printInfo(); // 张三----20
c.printB(); //B
print(c.info); // this is A
c.run(); // A Run(如果有同样的方法,取最后的mixins类的方法)
}

  • Dart中的泛型

泛型方法

void main() {

  T getData<T>(T value){
return value;
} String result = getData<String>("你好");
print(result);
}

泛型类

class PrintClass<T> {
List list = new List<T>(); void add(T value){
this.list.add(value);
} void printInfo(){
for(var i = 0; i < this.list.length; i++) {
print(this.list[i]);
}
}
} void main() {
PrintClass p = new PrintClass<String>();
p.add("你好");
p.add("再见");
p.printInfo();
}

泛型接口

abstract class Cache<T>{
getByKey(String key);
void setByKey(String key, T value);
} class FlieCache<T> implements Cache<T>{
@override
getByKey(String key) {
return null;
} @override
void setByKey(String key, T value) {
print("我是文件缓存 把key=${key} value=${value}的数据写入到了文件中");
}
} class MemoryCache<T> implements Cache<T>{
@override
getByKey(String key) {
return null;
} @override
void setByKey(String key, T value) {
print("我是内存缓存 把key=${key} value=${value} 写入到了内存中");
}
} void main(){
MemoryCache m1=new MemoryCache<String>();
m1.setByKey('index', '首页数据'); MemoryCache m2=new MemoryCache<Map>();
m2.setByKey('index', {"name":"张三","age":20});
}

Dart 面向对象 类 方法的更多相关文章

  1. php面向对象类中常用的魔术方法

    php面向对象类中常用的魔术方法   1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct( ...

  2. Flutter学习笔记(8)--Dart面向对象

    如需转载,请注明出处:Flutter学习笔记(7)--Dart异常处理 Dart作为高级语言,支持面向对象的很多特性,并且支持基于mixin的继承方式,基于mixin的继承方式是指:一个类可以继承自多 ...

  3. Php面向对象 – 类常量

    Php面向对象 – 类常量 类常量:类中,保存执行周期内,不变的数据. 定义: constkeyword const 常量名 = 常量值 样例: class Student { public  $st ...

  4. C语言利用 void 类型指针实现面向对象类概念与抽象。

    不使用C++时,很多C语言新手可能认为C语言缺乏了面向对象和抽象性,事实上,C语言通过某种组合方式,可以间接性的实现面对对象和抽象. 不过多态和继承这种实现,就有点小麻烦,但是依然可以实现. 核心: ...

  5. Python学习(七)面向对象 ——类和实例

    Python 面向对象 —— 类和实例 类 虽然 Python 是解释性语言,但是它是面向对象的,能够进行对象编程.至于何为面向对象,在此就不详说了.面向对象程序设计本身就很值得深入学习,如要了解,请 ...

  6. Java面向对象-类与对象

    Java面向对象-类与对象 类与对象的关系 我们通俗的举个例子,比如人类是一种类,张三这个人就是人类的具体的一个个体,也就是java中的对象:这就是一个类与对象的关系: 类的定义 下面看实例 类的创建 ...

  7. Python之面向对象类和对象

    Python之面向对象类和对象 定义一个类:class 定义类的语法: class Test(object): """ 类里定义一类事物共同的技能. 可以是变量,也可是函 ...

  8. C语言利用 void 类型指针实现面向对象类概念与抽象

    不使用C++时,很多C语言新手可能认为C语言缺乏了面向对象和抽象性,事实上,C语言通过某种组合方式,可以间接性的实现面对对象和抽象. 不过多态和继承这种实现,就有点小麻烦,但是依然可以实现. 核心: ...

  9. oopday01(面向对象-类&private&this)

    面向对象基本概述.封装 01_面向对象(面向对象思想概述) * A:面向过程思想概述    * 第一步    * 第二步 * B:面向对象思想概述    * 找对象(第一步,第二步) * C:举例   ...

随机推荐

  1. iOS自定义下拉列表

    实现效果如下: 点击导航栏的“点击”,弹出下拉列表. 注意:绿色的是控制器的view背景,又一个遮罩层,点击可以隐藏列表. Github地址: https://github.com/PengSiSi/ ...

  2. sed例子

    以care.log这个log文件为例, care.log: 05:44:31,816 DEBUG RawAggregationWorker:70 - LTS is working on Raw Dat ...

  3. 解决element-ui按需引入不了Scrollbar的问题

    一.报错原因 在我想按需引入element-ui时,突然报错: 这个报错来的有点措不及防.明明在页面当中能够使用,为仕么在单独引入时却不能引用了,真是百思不得其解. 经过在百度上的查找才知道,原来Sc ...

  4. WEB渗透技术之浅析路径遍历

    1. 发送 http://www.nuanyue.com/getfile=image.jgp 当服务器处理传送过来的image.jpg文件名后,Web应用程序即会自动添加完整路径,形如“d://sit ...

  5. css消除已有的背景颜色

    比如我们在第三方库的时候,样式会有你不喜欢的,就比如背景颜色.那么就要去除已有的背景颜色 background-color:transparent;

  6. Linux下配置APUE的编译 报错之后如何处理

    APUE即Unix环境高级编程,本书中几乎所有的程序都包含一个apue.h的头文件,那如何配置这个apue.h呢? 官方地址:http://www.apuebook.com/apue3e.html 1 ...

  7. Java 之前总结

    写Java程序 1使用记事本,编写代码 2命名为文件里的类名称相一致 “.java” 3编译编译器创建class文件 编译 打开命令行窗口,进入Java文件所在的目录,执行命令:javac Welco ...

  8. [转帖]Windows安全认证是如何进行的?[Kerberos篇]

    Windows安全认证是如何进行的?[Kerberos篇] NTLM 的简单看了一下 基本上了解了.. 这个KERBEROS 的看不太懂 感觉说的我也有点迷糊.. 虽然是对称加密的 但是不清不楚的.. ...

  9. Mac安装postgresql和卸载PostgreSQL

    1.homebrew安装 brew install postgresql 2.初始化 initdb /usr/local/var/postgres 3.创建数据库及查看数据库 (1)先创建db. cr ...

  10. 解决:Could not resolve bean definition resource pattern [/WEB-INF/classes/spring/applicationContext-*.xml]

    问题: 用Maven搭建spring.springmvc.mybatis时,运行报错: org.springframework.beans.factory.BeanDefinitionStoreExc ...