学习kotlin第七天_类与继承、属性与字段
来源:互联网 发布:ktv手机点歌软件 编辑:程序博客网 时间:2024/05/17 16:53
不行,按这个速度,等我学完黄花菜都凉了,我记得当初培训的时候一个周就搞定了java,这类似的语言不能耽搁太久呀。
坑1、类声明由类名、类头和花括号组成
classPersonconstructor(firstName: String) {
}
坑2、如果主构造函数没有注解和可见性修饰符,可以省略constructor关键字,如果没有类体,可以省略花括号
坑3、主构造函数中不包含任何代码,用init关键字声明一段代码块用于初始化。init代码块位于类体中,主构造参数可以给init代码块使用,也可以给类体中声明属性初始化时使用。
坑4、次构造函数也用constructor声明。
classPerson {
constructor(parent: Person) {
parent.children.add(this)
}
}
次构造函数如果需要委托给同一个类的另一个构造函数,可以通过this实现。
classPerson(valname: String) {
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
哪位亲能帮我解释一下啥子叫委托?谢谢!
坑5、非抽象类在没声明构造函数的情况下会生成一个无参可见构造函数。如果不希望它存在,可声明一个私有的主构造函数。
classDontCreateMeprivate constructor(){
}
坑6、创建类的实例只需要直接调用构造函数即可,没有new关键字。
valinvoice= Invoice()
valcustomer= Customer("hello")
坑7、和java类似,kotlin的类中可以包括构造函数、初始化模块、函数、属性、嵌套类和内部类、对象声明。
我理解的嵌套类和内部类的区别就是嵌套类不能访问“外部类”成员。对象声明使用object关键字,类似于变量声明,它不是一个表达式,不能在赋值语句的右边。对象声明不能在函数中。(先混个脸熟,后面再详细了解...真不明白这文档是按什么顺序编的)
坑8、kotlin中有一个共同的超类Any。Any和java中的object不能划等号,Any类中除了equals 、hashCode、toString没有任何成员,如果需要用到java.lang.Object的其它成员,得用到扩展函数。
坑9、类的继承的声明使用“:”并且可以按需要传入参数。
open classBase(p: Int)
classDerived(p: Int) : Base(p)
open关键字表示允许其它类从该类继承。
如果没有主构造函数,每个次构造函数都必须使用super关键字进行初始化
open classBase {
constructor(i: Int)
constructor(i: Int, s: String)
}
classMyView : Base {
constructor(i: Int) : super(i)
constructor(i: Int, s: String) : super(i, s)
}
坑10、如果父类的函数未标注open,该函数不能被继承,子类从父类继承的方法必须用override标注,否则报错
‘v' hides member of supertype 'Base' and needs 'override' modifie
可通过super关键字调用父类方法。若子类为open类型,可用final关键字防止该方法被“孙子类”重写。
open classBase {
open fun v() {
println("base_v")
}
funnv() {
println("nv")
}
}
open classDerived(): Base() {
final override fun v() {
super.nv()
println("Derived_v")
}
}
funmain(args: Array<String>) {
valdev = Derived();
dev.v()
}
坑11、属性覆盖和函数的覆盖类似,必须以override开头,可以由具有初始化的或者具有getter方法的属性覆盖。var类型可以覆盖val类型。
open classFoo {
open val x: Int get() {
return5
}
}
classBar1 : Foo() {
override var x: Int =3
}
坑12、super<父类名或接口名>可用于区分该方法继承自哪个类或接口。若不指定则报错
Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super<Foo>’
open classA {
open fun f() {print("A") }
funa() {print("a") }
}
interfaceB {
funf() {print("B") } // 接口成员默认就是“open”的
funb() {print("b") }
}
classC(): A(), B {
// 编译器要求覆盖 f():
override fun f() {
super<A>.f()// 调用 A.f()
super<B>.f()// 调用 B.f()
}
}
坑13、抽象类用abstract声明,抽象成员只在本类中声明而不实现。抽象类和抽象方法默认为open。此外抽象成员可以覆盖非抽象开放成员。
open classBase {
open fun f() {
}
}
abstract classDerived : Base() {
override abstract fun f()
}
坑14、kotlin中没有静态方法,推荐使用包级函数,也可以声明一个伴生对象,然后使用类名作为限定符进行调用。。。啥子是包级函数嘛?。。。啥子是伴生对象嘛?。。。
坑15、之前学了kotlin局部变量可以先声明再赋值,但类属性必须赋值,可根据需要声明为var类型或val类型。类似java,kotlin类属性的调用通过“类对象.属性名”调用。
classAddress {
valname: String = "China"
varcity: String = "GuiYang"
}
funmain(args: Array<String>) {
valaddress = Address();
println(address.name)
println(address.city)
}
坑16、声明属性时,如果类型可以通过初始器或者getter返回值推断,那么可以省略,如val name = "China"。val只读类型没有setter。
vallist=listOf(0,1,2)
valisThreeget() = com.tshouyi.hellokotlin.list.size==3// 具有类型 Boolean
坑17、改变访问器的可见性或者对其注解,不需要改变实现则不定义其实现。
varsetterVisibility: String = "abc"
private set // 此 setter 是私有的并且有默认实现
varsetterWithAnnotation: Any? = null
@Injectset// 用 Inject 注解此 setter。Inject.jar自己去下载。
每天都在不断的吐槽这文档有多么坑,但又舍不得放弃,这不,又遇上了连坑...我都没法用自己的话复述接下来这几个概念,幕后字段?幕后属性?编译期常量?惰性初始化属性?覆盖属性?委托属性?。。。只能反复读三遍这一段文档混个脸熟。遇到这一串坑,没心情了。
- 学习kotlin第七天_类与继承、属性与字段
- Kotlin 类与继承
- Kotlin属性和字段与基本语法
- Scala学习第七天 Scala类的属性和对象私有字段实战详解
- Kotlin基础教程-类与继承
- kotlin的类与继承
- Kotlin学习(七): 类和继承、接口与实现
- 学习kotlin第14天_区间、类型检查与转换、this表达式、相等性
- JAVA基础第七天学习日记_继承、重写、final关键字、抽象、接口
- java学习第七天之继承
- Android开发,Kotlin的了解与学习(六)-----类与继承
- 字段名与实体类属性不匹配([尚硅谷]_张晓飞_Mybatis 学习笔记二)
- java面向对象3继承_第七天
- Kotlin学习(三): 属性和字段
- Kotlin 学习之属性和字段
- #kotlin学习笔记#kotlin的安装与第一行Kotlin代码
- Kotlin学习记录(二)—— Kotlin的变量、属性、类、构造函数、继承、方法
- 学习kotlin第13天_具体化的类型参数、内联属性、解构声明、集合
- Spring Boot下如何自定义Repository中的DAO方法
- Jquery设置select控件指定text的值为选中项
- MySQL5.7安装步骤
- NSNotificationCenter 的使用详解
- linux proc maps文件分析
- 学习kotlin第七天_类与继承、属性与字段
- ByteBufferMessageSet分析
- Laravel 5 程序优化技巧
- C++ 差集
- 各种导航
- 一次关于loback日志无法输出到文件的问题解决
- jquery无限加载
- react native AppState 使用详解
- Linux与生物信息(第一章——Linux常用命令3)