代码更安全 编写更安全的代码,并在应用程序中避免 发生Nullpointerexception。...arguments. format(str, normalizeCase = true, upperCaseFirstLetter = true) 和 findViewById 说再见 在你自己的代码中避免...} } 扩展功能, 而不是用继承 扩展函数和属性使你可以轻松地扩展类的功能,而无需继承它们。调用代码是可读和自然的。...// Extend ViewGroup class with inflate function fun ViewGroup.inflate(layoutRes: Int): View { return...在将Java代码粘贴到Kotlin文件时,可以转换整个Java文件或转换一段代码片段。很稳! ? Kotlin 是开放的 与Android一样,Kotlin是Apache 2.0下的一个开源项目。
buildFeatures { dataBinding true } } 同时在插件中添加 kotlin-kapt的插件,如下: plugins { id 'com.android.application...' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' } ardf 的使用配置就完成了,点击 Sync Now同步 build.gradle...: 0 } 4.2.2 创建布局 定义一个 layoutRes用于接收 item 布局的资源 id,如下: @get:LayoutRes abstract val layoutRes...abstract val layoutRes: Int fun getItem(position: Int): T?...(@param:LayoutRes @field:LayoutRes override val layoutRes: Int) : BaseBindingAdapter<Any, ViewDataBinding
Object(java 中默认没有继承关系的类父类都是 Object),那么这里会调用 Object 的equals() 方法,如下 public boolean equals(Object obj)...3.3 关于@data和data 在了解了 @data 的行为后,会发现它和 kotlin 语言中的 data 修饰符有点像:都会自动生成一些方法,并且在继承上也有问题——前者一旦有继承关系就会踩坑,而后者修饰的类是...kotlin 为什么要这样做,二者有没有什么联系呢?...在一篇流传较广的文章 抛弃 Java 改用 Kotlin 的六个月后,我后悔了(译文) https://blog.csdn.net/csdnnews/article/details/80746096 中...kotlin 的开发者回避了这个问题,不使用父类属性并且禁止继承即可。只是 kotlin 的使用者就会发现自己定义的data 对象没法继承,不得不删掉这个关键字手写其对应的方法。
ViewStub会用初始化后的布局文件替换自己放入其父布局中(参考inflate中的replaceSelfWithView方法)。...新创建的mySubTree布局的View的id就会使用布局中定义的subTree,最后这个新创建的view的宽为120dip,高为40dip. * * * 如下方式是最标准的初始化布局View的方式:...对象会替换StubView在其父布局中的位置。...注:其实也可以也可以用动态添加的方法添加View:在java/kotlin代码中动态初始化View,然后添加到对应的viewgroup中。...(View child/View child, int index/View child, LayoutParams params);方法添加到布局中; 这样的话在布局中就不用多了个ViewStub的
、构造函数注入 和Dagger相同,Hilt也分两种注入方式,以上篇Dagger中的代码为例子,来对比两个框架的使用区别 1.gradle中配置依赖 工程gradle中导入插件: dependencies...继承至自己生成的类 下面是该例子生成的Hilt_MainActivity: public abstract class Hilt_MainActivity extends AppCompatActivity...contentLayoutId) { super(contentLayoutId); _initHiltInternal(); } // 开始注入 private void...中,也就是全局APP中,旧版本的ApplicationComponent已废弃 @InstallIn(SingletonComponent::class) @Module class NetworkModule...的作用域就简单很多了,因为它预定义了组件和子组件 ,同时又定义了这些组件对应的作用域,上面的例子中,如何保证只实例化一份?
Activity 中的 setContentView public void setContentView(@LayoutRes int layoutResID) { getWindow()....首先会创建一个 DecorView ,这是一个 继承子 FrameLayout 的View 。也就是说 Window 类中包含了一个 DecorView。...后期勘误:第二个框中:DecorView 是继承自 FrameLayout 的 最终大致的逻辑如上图 我们可以做一个测试,看一下我们分析的有没有问题: override fun onCreate(savedInstanceState...) { //...... } 复制代码 从源码中可以看到,第一种调用的是第二种,第二种调用的是第三种,根据有没有传入根布局来传入第三个参数。...接着看一下是怎样实例化 View 的 public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot
我们发现 Kotlin 中的所有代码没有以 ; 结尾。另外,在 Kotlin 中并不要求包与目录匹配。即源文件可以在文件系统中的任意位置。...class 在 Kotlin 中,class 默认是 public 的,所以平常都省略不写。 继承父类和实现接口都用 : 来表示。...method 从比较的代码中可以知道: 在 Kotlin 中默认方法的修饰符就是 public ,可以省略不写。...类型 val j = 2 Kotlin 中的 val 关键字就类似于 Java 中的 final 。...可变变量 var var i: Int = 1 i += 1 字符串模板 字符串可以包含模板表达式,即可求值的代码片段,并将其结果连接到字符串中。
在 Kotlin 中,要将一个类标记为可继承,必须得在类的声明中添加 open 关键字,对于父类中被子类覆盖的方法也要这样做。但是在 Java 中的继承是不需要使用到 open 关键字的。...例如,在下面的代码片段中,声明了一个继承于 SimpleWeeksAdapter 的类: class MonthByWeekAdapter(context: Context?..., Int?...所以之后需要手动进行 open 关键词的添加,以便让 SimpleWeeksAdapter 类可以被继承。...然而,虽然在 Java 中有相应的注解实现版本,但是自动转换过程中并没有为 Kotlin 方法声明中添加 override 修饰符。解决的办法是在所有适当的地方手动添加 override 修饰符。
Kotlin中所有的类都有一个公有的超类:Any,这是所有没有声明超类的类的默认父类。 class Example //隐式继承自Any Any!=Java.lang.Object。...默认的,Kotlin中所有的类是final的,也就是说不能继承的。 覆写方法 Kotlin总是做一些明确的事情,不像Java,Kotlin要求复写方法时需要显式的注解和重写。...如果没有open注解,比如Base的nv(),那么在子类中是不能覆写该方法的。在一个final类中(没有open注解声明),open成员是禁止的。...class Aoo2 : Aoo { override var count: Int = 0 } 覆写准则 在Kotlin中,实现继承由以下规则控制:如果类从其直接超类继承同一成员的多个实现...总结 Kotlin中的类默认是final的,如果需要子类继承,需要使用open修饰; Kotlin中的方法默认是不允许复写的,只有用open修饰时,子类才可以进行覆写,并且需要使用override进行显示标注
第4章 类与面向对象编程 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统等相关的知识。在本章节以及下一章中,我们将一起来学习Kotlin对面向对象编程以及函数式编程的支持。...当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。...在Java 8 和Kotlin中,接口可以实现一些通用的方法。 接口是抽象类的延伸,Kotlin跟Java一样,不支持同时继承多个父类,也就是说继承只能存在一个父类(单继承)。...但是接口不同,一个类可以同时实现多个接口(多组合),不管这些接口之间有没有关系。这样可以实现多重继承。...本章小结 本章我们介绍了Kotlin面向对象编程的特性: 类与构造函数、抽象类与接口、继承与组合等知识,同时介绍了Kotlin中的注解类、枚举类、数据类、嵌套类、内部类、匿名内部类、单例object对象等特性类
Java 的成员变量和它们的 get/set 方法 在 Java 中,我们把在类中声明的变量,称为为成员变量(field),函数中声明的变量称为局部变量。...在经典的 Java 设计理念中,成员变量是不建议暴露的,而当你想访问修改成员变量时,应声明其对应的 get/set 方法。...因为成员变量没有办法继承重写 ,无法声明为接口,get/set 权限无法分开控制等。使用 get/set 方法代替直接修改成员变量,更符合面向对象设计。...虽说现在 IDE 都可以帮你快速的生成这些代码,但无法摆脱代码的信息密度低,可读性差的缺点。那么有没有什么语言能够更精简的表达 get/set 的语义呢?有的。...举个例子: class DataList { var dataList: List = listOf() private set // 1 var size: Int /
可以从 Kotlin 中自然地调用现存的 Java 代码 文档上这样说, 但是在实际使用上 public class ApiException extends Exception { public..., int code) { super(throwable); this.code = code; } } 上面的ApiException 继承自 Exception...java 代码已经打包成jar,显示 kotlin 中是无法完全调用已经 实现好的java 代码?...这个问题的根本原因在于 Kotlin 自己定义了一套 Throwable,换句话说 ApiException 在 Kotlin 看来,是继承自 kotlin.Throwable 的,它当中没有 getMessage...实际上我们自己定义的类如果不继承存在 Kotlin 到 Java 映射关系的类型,几乎不会遇到类似的问题。 3. 真的没有办法通过 Kotlin 实现访问吗?
Java 视角看 Kotlin 的默认参数 Java 中是没有默认参数的,那么在 Java 中要怎样调用 Kotlin 中使用了默认参数定义的函数或者方法呢?...,Kotlin 可以用具名参数做到,Java 中就没有办法享受到了。...只有三个版本,很容易发现,对于 Kotlin 中需要具名参数才可以完成的调用情形,Java 中就没有对应的重载版本了。 6....父类多个构造器的继承问题 继承一个 Java 类,这个类的各个构造器不可用默认参数来代替(不然我们就用 @JvmOverloads 好了),例如继承 ArrayList,它的构造器有以下几个版本: public...extends E> c) public ArrayList(int initialCapacity) 这几个版本没的构造器没办法用默认参数的形式合并,我们在 Kotlin 当中继承他时,主构造器只能调用一个父构造器
这就是Kotlin面向对象编程最基本的用法了。 继承与构造函数 现在我们开始学习面向对象编程中另一个极其重要的特性,继承。 继承也是基于对现实场景所总结出来的一个概念,其实非常好理解。...这就是Kotlin不同的地方,在Kotlin中任何一个非抽象类默认都是不可以被继承的,相当于Java中给类声明了final关键字。...Kotlin给我们提供了一个init结构体,所有主构造函数中的逻辑都可以写在这里: class Student(val sno: String, val grade: Int) : Person() {...到这里为止都还挺好理解的吧,但是这和那对括号又有什么关系呢?这就牵扯到了Java继承特性中的一个规定,子类中的构造函数必须得调用父类中的构造函数,这个规定在Kotlin中也要遵守。...有的朋友可能会说,在init结构体当中去调用不就好了,这或许是一种办法,但却绝对不是一种好办法,因为绝大多数的场景我们都是不需要编写init结构体的。
Kotlin继承类 1.超类(Any) 在Kotlin中,所有的类都是继承自Any类,这是一个没有父类型的类。...一样可以使用Demo类中的属性与函数。这就是继承的好处。...,不管实现类中的函数有没有override修饰符 例如: open class Demo{ fun test(){} // 注意,这个函数没有用open修饰符修饰 } class DemoTest...// 注意,则的`final`修饰符在编辑器中是灰色的,因为Kotlin中默认的类默认是final的 那么当一个基类去继承另外一个基类时,第二个基类不想去覆盖掉第一个基类的方法时,第二个基类的该方法使用...num: Int = 10 } 重写属性中,val和var的区别 这里可以看出重写了num这个属性,并且为这个属性重写了其值为10,但是,还有一点值得我们去注意:当基类中属性的变量修饰符为val的使用
不过早在《Kotlin入门(12)类的概貌与构造》中,提到MainActivity继承自AppCompatActivity,而Kotlin对于类继承的写法是“class MainActivity : AppCompatActivity...其实也不复杂,open不控制某个对象的访问权限,只决定该对象能否繁衍开来,说白了,就是公告这个家伙有没有资格生儿育女。...于是乎,通过接口定义几个抽象方法,然后在实现该接口的具体类中重写这几个方法,从而间接实现C++多重继承的功能。...在Kotlin中定义接口需要注意以下几点: 1、接口不能定义构造函数,否则编译器会报错“An interface may not have a constructor”; 2、接口的内部方法通常要被实现它的类进行重写...的类继承与Java相比有所不同,首先Kotlin的类默认不可被继承,如需继承则要添加open声明;而Java的类默认是允许被继承的,只有添加final声明才表示不能被继承。
Kotlin是由Jetbrains设计和开发的一种语言,这种语言还在不断的进化中,最重要的是,它可以在JVM上执行。这使它成为Android应用的完美候选者。...Kotlin还提供了安全打开那些optionals listener ?.onSuccess() 的可能性,而无需检查optional有没有值,并且还提供了Elvis Operator。...函数式编程:在Kotlin中,我们找到了本地支持来处理像Streams这样的集合和数据集。...) 此代码片段将返回由aTransformation生成返回类型的元素集合。...collection.map { item -> aTransformation(item) } Type nullability:在Kotlin中,由于有对optionals的集成支持,我们的代码中应该有最小可能的
文章目录 MainActivity 继承Activity的setContentView流程 1) MainActivity 继承至 Activity 1.1) Activity#setContentView...= null); } public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot...AppCompatDelegateImpl实现类中的 setContentView @Override public void setContentView(@LayoutRes int layoutResID...= null); } public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot...LayoutInflater.inflate中参数的作用 LayoutInflater的部分源码: 1)当root不为空,attachToRoot为true,会执行一次addView 2)当root不为空
概要 源码分析 我们先来看一下Activity-setContentView方法: public void setContentView(@LayoutRes int layoutResID) {...Windows 表示一个窗口的概念,Android 中不管是Activity,dialog,还是 Toast 它们的视图都是附加在 Windows 上,因此可以称 windows 是View的直接管理者...我们接着去看 PhoneWindows 的 setContentView() @Override public void setContentView(int layoutResID) { if...() ; 而 PhoneWindows 的 setContentView() 内部会先判断当前有没有根布局 contentParent,也即就是有没有 DecorView,如果没有,执行 installDecor...() 去初始化我们的 DecorView与contentParent; 在 installDecor() 方法里面,会先判断有没有 DecorView,如果没有,先new一个出来,然后判断有没有 contentParent
1.3 带默认参数的构造函数 说到默认参数,不知道你有没有想起之前的带默认参数的函数呢?...3.1 开放性修饰符 之前我们写了好多个WildAnimal类,Java和Kotlin关于类的继承还有区别,比如Java中默认每个类都能被继承,除非加了final关键字,而Kotlin刚好相反,它默认每个类都不能被继承...,如果没戴open帽子,该类就只好打光棍了,函数没戴open帽子的话,类的孩子就没有办法修改它。...,然后在实现该接口的具体类中重写这几个方法,从而间接实现类似C++多重继承的功能。...通过一顿操作之后,总结出Kotlin的类继承与Java相比有所不同,主要体现在以下几点: (1)Kotlin的类默认不可被继承,若需继承,则要添加open声明,而Java的类默认是允许被继承的,只有添加
领取专属 10元无门槛券
手把手带您无忧上云