【Kotlin学习】类、对象和接口——带非默认构造方法或属性的类、数据类和类委托、object关键字

Kotlin基础——类、对象和接口 kotlin中同样使用interface关键字来定义接口,接口的含义和Java中类似,用于定义抽象使用interface关键字定义接口。实现一个接口跟Java中不同,Kotlin中继承类和实现接口都是使用冒号。重写接口中的方法,使用override关键字,与Java中不同的是,override是必须写的,如果不写则会报错。这会避免先写出实现方法再添加抽象方法造成的意外重写。和Java一样,Kotlin中的类只能继承一个类,但可以实现多个方法。 阅读详情

声明一个带非默认构造方法或属性的类

在java中一个类可以生命一个或多个构造方法,kotlin也一样,但做出了一点修改,它区分了主构造方法(通常是主要而简洁的初始化类的方法,并且在类体外部声明)和从/次构造方法(在类体内部声明)。同样也允许在初始化语句块中添加额外的初始化逻辑

初始化类:主构造方法和初始化语句块

在kotlin基础中我们见过如何声明一个类

在这里插入图片描述

通常来讲,类的所有声明都在花括号中,而这一段被括号围起来的语句块叫作主构造方法。它有两个目的
1.表明构造方法的参数
2.定义使用这些参数初始化的属性
。

可以编写的用来完成同样事情的最明确的代码

在这里插入图片描述

constructor关键字用来开始一个主构造方法或从构造方法的声明

init关键字用来引入一个初始化语句块,这种语句包含了在类被创建时执行的代码,并会与主构造方法一起使用。因为主构造方法有语法限制,不能包含初始化代码。也可以在一个类中声明多个初始化语句块

在这个例子中不需把初始化代码放在初始化语句块中,因为它可以与name属性的声明结合。如果主构造方法没有注解或可见性修饰符,同样可以去掉constructor关键字

在这里插入图片描述

代码可以通过把val关键字加在参数前的方式来进行简化,这样可以替换掉类中的属性定义

在这里插入图片描述

val意味着相应的属性会用构造方法的参数来初始化

可以像函数参数一样为构造方法参数声明一个默认值

在这里插入图片描述

要创建一个类的实例只需要直接调用构造方法,不需要new关键字

在这里插入图片描述

注意!如果所有的构造方法参数都有默认值,编译器会生成一个额外的无参的构造方法来使用所有的默认值

如果你的类具有一个父类,主构造方法同样要初始化父类。可以通过在基类列表的父类引用中提供父类构造方法参数的方式来做到

在这里插入图片描述

如果没有给一个类声明任何的构造方法,将会生成一个不做任何事情的默认构造方法

在这里插入图片描述

如果继承了User类且没有提供任何的构造方法,必须显式调用父类的构造方法,即使它没有任何参数

在这里插入图片描述

这就是为什么在父类名称后面还需要一个空括号。注意与接口的区别:接口没有构造方法,所以不需要在父类列表中它的名称后加上括号

若想确保你的类不被其他代码实例化,必须把构造方法标记为private

在这里插入图片描述

因为它只有一个private的构造方法,这个类外部的代码不能实例化它

private构造方法的替代方案

在java中通过使用private构造方法禁止实例化这个类来表示这个类是一个静态实用工具成员的容器或者是单例的。在kotlin中可以使用顶层函数标识静态实用工具。要表示单例可以使用对象声明。

构造方法:用不同的方式来初始化父类

大多数在java中需要重载构造方法的场景都被kotlin支持参数默认值和参数命名的语法涵盖。
贴士:不要声明多个从构造方法来重载和提供参数默认值,应该直接标明默认值

但还是会有需要多个构造方法的情景,设想一下一个在Java声明的具有两个构造方法的View类,kotlin中相似的声明如下

在这里插入图片描述

这个类没有声明一个主构造方法,但声明了两个从构造方法,从构造方法使用constructor关键字引出。可以声明任意多个从构造方法

若想扩展这个类,可声明同样的构造方法

在这里插入图片描述

也可以使用this关键字,从一个构造方法中调用你自己的类的另一个构造方法

在这里插入图片描述

如果类没有主构造方法,那么每个从构造方法必须初始化基类或者委托给另一个这样做了的构造方法

