面试题答案
一键面试定义方式
- 主构造函数:
- 主构造函数是类头的一部分,紧跟在类名之后。它可以有参数,也可以没有参数。如果主构造函数没有任何注解或者可见性修饰符,可以省略
constructor
关键字。 - 示例:
- 主构造函数是类头的一部分,紧跟在类名之后。它可以有参数,也可以没有参数。如果主构造函数没有任何注解或者可见性修饰符,可以省略
class Person(val name: String, var age: Int) {
// 类体
}
这里(val name: String, var age: Int)
就是主构造函数的参数列表,val
和var
表示参数会自动声明为属性。
- 次构造函数:
- 次构造函数使用
constructor
关键字在类体中定义。 - 示例:
- 次构造函数使用
class Person {
var name: String
var age: Int
constructor(name: String, age: Int) {
this.name = name
this.age = age
}
}
这里定义了一个次构造函数constructor(name: String, age: Int)
。
初始化时机
- 主构造函数:
- 主构造函数的初始化逻辑在初始化块(
init
块)中执行。init
块会在类实例化时,在属性初始化之后立即执行。 - 示例:
- 主构造函数的初始化逻辑在初始化块(
class Person(val name: String, var age: Int) {
init {
println("Initializing Person with name $name and age $age")
}
}
当创建Person
实例时,init
块中的代码会执行。
- 次构造函数:
- 次构造函数必须直接或间接调用主构造函数。在调用主构造函数之后,才会执行次构造函数自身的代码。
- 示例:
class Person(val name: String, var age: Int) {
constructor(name: String) : this(name, 0) {
println("Initializing Person with only name $name, age set to 0")
}
}
这里的次构造函数constructor(name: String)
先调用了主构造函数this(name, 0)
,然后执行自身的打印逻辑。
参数使用
- 主构造函数:
- 主构造函数的参数可以直接声明为属性(使用
val
或var
),这些属性在整个类中都可以直接访问。 - 示例:
- 主构造函数的参数可以直接声明为属性(使用
class Person(val name: String, var age: Int) {
fun introduce() {
println("Hi, I'm $name and I'm $age years old.")
}
}
这里name
和age
在introduce
函数中可以直接使用。
- 次构造函数:
- 次构造函数的参数不会自动成为属性。如果需要使用这些参数,要么将其赋值给类中已声明的属性,要么在次构造函数内部使用。
- 示例:
class Person {
var name: String
var age: Int
constructor(name: String, age: Int) {
this.name = name
this.age = age
}
fun introduce() {
println("Hi, I'm $name and I'm $age years old.")
}
}
这里次构造函数的参数name
和age
需要手动赋值给类的属性才能在其他函数中使用。