小李的Kotlin学习笔记-3(面向对象编程)
前言
学习笔记主要整理自书籍《第一行代码》(第三版),是笔者为自己之后的复习准备的。分享出来希望也可以帮助到大家。
一、类的定义及实例化
1. 类的定义
示例
class Person{
var name = ""
var age = 0
fun eat(){
print(name+"在吃饭。他"+age+"岁了。")
}
}
2. 类的实例化
示例(接上文)
fun main(){
val p = Person() //类的实例化
p.name = "张三"
p.age = 19
p.eat()
}
二、继承
在Kotlin中,任何一个非抽象类默认都是不可以被继承的(相当于Java中给类声明了final关键字)。
1. 继承类
示例:定义一个Student类,使其去继承Person类,且拥有自己独有的字段。
1)使Person类可被继承
open class Person{
...
}
2)使Student类继承Person类,且拥有自己独有的字段
class Student : Person(){
var sno = ""
var grade = 0
}
在Java中继承的关键字是"extends",而在Kotlin中继承的关键字是 “:”
2. 主构造函数
1)主构造函数
每个类默认都有一个不包含函数体的主构造函数(默认无参,但可以显示的给其指明参数),例如:
class Student(val sno: String, val grade: Int) : Person(){
}
在对Student类进行实例化的时候,必须传入构造函数中要求的所有参数:
val student = Student("a123", 5)
【特殊】如要在主构造函数里面编写逻辑语句,可用init结构体
class Student(val sno: String, val grade: Int) : Person(){
init{
println("sno is" + sno)
println("grade is" + grade)
}
}
3. 含参继承
1) Person类的主构造函数里面含参
open class Person(val name: String, val age: Int){
...
}
2)含参继承
class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age){
}
在student类的主构造函数中增加name和age字段时,为了防止和父类中同名的字段产生冲突,不声明其类型(var/val)
三、多态、接口
1、定义接口
interface Study{
fun readBooks()
fun doHomework()
}
2、使用接口
class Student(name: String, age: Int) : Person(name, age), Study{
override fun readBooks(){
println(name + " is reading.")
}
override fun doHomework(){
println(name + " is doing homework.")
}
}
3、调用接口函数
fun main(){
val student = Student("Jack", 19)
doStudy(student)
}
fun doStudy(study: Study){
study.readBooks()
study.doHomework()
}
4、对接口中的函数进行默认实现
interface Study{
fun readBooks()
fun doHomework(){
println("do homework default implementation")
}
}
当一个类去实现接口时,如果接口中有已定义的函数fun1,实现时不会强制实现,甚至可删
四、函数可见性修饰符
五、数据类
创建数据类:
data class Cellphone(val brand: String, val price: Double)
说明:
当在一个类前面声明了data关键字之后,Kotlin会根据主构造函数中的参数自动生成equals(),hashcode(),toString()等方法。
六、单例类
Kotlin创建单例类
object Singleton{
fun singletonTest(){
println("singletonTest is called")
}
}
调用单例类中的函数
Singleton.singletonTest()
Java创建单例类
public class Singleton{
private static Singleton instance;
private Singleton(){}
public synchronized static Singleton getInstance(){
if (instance == null){
instance == new Singleton();
}
return instance;
}
public void singletonTest(){
System.out.println("singletonTest is called")
}
}
调用Java构建的单例类中的函数
Singleton singleton = Singleton.getInstance();
singleton.singletonTest();