思维导图|kotlin 类和对象

大家好,我是青空。今天给大家带来的是kotlin的类和对象。

图片

文末可领取大厂面试题

包与导入

与java一样,class + 类名

导入

import org.example.Message // 现在 Message 可以不用限定符访问
如果出现名字冲突,可以使用 as 关键字
import org.example.Message // Message 可访问
import org.test.Message as testMessage // testMessage 代表“org.test.Message”

构造函数

可以有一个主构造函数以及一个或多个次构造函数

class Person constructor(firstName: String) { /*……*/ }

没有任何注解或者可见性修饰符

可以省略这个 constructor 关键字

主构造器
  • 不能包含任何的代码

  • 初始化的代码可以放到以 init 关键字作为前缀的初始化块

  • 在实例初始化期间

  • 按照它们出现在类体中的顺序执行

范例

class InitOrderDemo(name: String) {
    val firstProperty = "First property: $name".also(::println)
    
    init {
        println("First initializer block that prints ${name}")
    }
    
    val secondProperty = "Second property: ${name.length}".also(::println)
    
    init {
        println("Second initializer block that prints ${name.length}")
    }
}

First property: hello
First initializer block that prints hello
Second property: 5
Second initializer block that prints 5


如果构造函数有注解或可见性修饰符

constructor 关键字是必需的

class Customer public @Inject constructor(name: String) { /……/ }


范例二

注意constructor的位置

class Person constructor(firstName: String) {
init {
println(“FirstName is $firstName”)
}
}


函数的构造函数有可以➕权限

class DontCreateMe private constructor () {
}


#### 次构造函数

可以声明前缀有 constructor的次构造函数 这是option的构造函数 注意constructor的位置

class Person {
constructor(parent: Person) {
parent.children.add(this)
}
}


范例

class Constructors {
init {
println(“Init block”)
}

constructor(i: Int) {
    println("Constructor")
}

}

fun main() {
Constructors(1)
}


输出

Init block
Constructor


#### 注意

*   在 JVM 上,如果主构造函数的所有的参数都有默认值
    
*   编译器会生成 一个额外的无参构造函数
    
*   它将使用默认值
    

### 抽象类

用abstract来声明

类本身,或类中的部分成员,都可以声明

注意:无需对抽象类或抽象成员标注open注解。

open class Polygon {
open fun draw() {}
}

abstract class Rectangle : Polygon() {
override abstract fun draw()
}


### 嵌套类

跟java一样

class Outer { // 外部类
private val bar: Int = 1
class Nested { // 嵌套类
fun foo() = 2
}
}

fun main(args: Array) {
val demo = Outer.Nested().foo() // 调用格式:外部类.嵌套类.嵌套类方法/属性
println(demo) // == 2
}


看出来了吗?

这里的Outer.Nested()其实是类似于public static class

### 内部类

内部类使用 inner 关键字来表示

#### 注意

*   内部类会带有一个对外部类的对象的引用
    
*   内部类可以访问外部类成员属性和成员函数
    

范例

class Outer {
private val bar: Int = 1
var v = “成员属性”
/嵌套内部类/
inner class Inner {
fun foo() = bar // 访问外部类成员
fun innerTest() {
var o = this@Outer //获取外部类的成员变量
println(“内部类可以引用外部类的成员,例如:” + o.v)
}
}
}

fun main(args: Array) {
val demo = Outer().Inner().foo()
println(demo) // 1
val demo2 = Outer().Inner().innerTest()
println(demo2) // 内部类可以引用外部类的成员,例如:成员属性
}


*   注意这里的Outer().inner().InnerTest()
    
*   这里的内部类,必须通过 包裹它的 外部类才能访问
    
*   就相当于 public class,没有static
    

### 匿名内部类

与java一样

### 类的修饰符

#### classModifier

类属性修饰符,表示类本身特性。

*   与 java一样
    

*   abstract    // 抽象类
    
*   final       // 类不可继承,默认属性
    
*   enum        // 枚举类
    
*   annotation  // 注解类
    

*   open
    

*   // 类可继承,类默认是final的
    
*   抽象类中用到
    

open class Base {
open fun f() {}
}

abstract class Derived : Base() {
override abstract fun f()
}


#### accessModifier

*   访问权限修饰符
    
*   private    // 仅在同一个文件中可见
    
*   protected  // 同一个文件中或子类可见
    
*   public     // 所有调用的地方都可见
    
*   internal   // 同一个模块中可见
    

范例

internal val baz = 6 // 相同模块内可见


最近又赶上跳槽的高峰期,好多粉丝,都问我有没有最新大厂面试题,我连日加班好多天,终于整理好了,1000+ 道,20多份大厂面试题大全,我会持续更新中!公众号「蚂蚁原图」回复【面试题】即可获取。

![图片](https://img-blog.csdnimg.cn/img_convert/800946d41f1afee565a428a664afa442.png)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值