实现在接口中声明的属性

在kotlin中,接口可以包含抽象属性声明

在这里插入图片描述

这意味着实现User接口的类需要提供一个取得name值的方式。接口本身并不包含任何状态,因此只有实现这个接口的类在需要的情况下会存储这个值。

在这里插入图片描述

对于privateUser来说,直接在主构造方法中声明这个属性,这个属性实现了来自于User的抽象属性,所以将其标记为override。对于subscribeingUser来说,name属性通过一个自定义getter实现,这个属性没有一个支持字段来存储它的值,它只有一个getter在每次调用时从email中得到昵称,对于FacebookUser来说,在初始化时把name和值关联,可通过id获取

除了抽象声明外,接口还可以包含具有getter和setter的属性,只要它们没有引用一个支持字段(支持字段需要在接口中存储状态,这是不允许的)

在这里插入图片描述

此时属性没有支持字段,结果值通过每次访问时计算得到。name属性有一个自定义getter,它可以被继承,而email必须重写。
在类中实现的属性具有对支持字段的完全访问权限

通过getter或setter访问支持字段

结合存储值的属性和具有自定义访问器在每次访问时计算值的属性实现一个即可存储值又可以在值被访问和修改时提供额外逻辑的属性。要支持这种情况,需要能从属性的访问器中访问它的支持字段

在这里插入图片描述

使用

在这里插入图片描述

可以像平常一样使用user.address="new value"来修改一个属性的值,这在底层调用了setter。在这里setter被重新定义了,所以打印了输出日志

在setter的函数体中使用了特殊的标识符field来访问支持字段的值,在getter中只能读取值,在setter读写都可

有支持字段的属性和没有的区别
若你显式引用或使用默认的访问器实现,编译器会为属性生成支持字段。若你提供一个自定义访问器实现并没有使用field(若属性是val类型,就是getter,若是可变属性,则是两个访问器),支持字段将不会被呈现出来

修改访问器的可见性

不需要修改访问器的默认实现,但需要修改它的可见性时
访问器的可见性默认与属性的可见性相同,但如果需要可以通过在get和set关键字前放置可见性修饰符的方式来修改它

在这里插入图片描述

这个类用来计算单词加在一起的总长度。持有总长度的属性是public的,因为它时这个类提供给用户的API的一部分。但你要确保它只能在类中被修改,否则外部代码有可能会修改它并存储一个不正确的值。所以你让编译器生成一个默认可见性的getter和一个private setter

编译器生成的方法:数据类和类委托

通用对象方法

1.字符串表示:toString()

kotlin中也提供了一种方式来获取类对象的字符串表示形式,默认来说一个对象的字符串表示形如Client@5e9f23b4,这不是很有用,需重写它

在这里插入图片描述

2.对象相等性:equals()

所有关于Client类的计算都发生在其外部,这个类只用于存储数据。尽管如此还是会偶一些针对这种类行为的需求,例如想要将包含相同数据的对象视为相等

在这里插入图片描述

is检查是java中instanceof的模拟,用来检查一个值是否为一个指定的类型

==表示相等性

在java中可以使用==来比较基本数据类型和引用类型,若应用在基本数据类型上则比较的是值,若应用在引用类型上则比较的是引用

在kotlin中比较的是两个对象的默认方式,本质上说它就是通过调用equals来比较两个值的。如果equals在你的类中被重写了,就能安全地用来比较实例。要想进行引用比较,可使用===运算符

3.Hash容器:hashCode()

hashCode方法通常与equals一起被重写

未重写时

在这里插入图片描述

在这里插入图片描述

原因是Client类缺少了hashCode方法,因此它违反了通用的hashCode契约:如果两对象相等,它们必须有着相同的hash值。hashset中值是以一种优化过的方式来比较的:首先比较它们的hash值,然后只有当它们相等时才会去比较真正的值。上一例子中两个不同的实例有着不同的hash值,所以set认为它不包含第二个对象,即使equal返回true,所以如果不遵循规则,hashset不能在这样的对象上正常工作

修正问题

在这里插入图片描述

此时在所有情境下都能按预期工作

数据类:自动生成通用方法的实现

如果想要你的泪是一个方便的数据容器,你要重写toString等三个方法时,在kotlin中不必去生成这些方法,我们可以直接为类添加data修饰符

