大家好,我是青空。今天给大家带来的是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)