Kotlin的类(成员方法、成员变量)

本文介绍了 Kotlin 中类的定义及使用,包括成员变量、成员方法等关键概念,并对比了 Java 的实现方式,展示了 Kotlin 在类成员方面简洁而强大的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、首先看一个简单类和方法的实现

package net.println.kotlin.chapters

/**
 * @author:wangdong
 * @description:
 */
/**定义一个女生类*/
class girl(var character: String, var appearance: String, var age: Int){

    fun sing(songName: String){
        //具体实现
        println("正在唱歌:$songName")
    }

    fun dance(danceName: String){
        //具体实现
        println("正在跳舞:$danceName")
    }
}

fun main(args: Array<String>) {
    val linda = girl("温柔","漂亮",18)
    linda.sing("北京欢迎你")
    linda.dance("天鹅湖")
}

二、类和成员变量、成员方法
先看一下Java中的类和成员变量、方法

package net.println.kotlin.chapters;

/**
 * @author:wangdong
 * @description: Java中的类与成员变量
 */
public class JavaPerson {

    private String name;

    private Integer age;

    //java中没有初始化就是null
    private String school;


    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }
    //如果只允许它的子类才能设置,需要将public改为protected
    protected void setName(String name) {
        this.name = name;
    }
}

再看一下Kotlin中的类和成员变量

package net.println.kotlin.chapters

/**
 * @author:wangdong
 * @description:kotlin中的类和成员变量
 */

class Girl{

    var age = 18
    get() {
        println("我今年 $age 岁")
        return field
    }

    //加protected只允许子类设置
    protected set(value) {
        println("我今年 $value 岁")
    }
}

三、kontlin的类相关成员变量、方法的实例

package net.println.kotlin.chapters

/**
 * @author:wangdong
 * @description:kotlin中的类和成员变量
 */

/**类成员*/
/**
 * 属性:或者说成员变量,类范围内的变量
 * 方法:或者说成员函数,类范围内的函数
 */

/**函数和方法的区别*/
/**
 * 函数强调功能本身,不考虑从属
 * 方法的称呼通常是从类的本身角度出发的
 */

/**定义方法*/
/**
 * class Hello{
 *   fun sayHello(name: String) = println("Hello,$name")
 * }
 */

/**定义属性*/
/**
 * 在构造方法参数中 var和val修饰的都是属性
 * 类内部也可以定义属性
 *
 * class Hello(val aField: Int,bField: Int){
 *       var anotherField: Float = 3f
 * }
 */

/**属性访问控制*/
/**
 * val a: Int = 0
 * get() = field
 * 不能定义set,因为val是不可变的
 *
 * var b: Float = of
 * set(value){
 *   field = value
 * }
 */

/**属性的初始化步骤*/
/**
 * 属性的初始化,尽量在构造方法中完成
 * 无法在构造方法中进行初始化,尝试降级为局部变量
 * var 用lateinit延迟初始化,val用lazy延迟
 * 可空类型,不建议使用null
 */
/**
 * class Hello
 */
class X

class Girl{

    var b = 0
    //延迟初始化lateinit,只能放在var中
    lateinit var c: String
    lateinit var d: X
    val e: X by lazy {
        println("init X")
        X()
    }

    var cc: String? = null
}

fun main(args: Array<String>) {
    println("开始")
    val a = Girl()
    println("初始化")
    println(a.b)
    println(a.e)

    //延迟初始化,用的时候没有初始化访问会报错
    //kotlin.UninitializedPropertyAccessException: lateinit property c has not been initialized
    //println(a.c)
    //初始化后就不会报错了
    a.d = X()
    println(a.d)

    //输出null
    println(a.cc)

    //用的时候编译器就不允许了,a.cc.xxx后面为灰色不能使用
    //println(a.cc.)
}
### Kotlin 构造方法初始化变量Kotlin 中,可以通过主构造函数次构造函数来实现变量的初始化。以下是关于这两种方式的具体说明以及示例。 #### 主构造函数初始化 主构造函数是头部的一部分,在声明的同时即可完成属性的初始化。如果需要对传入的参数进一步处理,则可以在 `init` 块中进行逻辑操作[^2]。 ```kotlin class Person(val name: String, val age: Int) fun main() { val person = Person("Alice", 25) println("${person.name}, ${person.age}") } ``` 在此示例中,`Person` 通过主构造函数接收两个参数并将其直接作为的属性。这种方式简洁明了,适用于不需要复杂初始化逻辑的情况[^3]。 #### 次构造函数初始化 当需要多个不同的初始化路径或者更复杂的初始化过程时,可以使用次构造函数。次构造函数必须显式调用主构造函数或其他次构造函数以完成对象创建[^2]。 ```kotlin class Employee private constructor( var id: Int, var department: String ) { constructor(id: Int) : this(id, "Default Department") {} init { require(department.isNotEmpty()) { "Department cannot be empty." } } fun displayInfo() { println("Employee ID: $id, Department: $department") } } fun main() { val employee1 = Employee(101) employee1.displayInfo() val employee2 = Employee(102, "HR") employee2.displayInfo() } ``` 在这个例子中展示了两种创建 `Employee` 对象的方式:一种只提供员工编号,默认分配到某个部门;另一种则允许指定具体所属部门。注意这里还加入了校验逻辑确保数据有效性[^2]。 #### 结合临时变量成员属性 有时为了提高代码可读性灵活性,会先定义一些仅用于赋值操作而不对外暴露的临时变量[^3]。 ```kotlin class Student(_firstName: String, _lastName: String, _grade: Double) { val firstName = _firstName.capitalize() val lastName = _lastName.capitalize() val gradeFormatted = String.format("%.2f", _grade) override fun toString(): String { return "$firstName $lastName has a grade of $gradeFormatted" } } fun main() { val student = Student("john", "doe", 97.8) println(student) } ``` 此片段里 `_firstName`, `_lastName`, `_grade` 都只是用来帮助构建最终公开使用的标准化版本的数据[^3]。 ### 总结 以上介绍了三种不同场景下的构造器应用模式——简单直接型、多重入口型还有加工转换型。每种都有其适用场合,请依据实际需求选取最合适的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值