在这里插入图片描述

现在我们得到了一个重写了所有标准java方法的类
equals用来比较实例
hashCode用来作为例如HashMap这种基于哈希容器的键
toStirng用来为类生成按声明顺序排列的所有字段的字符串表达形式

equals和hashCode方法会将所有在主构造方法中声明的属性纳入考虑。生成的equals会检测所有的属性的值是否相等。hashCode返回一个根据所有属性生成的哈希值

数据类和不可变性:copy()方法
虽然数据类的属性同样可以使用var,但强烈推荐只使用只读属性,让数据类的实例不可变。若你想使用这样的实例作为键,那这是必需要求。为了让使用不可变对象的数据变得更容易,编译器为它们多生成了一个方法:一个允许copy类的实例的方法,并在copy的同时修改某些属性的值。创建副本通常是修改实例的好选择,副本有着单独的生命周期且不会影响代码中引用原始实例的位置。

手动实现copy()

在这里插入图片描述

测试及结果

在这里插入图片描述

在这里插入图片描述

类委托:使用by关键字

当你扩展一个类并重写某些方法时,代码就变得依赖继承的那个类的实现细节了。当系统不断演进且基类的实现被修改或者新方法被提娜佳进去后,你做出的关于类行为的假设会失效,代码也许最后以不正确的行为告终。

kotlin为了解决这些问题把类默认视作final,这确保了只有那些设计成可扩展的类可以被继承,当使用这样的类时,会看见它是开放的,就会注意这些修改要与派生类兼容。但我们常常需要向其他类添加一些行为,即使它并没有被设计为可扩展的。一个常用的实现方式以装饰器模式文明。这种模式的本质就是创建一个新类,实现与原始类一样的接口并将原来的类的实例作为一个字段保存。与原始类拥有同样行为的方法不用被修改,只需要直接转发到原始类的实例,但这样需要相当多的样板代码。

而kotlin在什么时候实现一个接口,都可以用by关键字把接口的实现委托到另一个对象

未使用by关键字前

在这里插入图片描述

使用by关键字后

在这里插入图片描述

类中所有的方法实现都消失了,编译器会生成它们,并且实现与未使用前相似,所以没必要手写代码当编译器能帮你做同样事情时。当你要修改某些方法的行为时可以重写它们

object关键字:将声明一个类与创建一个实例结合起来

object关键字在多种情况下出现
1.对象声明是定义单例的一种方式
2.伴生对象可以持有工厂方法和其他与这个类相关,但在调用时并不依赖类实例的方法,它们的成员可以通过类名来访问
3.对象表达式用来替代java的匿名内部类

对象声明:创建单例

单例模式:定义一个使用provate构造方法并且用静态字段来持有这个类仅有的实例
kotlin通过对象生命与该类的单一实例声明结合到了一起

使用一个对象声明一个组织的工资单

在这里插入图片描述

对象声明通过object关键字引入,一个对象声明可以非常高效地以一句话来定义一个类和一个该类的变量。

与类一样,一个对象声明也可以包含属性、方法、初始化语句块等的声明。唯一不允许的就是构造方法(包括主从构造方法)

与普通类实例不同,对象声明在定义的时候就立即创建了,不需要在代码的其他地方调用构造方法,因此为其定义一个构造方法是没有意义的

与变量一样,对象声明允许你使用对象加.字符的方式来调用方法和访问属性

在这里插入图片描述

对象声明同样可以继承自类和接口,这通常在你使用的框架需要去实现一个接口,但你的实现并不包含任何状态的时候很有用

单例和依赖注入

在大型软件系统中使用对象声明也并不总是理想的,它们在少部分只有少量依赖或没有依赖的代码中好用,但在与系统中其他部分有非常多交互的大型组件中却不然,因为你对对象实例化没有任何控制,并且不能通过构造方法指定特定的参数。这意味着你不能在单元测试或软件系统的不同配置中替换掉对象自身的实现,或对象依赖的其他类,如果你需要那种能力,需要将依赖注入框架如Guice

同样可以在类中声明对象,这样的对象同样只有一个单一实例:它们在每个容器类的实例中并不具有不同的实例,如:在类中放置一个用来比较特定对象的比较器

在这里插入图片描述

