一、静态成员和静态方法
Dart中的静态成员:
使用static关键字来实现类级别的变量和函数静态方法不能访问非静态成员,非静态方法可以访问静态成员静态变量(类变量)对于类范围内的状态和常量是有用的静态变量在使用之前不会初始化静态方法(类方法)不对实例进行操作,因此无法访问该实例可以使用静态方法作为编译时常量。例如,可以将静态方法作为参数传递给常量构造函数
//1、静态成员/方法的定义和使用
class Person {
//静态成员
static String name = '张三';
//静态方法
static void show() {
print(name);
}
}
main(){
print(Person.name);
Person.show();
}
//2、静态成员/方法的定义和非静态成员/方法的互相调用
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();
}
}
main(){
// print(Person.name);
// Person.show();
// Person p=new Person();
// p.printInfo();
Person.printUserInfo();
}
注意
二、对象操作符
Dart中的对象操作符:
class Person {
String name;
num age;
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
}
main(){
Person p1;
p1?.printInfo(); //表示:如果对象(p1)为空时,就不会调用printInfo()方法
Person p2=new Person('张三', 20);
p2?.printInfo(); //表示:如果对象(p2)不为空时,就会调用printInfo()方法
Person p3=new Person('张三', 20);
if(p3 is Person){ //判断对象是否属于Person类
p3.name="李四";
}
p3.printInfo();
print(p3 is Object);
var p4;
p4='';
p4=new Person('张三', 20);
p4.printInfo();
(p4 as Person).printInfo(); //p4强制转换成Person对象
Person p5=new Person('张三', 20);
p5.printInfo();
p5.name='张三李四';
p5.age=30;
p5.printInfo();
//可以写成下面形式
Person p6=new Person('张三', 20);
p6.printInfo();
p6..name="张三李四"
..age=30
..printInfo();
}
三、类的继承
面向对象的三大特性:封装 、继承、多态
Dart中的类的继承:
子类使用extends关键词来继承父类,使用super引用父类:子类会继承父类里面可见的属性和方法 但是不会继承构造函数子类能复写父类的方法 getter和setter子类还可以使用@override注释来指示重写了某个成员方法如果重写==,还应该重写对象的hashCode getter,这点和Java类似
class Person {
String name='张三';
num age=20;
void printInfo() {
print("${this.name}---${this.age}");
}
}
class Man extends Person{
}
main(){
Man m = new Man();
print(m.name);
m.printInfo();
}
class Person {
String name;
num age;
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
}
class Man extends Person{
Man(String name, num age) : super(name, age){
//super表示 实例化子类给父类的构造函数传参
}
}
main(){
Person p=new Person('李四',20);
p.printInfo(); //李四---20
Person p1=new Person('张三',20);
p1.printInfo(); //张三---20
Man m=new Man('张三', 12);
m.printInfo(); //张三---12
}
给命名构造函数传参
class Person {
String name;
num age;
Person(this.name,this.age);
Person.newName(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
}
class Man extends Person{
String sex;
Man(String name, num age,String sex) : super.newName(name, age){
this.sex=sex;
}
run(){
print("${this.name}---${this.age}--${this.sex}");
}
}
main(){
// Person p=new Person('李四',20);
// p.printInfo();
// Person p1=new Person('张三',20);
// p1.printInfo();
Man m=new Man('张三', 12,"男");
m.printInfo();
m.run();
}
class Person {
String name;
num age;
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
work(){
print("${this.name}在工作...");
}
}
class Man extends Person{
Man(String name, num age) : super(name, age);
run(){
print('run');
}
//覆写父类的方法 和父类的方法名一样
@override //可以写也可以不写 建议在覆写父类方法的时候加上 @override
void printInfo(){
print("姓名:${this.name}---年龄:${this.age}");
}
@override
work(){
print("${this.name}的工作是写代码");
}
}
main(){
Man m=new Man('李四',20);
m.printInfo();
m.work();
}
class Person {
String name;
num age;
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
work(){
print("${this.name}在工作...");
}
}
class Man extends Person{
Man(String name, num age) : super(name, age);
run(){
print('run');
super.work(); //子类调用父类的方法
}
//覆写父类的方法
@override //可以写也可以不写 建议在覆写父类方法的时候加上 @override
void printInfo(){
print("姓名:${this.name}---年龄:${this.age}");
}
}
main(){
Man m=new Man('李四',20);
// m.printInfo();
m.run();
}
class A {
// Unless you override noSuchMethod, using a
// non-existent member results in a NoSuchMethodError.
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ' +
'${invocation.memberName}');
}
}
您不能调用未实现的方法,除非下列任何一个是正确的: