面向对象编程(OOP)的三个基本特征
1、封装:封装是面向对象的特征之一,是对象和类概念的主要特性。
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
2、继承:面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
3、多态:多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
定义一个类
Dart所有的东西都是对象,所有的对象都继承于Object类
Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类
一个类通常由属性和方法组成
class Person {
String name = "AA";
int age = 24;
void getInfo(){
print("$name------$age");
//换种写法
//print("${this.name}------${this.age}");
}
void setInfo(age){
this.age = age;
}
}
void main(List<String> args) {
//实例化
var person = new Person();//Person person = new Person();
print(person.name);
person.getInfo();
person.setInfo(27);
person.getInfo();
}
构造函数:实例化类的时候自动触发的方法
注意:
因flutter2.0添加了Sound null safety空安全声明,目的是通过显式声明可能为null的变量,增加Dart语言的鲁棒性。
因为Dart语言变量可以存null或者具体的值,因此在日常的开发中可能因为忘记赋值或者变量延迟赋值,导致访问某个变量时为null,导致程序运行时抛出exception。
这个功能推出后,可以从源码级解决null异常导致的错误。
有两种写法:
(1)在类型声明后添加 "?" 以标识这个变量是可以为null的。
(2)在类型声明前添加 "late" 以标识这个变量在使用前一定要进行初始化。
class Person {
String? name;
int? age;
//构造函数
// Person(String name, int age) {
// print("这是构造函数中的内容,实例化的时触发");
// this.name = name;
// this.age = age;
// }
//构造函数可简写
Person(this.name,this.age);
void getInfo() {
print("${this.name}------${this.age}");
}
}
void main(List<String> args) {
//类可以实例化多次
Person person1 = new Person("李四", 25);
person1.getInfo();
Person person2 = new Person("王二", 28);
person2.getInfo();
}
命名构造函数
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 getInfo() {
print("${this.name}------${this.age}");
}
}
void main(List<String> args) {
//默认实例化类的时候调用的是 默认构造函数
Person person = new Person("name", 23);
Person person2 = new Person.now();//我是命名构造函数
Person person3 = new Person.setInfo("麻子", 34);
person3.getInfo();
}
方法和属性修饰符
Dart 和其他面向对象语言不一样,Dart中没有public、private、protected这些访问修饰符
但是可以使用_把一个属性或者方法定义成私有
单独新建一个类
class Animal {
//私有属性,只能本类中访问
String? _name;
int? _age;
Animal(this._name, this._age);
void printInfo() {
print("${this._name}------${this._age}");
}
//在新版本中一定要记得加上?允许可空哦
String? getName() {
return this._name;
}
//私有方法,仅可在当前类访问
_run(){
print("私有方法");
}
exrcRun(){
this._run();//类里面方法的互相调用
}
}
访问新建类Animal
void main(List<String> args) {
Animal animal = new Animal("小猫", 5);
animal.printInfo();
print(animal.getName());
animal.exrcRun();
}
类中初始化列表
Dart中我们也可以在构造函数体运行之前初始化实例变量
class Rect{
int? h;
int? w;
Rect():h = 11,w = 2{
}
getArea(){
return this.h!*this.w!;
}
}
void main(List<String> args) {
Rect r = new Rect();
print(r.getArea());//22
}
记录Dart学习,谢谢
一起讨论学习哦~