单例类特点 : ① 私有静态化单例成员变量 ; ② 私有化构造函数 ; ③ 公共静态获取单例方法 ; 详细的 Java 与 Kotlin 单例示例详细看下面的四个示例 II ....私有化构造函数 private Student(){} // 3 ....私有化构造函数 private Student(){} // 3 ....私有化构造函数 */ class Student private constructor() { /** * 伴生对象 */ companion object {...单例调用 : 可以直接使用类调用伴生对象的方法 , 上述定义的 Student 类 及伴生对象 , Student 与 Student.Companion 是等价的 ; 因此测试时 , 下面的两个方法都是调用伴生对象的方法
ASDFASDF */ 被委托的类应该实现一个getValue和setValue方法,委托方的变量不再存储值,而是由被委托的类提供存储功能。...泛型用于支持全部类型的值。 伴生对象 Java中经常会使用静态工厂方法来构造对象,这是因为静态工厂方法比构造器更加适用于处理那些很多属性可以不在构造时提供的类。静态工厂方法更加具有可读性。...Kotlin根本没有静态这一说,Kotlin代替静态的办法一个是object,一个是顶层函数。但这俩都不适用于静态工厂,因为静态工厂经常要访问类中的私有成员。 伴生对象是用来干这些的。...fun fromJson(json: String): Person{ ... } } } fun main(){ Person.Loader.fromJson() } 伴生对象也可以有扩展函数...,这是因为像上面的Loader这种伴生对象和类中的逻辑关系不大,分离到外部可以实现关注点分离。
地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 公有继承 " 的 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 的 完整功能 , 使用 基类 可以解决的问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...); } 2、使用 子类对象 为 父类对象 进行初始化 定义父类对象 , 可以直接使用 子类对象 进行初始化操作 ; // II.
私有构造函数 通过静态字段对外提供实例 静态代码块中直接初始化,线程安全 。 这里插播一个问题,static 代码块在何时执行?...下面来看看 伴生对象 。 伴生对象 你可以回想一下,你在 Kotlin 中使用过 static 关键字吗?答案肯定是没有。...通常我们可以在顶层文件中直接定义常量和顶层函数,但有的时候我们的确需要在类中定义静态常量或函数,这样显得更加直观。这就是 伴生对象 的应用场景。...再回想一下前面说过的, object 其实我们可以把它理解成 定义一个类并创建一个实例 。 伴生对象仍旧符合这一语义。 在 Java 中如何调用伴生对象呢?...伴生对象扩展方法 伴生对象也是支持扩展方法的。还是以上面的 Car 为例,定义一个根据汽车品牌获取汽车类型的扩展方法。
EJ 第1条:考虑使用静态工厂方法代替构造器 在实例化对象的方式中,使用静态工厂方法相比构造器有几个好处: 工厂方法拥有名字,易于开发者理解。...Kotlin 并没有 static 关键字,也没有静态成员的概念,取而代之的是『伴生对象』,因此,对于第一条准则,Kotlin 使用伴生对象关键字 companion 来定义静态工厂方法,代码风格如下:...Kotlin 新增了顶层声明的类别(顶层函数和顶层属性,无需放在类中的属性和方法)。...public 修饰的成员属性(即准则中的公有域),《Effective Java》 不建议这么用,取而代之的是将成员属性定义成私有的,并且提供 public 修饰的 set 和 get 方法。...高阶函数 关于高阶函数的定义,参考《Kotlin 实战》: 高阶函数就是以另一个函数作为参数或返回值的函数 如果用 lamba 来作为高价函数的参数(此时为形参),就必须先了解如何声明一个函数的形参类型
什么是 extension(扩展)函数 ---- Kotlin 可以对一个类的属性和方法进行扩展,对被扩展的类代码本身不会造成任何影响。...伴生对象的总结 ---- 类似于 Java 中使用类访问静态成员的语法。因为 Kotlin 取消了 static 关键字,所以 Kotlin 引入伴生对象来弥补没有静态成员的不足。...可以使用 @JvmField 和 @JvmStatic 类似于 Java 中调用静态属性和静态方法; 伴生对象可以扩展属性和扩展方法。...8. init 代码块和构造方法以及伴生对象中代码的调用时机 ---- 创建 Person 类,创建 person 对象打印方法调用时机: class Person { private var...首先伴生对象中的代码是在类加载时就会执行。init代码块中的方法会按顺序放在主构造函数中,主构造函数中原来的代码会在后面执行。 9. const 和 val 有什么区别?
前言 本章将讲解一些管对对象和基础编程的知识。如:类,接口,抽象类,数据类,扩展方法等 接口 其实这部分的设计思路和Java基本一致。...} 伴生对象与静态成员 kotlin 中时没有static 这种方法修饰的静态方法 所以要实现 类似于java中的静态属性就要用到伴生对象 例子: fun main(args: Array<String...(Latitude.TAG) } /** * 私有的构造方法 companion伴生对象关键字 */ class Latitude private constructor(val latitude...伴生对象的成员全局独一份 伴生对象的成员类似Java的静态成员 静态成员考虑用包级函数、变量替代 JvmField 和JvmStatic使用后,可以用相同的语法在Java中调用 方法重载 与Java相同...不传参数用默认值 这个方法java要调用 需要加上 @JvmOverloads否则必须传参数 扩展方法 为现有类添加方法、属性: fun X.y):Z{..} val X.m 注意扩展属性不能初始化
,我们 Kotlin 程序员也可以不 new 就有对象了?。 Kotlin 的构造函数分为主构造函数和次构造函数。主构造函数是和类名称一起写在类头部,次构造函数是写在类体里面的。...伴生对象的成员可通过只使用类名作为限定符来调用,伴生对象的成员看起来像 Java 的静态成员,在运行时他们仍然是真实对象的实例成员。...在 JVM 平台,如果使用 @JvmStatic 注解,你可以将伴生对象的成员生成为真正的静态方法和字段。 不过你们的类方法还可以被子类重写,这个在 Java 里也不行。...伴生对象的成员可通过只使用类名作为限定符来调用,伴生对象的成员看起来像 Java 的静态成员,在运行时他们仍然是真实对象的实例成员。...在 JVM 平台,如果使用 @JvmStatic 注解,你可以将伴生对象的成员生成为真正的 静态方法和字段。更详细信息请参见Java 互操作性一节。
与Java一样,Kotlin在运行时不保留泛型,也就是对象不携带传递到它们的构造器中的类型参数的实际类型,即ArrayList()和ArrayList()是不能区分的。...包级函数 例如,在org.foo.bar 包内的 example.kt 文件中声明的所有的函数和属性,包括扩展函数, 该 类会编译成一个名为 org.foo.bar.ExampleKt 的 Java 类的静态方法...静态字段 在命名对象或伴生对象时,声明的 Kotlin 属性会在该命名对象或包含伴生对象的类中包含静态幕后字段。通常这些字段是私有的,但可以通过以下方式之一暴露出来。...如果对这些函数使用@JvmStatic进行标注,那么Kotlin还可以为在命名对象或伴生对象中定义的函数生成静态方法。..., 使其 getter 和 setter 方法在该对象或包含该伴生对象的类中是静态成员。
本章内容包括: 类和接口 非默认属性和构造方法 数据类 类委托 使用 object 关键字 1、定义类继承结构 /*--------------- 4.1.1 kotlin 中的接口...* Java 的类和方法默认是open的,而 Kotlin 中默认都是final的。 * 如果你想允许创建一个类的子类,需要使用 open 修饰符来标识这个类。...this关键字调用自己的另一个构造方法 class MyButton1 : View { // 委托给这个类的另一个构造方法 constructor...初始化语句块和从构造方法为初始化类实例提供了灵活性 使用 field 标识符在访问器方法体中引用属性的支持字段 数据类提供了编译器生成的 equals hashCode toString copy 和其他方法...伴生对象(与包级别函数和属性 起)替代了 Java 静态方法和字段定义 伴生对象与其他对象一样,可以实现接口,也可以拥有有扩展函数和属性 对象表达式是 Kotlin 中针对 Java 匿名内部类的替代品
Kotlin 解决了一些 Java 中的问题: Kotlin 通过以下措施修复了 Java 中一系列长期困扰我们的问题 空引用由类型系统控制。...无原始类型 Kotlin 中数组是不型变的 相对于 Java 的 SAM-转换,Kotlin 有更合适的函数类型 没有通配符的使用处型变 Kotlin 没有受检异常 Java 有而 Kotlin 没有的东西...受检异常 不是类的原生类型 静态成员 非私有化字段 通配符类型 Kotlin 有而 Java 没有的东西 Lambda 表达式 + 内联函数 = 高性能自定义控制结构 扩展函数 空安全 智能类型转换...字符串模板 属性 主构造函数 一等公民的委托 变量和属性类型的类型推断 单例 声明处型变 & 类型投影 区间表达式 操作符重载 伴生对象 数据类 分离用于只读和可变集合的接口 协程
7.9.2 object对象 Kotlin中没有 静态属性和方法,但是也提供了实现类似于单例的功能,我们可以使用关键字 object 声明一个object对象: object AdminUser {...,匿名对象只可以用在本地和私有作用域中声明的类型。...fun create(): ClassB = ClassB() fun get() = "Hi, I am CompanyB" } } 我们可以直接像在Java静态类中使用静态方法一样使用一个类的伴生对象的函数...另外,如果想使用Java中的静态成员和静态方法的话,我们可以用: @JvmField注解:生成与该属性相同的静态字段 @JvmStatic注解:在单例对象和伴生对象中生成对应的静态方法 7.10 sealed...PO类:Persisent Object,持久对象。它们是由一组属性和属性的get和set方法组成。PO是在持久层所使用,用来封装原始数据。
例如: 当然,也可以直接在声明类的时候指定构造函数,对象实例化可以不写new关键字。...调用上面集合的方式如下: 6,伴生对象 Kotlin中没有静态属性和方法,如果我们要创建单列,可以使用Object关键字声明类。...如果要在一个类里面声明静态成员,可以在类的内部使用伴生对象,伴生对象使用关键字companion object。...伴生对象的调用跟Java一样,通过类名.属性名称或函数名称调用。 新特性 1,空安全 在Kotlin中,对象声明分为可空引用和非空引用两种。...枚举类扩展 6.2 扩展 6.2.1 扩展的动机 6.2.2 扩展原生函数 6.2.3 静态解析 6.2.4 扩展属性 6.2.5 扩展伴生对象 6.2.6 扩展的作用域 6.2.7 类中声明扩展 6.3
因此不允许将对象表达式定义成抽象类。 对象表达式不能定义构造器。但对象表达式可以定义初始化块,可以通过初始化块来完成构造器需要完成的事情。 对象表达式可以包含内部类,不能包含嵌套类。...对象声明不能定义在函数和方法内;但对象表达式可嵌套在其他对象声明或非内部类中。...四、伴生对象的扩展 伴生对象也可以被扩展。如果一个类具有伴生对象,则Kotlin允许为伴生对象扩展方法和属性。..." fun main(args: Array<String ) { //使用伴生对象所在的类调用伴生对象的方法 MyClass.output("Kotlin必须学") println(MyClass.name...为伴生对象扩展的方法 为伴生对象扩展的属性 以上就是本文的全部内容,希望对大家的学习有所帮助。
⑤ NoArg和AllOpen 数据类本身属性没有默认的无参数的构造方法,因此Kotlin提供一个NoArg插件,支持JPA注解,如@Entity。...与Java一样,Kotlin在运行时不保留泛型,也就是对象不携带传递到它们的构造器中的类型参数的实际类型,即ArrayList()和ArrayList()是不能区分的...④ 静态方法 Kotlin将包级函数表示为静态方法。如果对这些函数使用@JvmStatic进行标注,那么Kotlin还可以为在命名对象或伴生对象中定义的函数生成静态方法。...如果使用该注解,那么编译器既会在相应对象的类中生成静态方法,也会在对象自身中生成实例方法。...,使其getter和setter方法在该对象或包含该伴生对象的类中是静态成员。
Anko Anko是一个扩展库,提供了很多的扩展方法,可以写布局、数据库、和activity跳转toast等的通用方法。真的超级方便!...设计模式 java写项目的时候我们使用MVP模式会使用RxJava,那么Kotlin也有对应的RxKotlin,同样可以使用MVP模式进行开发 单例 Kotlin中单例可以采用如下方式 //私有构造 class...Test private constructor(){ //伴生对象 companion object{ //by lazy 是线程安全的 val instance...:Test by lazy { Test() } } } 自定义View Java中代码里自定义View需要继承控件类并实现构造方法,在Kotlin中可以使用@JvmOverLoads constructor...,IDE会自动帮我们实现好构造 好了,这是我最近对Kotlin学习的一点总结,抽空看看写一个小项目,加油(ง •_•)ง
上一篇文章介绍了类的简单定义及其构造方式,当时为了方便观察演示结果,在示例代码的构造函数中直接调用toast提示方法,但实际开发是不能这么干的。...有鉴于此,本篇文章就来谈谈Kotlin如何声明成员属性和成员方法,以及外部如何访问类成员。...} 在类内部定义成员方法,就是前几篇文章提到的定义普通函数,具体参见《Kotlin入门(9)函数的基本用法》和《Kotlin入门(10)七十二变的输入参数》,这里不再赘述。...总结一下,Kotlin的类成员分为实例成员与静态成员两种,实例成员包括普通成员属性和成员方法,其中与入参同名的成员属性可以在构造函数中直接声明,外部必须通过类的实例才能调用实例成员。...静态成员包括静态常量与静态方法,它们都在类的伴生对象中定义,外部可以通过类名直接使用静态成员。 点此查看Kotlin入门教程的完整目录
) 在Kotlin中使用对象表达式和对象声明进行表示 对象表达式(匿名类) 匿名类其实就是在Java中的匿名内部类。...只能做为私有函数的返回值。...这里需要注意的是: 在 JVM 平台,只有使用 @JvmStatic 注解,才能将伴生对象的成员生成为真正的静态方法和字段。...@JvmStatic 注解,你可以将伴生对象的成员生成为真正的静态方法和字段。...//@JvmStatic 注解也可以应用于对象或伴生对象的属性, 使其 getter 和 setter 方法在该对象或包含该伴生对象的类中是静态成员。
例如 Java 中是 String 类型的对象,要在 Kotlin 中使用的话,需要用 String? 类型来接收。 4. Kotlin 没有静态变量和静态方法。...扩展函数 kotlin 支持给原有的类添加一些扩展的功能,就是通过扩展函数来实现的。可以针对第三方库中对象添加一些我们需要的方法。...Animal) { // 父类扩展函数 printName,调用的是父类对象的 name 函数 println(animal.name()) } fun main(args: Array...知识点1:函数默认的返回值为一个 Unit 类型的对象,可以不写。...Kotlin 类的构造函数会默认调用 init 方法,所以可以在 init 方法中执行一些初始化的操作: class TestView: View { constructor(context:
,Java可以通过覆写带不同参数的构造函数来实现,那么Kotlin已经在类名后面指明了固定数量的入参,又该如何表示拥有其他参数的构造函数呢?...(2)初始化函数中的属性字段赋值,为了区别同名的属性和入参,特意给属性字段添加了this。 那么Kotlin如何精简这个类的代码呢?...有四种结果,我只放两个图 2.4 静态属性 之前我们的伴生对象可以实现静态函数,同样也能实现静态属性,只要在伴生对象内部增加几个字段定义就行了,之前是用0和1表示动物的雄雌,接下来用整型常量MALE表示雄性的...Kotlin的类成员分为实例成员与静态成员,实例成员包括成员属性和成员方法,其中与入参同名的成员属性可以在构造函数中直接声明,外部必须通过类的实例才能访问类的成员属性和成员方法,类的静态成员包括静态属性与静态方法...抽象方法没有具体的函数体,故而外部无法直接声明抽象类的实例,只有在子类继承时重写方法,方可使用该子类正常声明对象实例。
领取专属 10元无门槛券
手把手带您无忧上云