在java中使用kotlin对象

kotlin对象声明被编译成了通过静态字段来持有它的单一实例的类,这个字段名字始终是INSTANCE。要从java中访问kotlin对象可以通过访问静态的INSTANCE字段:Comparator.INSTANCE.compare(x1,x2);,字段的类型是Comparator

伴生对象:工厂方法和静态成员的地盘

kotlin类不能拥有静态成员,作为替代,kotlin依赖包级别函数(在大多数情况下能替代java的静态方法)和对象声明(在其他情况下替代java的静态方法,还包括静态字段)。在大多数情况下推荐使用顶层函数,但顶层函数不能访问类的private成员。如果你需要写一个可以在没有类实例的情况下调用但是需要访问类内部的函数,可以将其写成那个类中的对象声明的成员。这种函数的例子是工厂方法

在类中定义的对象之一可以使用companion关键字标记,这样做获得了直接通过容器类名称来访问这个对象的方法和属性的能力,不在需要显式指明对象的名称,最终的语法像java中静态方法的调用

在这里插入图片描述

伴生对象是调用private构造方法的好地方,它可以访问类中所有private成员,包括private构造方法,它是实现工厂模式的理想选择。

例子

在这里插入图片描述

使用工厂方法来替代构造方法

在这里插入图片描述

此时可以通过类名调用companion object的方法

在这里插入图片描述

在这里工厂方法能返回声明这个方法的类的子类,就像例子中的两个子类。你还可以在不需要的时候避免创建新的对象,你可以确保每一个email都与一个唯一的User实例对应,并且如果email在缓存中已经存在,那么在调用工厂方法时就会返回这个存在的实例而不是创建一个新的。如果你需要扩展这样的类,使用多个构造方法可能更好,因为伴生对象成员在子类中不能被重写

作为普通对象使用的伴生对象

伴生对象是一个生命在类中的普通对象,它可以有名字,实现一个接口或者扩展函数或者属性

声明一个命名了的伴生对象

在这里插入图片描述

在大多数情况下,通过包含伴生对象的类的名字引用伴生对象,所以不必关心它的名字,如果需要也可以指明如上图。如果省略了名字,默认分配为Companion

在伴生对象中实现接口

可以直接将包含它的类的名字当作实现了该接口的对象实例来使用。假定你的系统中有许多种对象,包括Person,你想要提供一个通用的方式来创建所有类型的对象。假设有一个JSONFactory接口可以从JSON反序列化对象,并且你的系统中的所有对象都通过这个工厂创建,可以为Person类提供这么一个接口实现

在这里插入图片描述

在这里插入图片描述

此时如果你有一个函数使用抽象方法来加载实体,可以传给它Person对象。

伴生对象扩展

如果你需要定义可以通过类自身调用的方法,就像伴生对象方法或者java静态方法该怎么办?如果类有一个伴生对象,可以通过在其上定义扩展函数来做到这一点。如果类C有一个伴生对象,并且在C.Companion上定义了一个扩展函数func,可以通过C.func()来调用它。

为伴生对象定义一个扩展函数

在这里插入图片描述

为了能够为你的类定义扩展,必须在其中声明一个伴生对象,即使是空的

对象表达式:改变写法的匿名内部类

object关键字不仅能用来声明单例式的对象,还能用来声明匿名对象。

使用匿名对象来实现事件监听器

在这里插入图片描述

除了去掉了对象的名字外,语法是与对象声明相同的。对象表达式声明了一个类并创建了该类的一个实例,但没有给对象分配名字

如果需要分配一个名字可以存储到一个变量中

在这里插入图片描述

kotlin的匿名对象可以实现多个接口或者不实现接口,并且它不是单例的,每次对象表达式被执行都会创建一个新的对象实例。在对象表达式中的代码可以访问创建它的函数中的变量,并且不限制在final变量,还可以在对象表达式中修改变量的值

从匿名对象访问局部变量

在这里插入图片描述

对象表达式在需要在匿名对象中重写多个方法时是最有用的

