java类的比较_java-dart比较 - 类

类的概述

官方概述:Dart 是一种基于类和 mixin 继承机制的面向对象的语言。 每个对象都是一个类的实例,所有的类都继承于 Object. 。 基于Mixin 继承意味着每个类(除 Object 外)都只有一个超类,一个类中的代码可以在其他多个继承类中重复使用。

概述跟java基本一致,只是在实际写法中,dart做了很多优化,有很多简化的语法糖。

类的构造函数

命名区别

dart的构造函数一个名称只能有一个函数,默认构造函数名称就是类名,如果要定义多个构造函数,那么就要定义其他的别名,规则是类名.别名(参数列表),例如:

class ClsA {

int a;

int b;

// 传统构造函数,自己赋值参数 [代码1]

ClsA(int a) {

this.a = a;

}

// dart的语法糖,this.a代表参数也代表赋值【代码2】

ClsA(this.a, this.b); // 这里会报错,因为已经有了一个默认名称的构造函数

// 自定义名称的构造函数【代码3】

ClsA.Cons(this.a);

void printHello() {

print('hello world: ${a}');

}

}

在代码2中,会报错,是因为已经有了ClsA(int a)的构造函数,虽然代码2的构造函数是多个参数的,但dart中,函数的区分,无法通过参数的多少来界定。所以同一个名称的构造函数或者普通成员方法,不管参数有多少,都只能有一个名称。

09721e23e4b70b803d0f180cb61419bd.png

48271ceed21acae687b733ce3b3234dc.png

构造函数继承性区别

dart的默认构造函数天生继承父类的构造函数,并且不会被覆盖,而java就不会,java需要调用super显示调用。

class A {

A() {

print('hello world a');

}

}

class B extends A {

B() {

print('hello world b');

}

}

void main() {

var b = B();

}

输出:

hello world a

hello world b

dart中也有super关键字,只是调用的方式不一样:

class A {

A() {

print('hello world a');

}

}

class B extends A {

B() : super() { // 紧随构造方法括号之后,加上冒号和super调用

print('hello world b');

}

}

void main() {

var b = B();

}

输出同上。

dart如果父类包含有参的默认构造函数,那么子类必须显示调用父类的构造函数,而Java则没有这样的要求,java可以覆盖或者定义不同参数的构造函数。

class A {

int a;

A(this.a) {

print('hello world a');

}

}

class B extends A {

B(); // 这里报错!!!

}

6ae1a71dd61358c649556c4f7a0ec4db.png

正确的解法:

class A {

int a;

A(this.a) {

print('hello world a');

}

}

class B extends A {

B() : super(1);

}

类的实例化

dart类的实例化,不需要用new关键字,直接把类名当普通函数来调用即可,而java是必须用new来生成对象的。

接口与class并存,但interface已消失

dart中不存在interface的关键字,但接口还是存在的,并且接口变成了类,就是说,任何一个类都可以视作是一个接口,区分就是如果你用implements来实现它,那么它里面的除构造函数外的其他任何成员(成员变量和成员方法),你都要重新实现。

//接口学习

class InterA {

// 成员变量,包含在接口里,需要实现getter方法

final a = null;

// 构造函数,不包含在接口中

InterA.test() {

print('hello interface a');

}

// 成员方法,包含在接口中,需要重新实现

void hello() {

print('hello interface function');

}

}

class SuperClass implements InterA {

get a => 'this is a';

@override

void hello() {

print('hello override function');

}

}

void main() {

SuperClass().hello();

}

总之,任何类都可以作为接口,只要是被implements了。

为类添加新功能:mixin

什么是mixin:Mixin 是复用类代码的一种途径, 复用的类可以在不同层级,之间可以不存在继承关系,通过 with 后面跟一个或多个混入的名称,来 使用 Mixin。

用我的话讲就是,with后面带一个或多个类,可以复用这些类的方法。当然如果Mixin不希望作为常规类被使用,可以用mixin关键字替换class

// mixin学习

class ClsMixin {

var a = 1;

void hello() {

print('hello mixin class');

}

}

mixin NoClsMixin {

var a = 2;

void hello() {

print('hello no class mixin');

}

}

class MyClass1 with ClsMixin {

}

class MyClass2 with NoClsMixin {

}

void main() {

MyClass1().hello();

print(MyClass1().a);

MyClass2().hello();

print(MyClass2().a);

}

输出:

hello mixin class

1

hello no class mixin

2

当然,如果一个类要被作为一个mixin,那么它不能有显式的构造方法(就是根本不能写任何的构造方法),如下图:

4588434f0dc2bdb5ec1fb4435ec3f707.png

static的关键字和java一致

被修饰后的函数或者成员变量,均属于类,而不属于对象,不能访问this

泛型的使用和java一致,并无差别

var names = ['Seth', 'Kathy', 'Lars']; // 初始化为全部为String类型的List集合对象

var uniqueNames = {'Seth', 'Kathy', 'Lars'}; // 初始化为全部为String的Set集合对象

var pages = { // 初始化为key和value都是String的Map集合对象

'index.html': 'Homepage',

'robots.txt': 'Hints for web robots',

'humans.txt': 'We are people, not machines'

};

类型判定

java中使用instanceOf关键字,dart则是is

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值