描述“数据”的“数据” 我们知道我们的需求也就是程序是通过各种数据构建起来的,这些数据就是指类,函数,变量....等是对现实世界和需求的描述,这就是第一个数据的意思 通过类,变量,函数这些数据去描述需求程序...通过元数据描述类,变量,函数信息 什么是元编程 直接说定义:操作元数据的编程就是指元编程。 比如我们通过反射获取类,属性,方法的一些信息,进而操作他们这也叫元编程。...而java中的Method还分为构造函数和普通函数,且是单独的setget方法不是Field自带的 Java中反射需要设置可访问性,而Kotlin中的属性自带setget方法通过get可直接获取。...Kotlin的增强 和java中的反射一样使用,不同的是Kotlin中由于多了很多特性所以其元数据类型也比java中多,比如: metaclass描述类的类型kclass。...比如使用字节码工具ASM,javassist等动态生成类,还有使用KAPT注解处理器通过注解来手动输出程序到一个文件中。
// 类中声明的所有构造函数。 public val constructors: Collection> Kotlin 通过::操作符并添加类名来引用构造函数。...而 KFunctionN 的invoke()方法的形参类型和返回值类型是可以确定的,调用它的 invoke() 时编译器会帮我们做检查。 当然,也可以使用 KFunctionN 来引用类的扩展函数。...0 x var y: kotlin.String world y 扩展属性的引用 Kotlin 使用类名::属性来获取扩展属性的引用,并返回 KProperty1 类型的值。...Kotlin 使用类名::属性来获取成员属性的引用,并返回 KProperty1 类型的值。...() Java 获取类的其它描述信息,包括: // 获取类名 public String getSimpleName() // 获取完整类名 public String getName() // 判断类是不是枚举类
这只是替换空作为值或者返回事件情况的一个小语法。 Day 3:String 模板 格式化字符串?将$放在变量名的前面去表达字符串中的变量和表达式。使用 ${expression} 求表达式的值。...Day 6:属性 在 Kotlin 中,类可以具有可变和只读属性,默认情况下生成 getter 和 setter。如果需要,您也可以实现自定义的。...Day 24:具体化 具体化的概念例子:Android KTX 中的 Context.systemService() 使用泛化来通过泛型传递 “真实” 类型。...序列是迭代器的表亲,一次只能懒散地产生一个值。这在使用 map 和 fifter 时非常重要 - 它们将创建序列,而不是为每一步都复制列表! 您可以从列表中创建序列或指定下一个功能。...如果您永远不会终止一个序列,它可以是无限长的而不会耗尽内存。使用 Kotlin 中的协程您也可以使用生成器!
如何定义变量 Java 定义变量的写法: String string = "Hello"; 基本等价的 Kotlin 定义变量的写法: var string: String = "Hello"...另外,对于静态方法、变量的场景,在 Kotlin 当中建议使用包级函数。 4....如何写 Getter 和 Setter 方法 Java 的 Getter 和 Setter 是一种约定俗称,而不是语法特性,所以定义起来相对自由: public class GetterAndSetter..."Peter"; } 也就是说,如果我要想定义一个可以延迟到一定实际再使用并初始化的 final 变量,这在 Java 中是做不到的。...() } } 只有使用到 name 这个属性的时候,lazy 后面的 Lambda 才会执行,name 的值才会真正计算出来。
但是在Kotlin中,许多变量的类型都可以省略,所以在Kotlin中以关键字开始,然后是变量名,最后加上类型(也可以不加)。...和其他脚本语言一样,Kotlin允许在字符串字面量中,通过$字符放在变量名前面,引用本地变量。这个同Java中的字符串连接("Hello, " + name + "!")...如果你想在字符串中包含$符号,用println("\$x")换码,打印出$x,而不是把x翻译为一个变量的引用。...name: String, //只读属性:自动生成一个域和简单的getter var isMarried: Boolean //可写属性:一个域,getter和setter ) 接下来我们看下如何使用上面定义好的...>**小贴士:** > - 你可以在Java定义的类中使用Kotlin的属性语法。在Java类中的getter可以在Kotlin中val属性获取,getter/setter可以通过var属性获取。
Kotlin中有委托,这个C#中也有,不过对于学Java的童鞋来说,这是什么鬼啊,到底是干什么用的… 在委托模式中,当有两个对象参与处理同一个请求是,接受请求的对象将请求委托给另一个对象来处理。...两函数都需要用 operator 关键字来进行标记。 翻译规则 在每个委托属性的实现的背后,Kotlin 编译器都会生成辅助属性并委托给它。...var positiveNumber = Delegates.vetoable(0) { d, old, new -> new >= 0 } NotNull 委托 他会含有一个可空变量并会在我们设置这个属性的时候分配一个真实的值...这经常出现在像解析 JSON 或者做其他“动态”事情的应用中。 在这种情况下,你可以使用映射实例自身作为委托来实现委托属性。 class User(val map: Map<String, Any?...下面来总结一下委托使用的场景: 有多个类或属性重复使用同一段代码。
() } } 这里的关键词by出现在属性名后面,表示属性委托,即将属性的读和写委托给另一个对象,被委托的对象必须满足一定的条件: 对于 val 修饰的只读变量进行属性委托时,被委托的对象必须实现getValue...()接口,即定义如何获取变量值。...对于 var 修饰的读写变量进行属性委托时,被委托对象必须实现getValue()和setValue()接口,即定义如何读写变量值。...类会被存储到一个支持属性delegate中,委托属性的设置和取值方法的实现全权委托给代理类。...属性名将自动作用于 map 的键。 总结 Kotlin 委托分为类委托和属性委托。它们都通过关键词by来进行委托。 类委托可以用简洁的语法将类的实现委托给另一个对象,以减少模板代码。
Java的嵌套类允许访问外部类的成员,而Kotlin的嵌套类不允许访问外部类的成员。..." } } } 调用嵌套类时,得在嵌套类的类名前面添加外部类的类名,相当于把这个嵌套类作为外部类的静态对象使用。...所以,Kotlin的内部类就相当于Java的嵌套类,而Kotlin的嵌套类则是加了访问限制的内部类。...枚举变量本质上还是该类的一个实例,所以如果枚举类存在构造函数的话,枚举变量也必须调用对应的构造函数。这样做的好处是,每个枚举值不但携带唯一的名称,还可以拥有更加个性化的特征描述。...这个问题在Java中是通过模板类(也叫做泛型类)来解决的,例如常见的容器类ArrayList、HashMap均是模板类,Android开发中的异步任务AsyncTask也是模板类。
先看下如何使用: var color: Color = Color.BLUE var color2 = Color.GREEN // 比较两个枚举类型变量 var bool: Boolean = color...无论是Java还是Kotlin都提供了相应的API来获取枚举值的名字和索引。Kotlin提供了name和ordinal属性,分别用于获取枚举值名和索引。...扩展属性 扩展属性和扩展方法类似,Kotlin属性在类中必须初始化,而初始化需要使用backing field,也就是那个field字段,可以将属性设置的值保存在field中,也可以从field获得属性值...backing field字段,因此保存和获取属性值,需要使用一个类成员变量。...B的func函数,需要使用this@B.func(),而调用A类中的方法可以直接使用。
Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。...Example@433c675d 的 p 属性赋值为 Runoob Example@433c675d, 这里委托了 p 属性 标准委托 Kotlin 的标准库中已经内置了很多工厂方法来实现属性的委托。...这经常出现在像解析 JSON 或者做其他"动态"事情的应用中。 在这种情况下,你可以使用映射实例自身作为委托来实现委托属性。 class Site(val map: Map<String, Any?...provideDelegate 的一个可能的使用场景是在创建属性时(而不仅在其 getter 或 setter 中)检查属性一致性。...如果没有这种拦截属性与其委托之间的绑定的能力,为了实现相同的功能, 你必须显式传递属性名,这不是很方便: // 检查属性名称而不使用“provideDelegate”功能 class MyUI {
) joinToString(list) joinToString(list, prefix = "# ") 1.7 顶级函数和属性(静态的) 在 Java 中我们需要把函数和属性放在一个类中,在 Kotlin...中我们可以把某个函数或属性直接放到某个 Kotlin 文件中,把这样的函数或属性称之为 顶级函数或属性。...//相当于 import strings.JoinKt.* import strings.* 3)、顶级属性 同样也是 static 静态的 如果使用 var 来定义会生成对应的静态setter...、getter函数 如果使用 val 来定义只会生成对应的静态getter函数 4)、Kotlin文件名被修改怎么办?...如果所在的Kotlin文件名被修改,编译生成的类名也会被修改,可以通过注解的方式来固定编译生成的类名: @file:JvmName("StringFunctions") package stringsfun
类 Kotlin中的类定义与Java中无异,只是在Kotlin中,再也没有static所声明的静态内部类。...中类的构造函数以及属性初始化的方式有多种。...,来为成员变量赋值,并且构造函数可以重载,不过还是建议带默认值使用一个构造函数 class Child { var mName: String var mAge: Int constructor...set/get方法 通常在外部设置成员属性的时候需要有一些条件判断,或者是修改操作,我们可以在属性后定义set/get方法来进行判断与修改 其中,set/get方法中会有field来代表对应的属性,对field...方法,如果不需要修改的话,则不需要重写 访问描述符 在Kotlin中仍然具有private、protected、public的访问描述符。
委托属性 属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其托付给一个代理类,从而实现对该类的属性统一管理。...Map来存储属性值,在应用中很常见,如解析JSON或其他动态的事。...编译器在参数中提供了关于 prop 的所有必要信息:第一个参数 this 引用到外部类 C 的实例而 this::prop 是 KProperty 类型的反射对象,该对象描述 prop 自身。...provideDelegate 的一个可能的使用场景是在创建属性时(而不仅在其 getter 或 setter 中)检查属性一致性。...如果没有这种拦截属性与其委托之间的绑定的能力,为了实现相同的功能, 你必须显式传递属性名,这不是很方便: // 检查属性名称而不使用“provideDelegate”功能 class MyUI {
二进制的实质是通过两个数字“0”和“1”来描述事件。在人类的生产、生活等许多领域,我们可以通过计算机来虚拟地描述现实中存在的事件,并能通过给定的条件和参数模拟事件变化的规律。...另一种对对象的描述为:对象具有状态(数据,成员变量)、行为(操作,成员方法)和标识(成员名,内存地址)。 面向对象语言其实是对现实生活中的实物的抽象。...万事万物都是对象,对象有其行为(方法),状态(成员变量,属性)。OOP是一种编程思想,而不是针对某个语言而言的。当然,语言影响思维方式,思维依赖语言的表达,这也是辩证的来看。...Kotlin中的类和接口跟Java中对应的概念有些不同,比如接口可以包含属性声明;Kotlin的类声明,默认是final和public的。 另外,嵌套类并不是默认在内部的。...如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
1.2 变量: var age:Int = 18 val name:String = "Kotlin" val person = Person() 使用var来声明可读可写变量,使用val来声明只读变量...val可以理解为Java中的属性声明加上了final关键字(将kotlin的字节码反编译成Java一看就知道了),其实kotlin是更倾向于推荐使用val来声明变量,这是一种防御性的编码思维模式,目的是减少程序出错或者变的更加安全...在Java中使用类名+Kt后缀直接访问 PersonKt.getSomething(); // 在kotlin文件中调用更加方便,只需要导包,不需要加类名 // 但是这种方式并不有利于阅读,会和类中的函数搞混淆...() // java中调用 Person.INSTANCE.getSomething(); 其实使用object创建类的时候,默认会生成一个单例对象,当我们使用类名来直接调用的时候,其实是通过默认的单例对象进行调用的...那得问当初设计kotlin语言的人了,从面向对象的角度来说,这么设计的确更符合万物皆对象的理念,因为static只跟类有关,而不是和对象有关。
注解是把编程中的元数据信息直接写在源代码中,而不是保存在外部文件中。 在使用注解之前(甚至在使用之后),XML配置文件被广泛的应用于编程过程中的元数据的描述。...后来程序员们逐渐发现XML的维护越来越糟糕了,进而希望直接使用一些和代码紧耦合的“元数据”,而不是像 XML 那样和代码分离。...它们是:类 CLASS, 注解类 ANNOTATION_CLASS,泛型参数 TYPE_PARAMETER,函数 FUNCTION, 属性 PROPERTY, 用于描述域成员变量的 FIELD,局部变量...Kotlin中可以直接使用扩展属性 declaredFunctions 来获取这个类中声明的所有函数(对应的反射数据类型是 KFunction )。...Kotlin中的函数和属性也是头等公民,我们可以通过反射来内省属性和函数:如运行时属性名或类型,函数名或类型等。 在Kotlin中我们有两种方式来实现反射的功能。
变量和常量声明 Kotlin使用 var 和 val 关键字作为变量和常量声明,有以下几种声明方式: var 变量名: 变量类型 = 类名() 或 var 变量名: 类名()...Kotlin 类声明、定义、继承 Kotlin同样使用class来声明类,类继承符号为一个冒号“:”,基类需要在类名后面带上一对括号,如果基类构造函数带有参数,此时需要在括号中填写对应的参数。...constructor,而非像Java用的是类名 Kotlin 函数定义 Kotlin函数方法使用关键字 fun 来声明,关键字 override 表示该函数重写了父类的方法,参数声明使用[参数: 参数类型...Kotlin基本使用 新建支持Kotlin的Android工程 如果你的Android Studio还不是3.0,那么需要下载Kotlin的插件和做一些相关的配置,请自行百度。...接下来就可以愉快的使用Kotlin玩耍啦,此处我们以一个列表页面来演示。 1. 首先,在activity_main.xml中,我们添加一个列表,id命名为listView: <?
在ALGOL60中采用了以 Begin - End 为标识的程序块,使块内变量名是局部的,以避免它们与程序中块外的同名变量相冲突。在编程语言中首次提供了封装(保护)的机制。...另一种对对象的描述为:对象具有状态(数据,成员变量)、行为(操作,成员方法)和标识(成员名,内存地址)。 面向对象语言其实是对现实生活中的实物的抽象。...当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。...如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。 4.3.2 接口 接口是一种比抽象类更加抽象的“类”。接口本身代表的是一种“类型”的概念。...下一章中,我们来一起学习Kotlin的函数式编程。
//1.获取类名 public String getSimpleName() //2.获取完整类名 public String getName() //3.判断类是不是枚举类 public...Kotlin中可以使用Java中的反射,但是由于Kotlin中字节码.class对应的是KClass类,所以如果想要使用Java中的反射,需要首先获取Class的实例,在Kotlin中可以通过以下两种方式来获取...当然Kotlin中除了可以使用Java中的反射以外,还可以使用Kotlin中声明的一些方法,当然同Java中反射一样,想要使用这些方法,先要获取Kclass对象,在Kotlin中可以通过以下两种方式获取...使用Kotin中反射注意的问题 在Kotlin1.1中如果反射String,Map,List等类型时,会抛出一个built-in Kotlin Types的异常,这是因为在Kotlin1.1版本中还没有对这些类型添加支持...最后就是关于Kotlin反射的效率问题,在Java中反射大概需要几十微秒,在Kotlin就需要几百甚至上千微秒,如果是通过反射访问对象或构造属性,甚至需要上万微秒,对此,官方给出的解释是,现在还没有精力进行优化
当然Java可以直接使用public的成员变量来解决这个问题,但对于属性来说,不仅仅能读写其值,还需要对其进行二次加工,所以get/set也是必须的。...Kotlin中的属性语法,只有var/val和属性名时必须的,其他都是可选的。也就是说,Kotlin属性最简单的形式就是在类中定义一个变量(var)或常量(val),要引用属性,就像引用变量一样。...Kotlin中可以使用filed标识符当作成员变量使用,也就是通过filed读写属性值: class Class { var name: String = "js" get(...类的继承 1、如何继承 与Java不同,Kotlin类的继承需要使用冒号(:),而Java使用extends。注意,冒号后面需要调用父类的构造器。...:实现接口与继承父类类似,使用冒号(:),但后面不是调用构造方法,而是是指跟接口名;Kotlin中的接口的方法,允许包含默认方法体,对于这样的额方法,子类实现接口时不一定必须实现该方法。
领取专属 10元无门槛券
手把手带您无忧上云