Kotlin 类、对象和接口 Kotlin 类、对象和接口 Kotlin 的类和接口在概念上跟 Java 是一样的,但是用法存在一些差别,比如继承的写法、构造函数和可见性修饰符的不同等,此外还有一些 Java 中没有的概念,如数据类、密封类、委托和 object 关键字等。下面从类和接口的定义开始,感受一下 Kotlin 的非凡之处吧! 类和接口的定义 类与继承和 open、final 以及 abstract 关键字 跟 ... 阅读详情

相关推荐

Kotlin 对象与 object 关键字

本文讲到的对象,并非面向对象中的“对象”,而是指 Kotlin 中用 object 关键字声明的结构,它的功能相当强大,既可用来声明单例类,也可包装数据,还能充当匿名内部类。

Java和kotlin的与,或,异或,移位运算

一基础 由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。 首先,十进制才是我们比较熟悉的,在java当中,声明int类型变量时 比如当我们声明 int a = 12; 这个时候a表示十进制的12, 如果我们要声明八进制,只要在前面加个0 int a = 012; 这个时候a表示十进制的10, 而如果我们要声明十六进制,只要在前面加个0x int a = 0x12; 这个时候a表示十进制的18 二 JAVA 1按位与& 与十进制的加减乘除不同,jav

季小心的博客 2万+

数据驱动的细胞动力学:从高通量成像到机器学习预测的完整实践指南

细胞动力学研究细胞群体随时间变化的规律和命运决策机制,是理解生命过程的基础。其核心原理在于将传统的定性观察转化为定量分析,通过高通量成像、单细胞测序等技术获取多维时序数据,并运用机器学习与统计模型挖掘数据中的深层模式。这一技术价值在于实现从“描述现象”到“预测行为”的范式转变,显著提升研究的客观性和可重复性。在应用场景上,它广泛应用于药物筛选、疾病机制研究和发育生物学等领域,能够加速靶点发现和疗效评估。本文聚焦于数据驱动的细胞动力学分析,详细拆解了从实验设计、图像处理、单细胞追踪到特征工程与建模预测的端到端

weixin_29056781的博客 268

Kotlin中的逻辑运算符

在Kotlin中,逻辑运算符用于对布尔值进行逻辑运算。Kotlin提供了三个逻辑运算符:与运算(&&)、或运算(||)和非运算(!下面对这些逻辑运算符进行详细介绍,并提供示例代码。以上是对Kotlin中逻辑运算符(与运算、或运算、非运算)的详细介绍和示例代码。使用逻辑运算符可以对布尔值进行逻辑判断和操作,帮助控制程序的流程和条件。逻辑运算符可以组合多个条件,用于控制程序的流程和逻辑。在逻辑表达式中,可以使用括号来改变运算的优先级。

一起coding,一起嗨。 2258

MFC工具栏增加EditBox和Button

1. 在资源视图中增加EditBox, Button控件,ID分别为ID_EDIT_SEED, ID_BTN_SEED 2. 在CMainFrame中增加成员变量 CMFCToolBarEditBoxButton *m_editSeed; CMFCToolBarButton *m_btnSeed; 3. 在CMainFrame::OnCreate中创建控件 m_editSeed = new CMFCToolBarEditBoxButton(ID_EDIT_SEED, GetCmdMgr()-&.

学习是为了探索这个世界的本质 803

从SVF文件到高效验证:Formality中set_svf命令的隐藏技巧与实战解析

本文深入解析Formality中set_svf命令的高级应用技巧,涵盖SVF文件生成策略、多文件加载优化及验证效率提升方法。通过-append和-ordered选项的实战应用,帮助工程师解决芯片验证中的常见问题,实现验证通过率与运行效率的双重提升。

mqtt6iot的博客 819

Kotlin语法基础,运算符

运算符计算机程序中最小的程序单位成为表达式,每个表达式都可以由两部分组成,即操作数和运算符。操作数可以是变量、常量、类、数组、方法等,甚至是其他表达式。而运算符则用于支出表达式中单个或者多个操作数参与运算的规则,表达式通过运算之后产生的值依赖于表达式中包含的运算符的优先级和结核性。Kotlin语言包含了Java语言中的所有运算符的特性,并结合C语言的优点,增加自定义运算符的逻辑。这些运算符之中,主要

北漂周的专栏(微信:stchou_zst) 3万+

SAP ERP销售应收&成本科目确定

ERP作为业财一体软件,其中最核心的就是业务与财务模块的自动集成,无需财务进行手工做账,提高工作效率的同时降低人工操作产生的误差。今天浅浅的分享一下SD模块生成会计凭证时,借贷项确定的系统配置。一般项目上借贷项、科目都有FICO提供,但是具体的集成配置是在SD这边。

weixin_43657667的博客 1569

kotlin入门

1)在class前面加“data”,会自动生成copy、tostring、hashcode、equals四个方法 2)所有的类都有父类Any,Any不是object。除了tostring、equals及hashcode没有别的方法 3)java中运算符|和&,在kotlin中使用or和and代替 4)不支持自动向上转型,需要toxxx去转换 操作符 1) ? 表示当前对象不...

weixin_42522655的博客 329

磁悬浮分子泵:起源、现状与未来趋势深度解析

摘要 磁悬浮分子泵作为高真空获取的关键设备,通过磁悬浮技术实现转子无接触高速运转,大幅提升了真空系统的性能和可靠性。本文系统梳理了分子泵从机械轴承到磁悬浮的技术演变历程,分析了当前行业格局及主要厂商产品特性,包括爱德华兹、普发真空等国际巨头的技术优势。研究进一步探讨了磁悬浮分子泵在半导体制造、科研设备等领域的核心应用,通过数学模型揭示了其性能参数关系。最后,展望了未来在智能化、节能化等方面的发展趋势,为相关领域的技术创新提供参考。 关键词:磁悬浮分子泵;高真空技术;半导体制造;科研设备;技术发展

技术工作者 691

聊一下kotlin的构造函数

聊一下kotlin的构造函数

转载和创作优秀的博客 982

Java 大视界 -- 基于 Java+Flink 构建实时电商交易风控系统实战(436)

本文介绍基于Java+Flink构建实时电商交易风控系统的实战经验。系统采用分层架构设计,包含数据采集层、实时计算层、规则引擎层、数据存储层和应用服务层,实现毫秒级风险识别与拦截。核心组件包括Flink 1.17处理交易数据流、Drools规则引擎动态匹配风险规则、Redis缓存热点数据等。文章详细提供了开发环境配置清单和Maven依赖说明,确保系统具备低延迟(≤200ms)、高吞吐(10万TPS)和高可用性(99.99%)特性。该方案已通过生产环境验证,可有效应对恶意刷单、盗刷支付等电商交易风险。

【青云交】华为云云享专家 | 阿里云开发者社区专家博主 技术圈个人影响力前 9 | 博客之星 TOP12 优快云 首位四榜(原力榜 / 作者周榜 / 领军人物 / 综合热榜)榜首,破平台纪录! 苏州地区全榜霸榜,感恩全网十多万粉丝同行! 3942

Kotlin学习篇(3)—— Kotlin的 类,对象,接口,object关键字

目录3.1 接口3.2 open,final和abstract修饰符:默认为final3.3 声明枚举类3.4 可见性修饰符3.5 内部类和嵌套类3.5.1 java和中内部类和嵌套类的区别3.5.2 密封类:定义受限的类继承结构3.6 类的构造函数3.6.1 constructor关键字和init3.6.2 使用val,var 简化初始化3.6.3 子类的主构造函数初始化父类3.7 默认的getter和setter及构造函数3.8 自定义访问器3.9 重写类的toString(),equals() ,ha

haazzz的博客 1311

一个中科大差生的8年程序员工作总结

今年终于从大菊花厂离职了,离职前收入大概60w不到吧,在某乎属于比较差的,今天终于有空写一下自己的职场故事,也算是给自己近8年的程序员工作做个总结复盘。近8年有些事情做对了,也有更多事情做错了,在这里记录一下,希望能够给后人一些帮助吧,也欢迎私信交流。文笔不好,见谅,有些细节记不清了,如果有出入,就当是我编的这个故事吧。 PS:有几个问题先在这里解释一下,评论就不一一回复了 1、关于差生,我本人在科大时确实成绩偏下,差生主要讲这一点,没其他意思。 2、因为买房是我人生中的大事,我认为需要记录和总结一下

陈小房的自我修炼 5万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Kotlin 类委托与属性委托

介绍委托模式、Kotlin的委托机制:类委托以及属性委托

weixin_42643321的博客 1325

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

《Kotlin实战》-第04章:类、对象和接口

《Kotlin实战》-第04章:类、对象和接口

crazyf2015的博客 673

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Kotlin 语言学习(4) - 数据类、类委托 及 object 关键字

一、本文概要 二、数据类和类委托 2.1 数据类:自动生成通用方法的默认实现 在平时的开发中,我们往往会使用许多的xxBean对象用作数据容器,而在定义这些对象时,一般会重写它的以下三个方法: equals:用来比较实例 hashCode:用来作为例如HashMap这种基于哈希容器的类 toString:用来为类生成按声明顺序排列的所有字段的字符串表达形式 在Kotlin中,只需...

蒙的博客 458

Android筑基——Kotlin by 关键字详解

1.前言 Kotlin 中的 by 关键字在 Java 中是没有的,这使我对它感到非常陌生。 Kotlin 中为什么要新增 by 关键字呢?by 关键字在 Kotlin 中是如何使用的? 本文会介绍 by 关键字的使用分类,具体的示例,Kotlin 内置的 by 使用,希望能够帮助到大家。 2.正文 by 关键字的使用分为两种:类委托和委托属性。 2.1 类委托 现在有一个需求,统计向一个 HashSet 尝试添加元素的尝试次数,该怎么实现? 2.1.1 使用继承方式实现 简单,继承一个 HashSet,创

willwaywang6 1万+

Kotlin专题「二十一」:委托和委托属性详解

前言:遇到困难时不要抱怨,既然改变不了过去,那么就努力改变未来。 一、概述   有一些常见的属性类型,尽管我们可以在每次需要时手动实现它们,但最好是一次性实现放入库中。比如: 延迟属性:值只在第一次访问时计算; 观察属性:监听器会得到这个属性变化的通知; 在映射中存储属性,而不是为每个属性存储单独的字段。 为了涵盖这些情况,Kotlin 支持委托属性: class School { var str: String by Delegate() } 语法是val/var <proper..

https://juejin.cn/user/1654096907477549/posts 1553

Kotlin的类委托和属性委托

Kotlin的委托分为大致分为两种形式,属性委托和类委托Kotlin委托的主要方式:委托接口和属性全是委托给类级别。

small_bird_top的博客 578

kotlin中类和属性

1、kotlin中的类 1.1 类的声明 Kotlin 中使用关键字 class 声明类 class Invoice{.......} 类声明由类名、类头(指定其类型参数、主构造函数等)以及由花括号包围的类体构成。类头与类体都是可选的; 如果一个类没有类体,可以省略花括号 class Empty 在kotlin中只有数据没有代码的类通常被称为值对象 class Person(val name...

lin_henry的博客 982

Kotlin入门系列:第三章 类、对象和接口

文章目录1 定义类继承结构1.1 kotlin中的接口 1 定义类继承结构 1.1 kotlin中的接口 kotlin接口与java8中的相似:它们可以包含抽象方法的定义以及非抽象方法的实现(与java8中的默认方法类似),但它们不能包含任何状态。 // interface关键字提供一个接口 interface Clickable { fun click() // 在java8中,接口默认...

Vincent的博客 517

Kotlin中的委托

这么说确实没错,但如果我们只是让大部分的方法实现调用辅助对象中的方法,少部分的方法实现由自己来重写,甚至加入一些自己独有的方法,那么。但是这种写法也有一定的弊端,如果接口中的待实现方法比较少还好,要是有几十甚至上百个方法的话,每个都去这样调用辅助对象中的相应方法实现,那可真是要写哭了。接口所有的方法实现中,都没有进行自己的实现,而是调用了辅助对象中相应的方法实现,这其实就是一种委托模式。另外,必须说明的是,虽然我们编写了一个自己的懒加载函数,但由于简单起见,这里只是大 致还原了。...

xingyu19911016的博客 3160

Kotlin委托的使用和原理

委托就是一种通过将实际工作交给其他对象来实现的设计模式;kotlin给我们提供了by关键词实现委托.

Eqiqi的博客 1182
上一篇: 【Kotlin学习】类、对象和接口——定义类继承结构
下一篇: 【Kotlin学习】Lambda编程——Lambda表达式和成员引用、集合的函数式API
Panic  Lin
博客等级 码龄6年 81粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值