【Kotlin 初学者】类和对象-类的修饰符

简介: 1.1 前言 Kotlin 是一门面向对象的开发语言。也有着面向对象语言的特性。而面向对象的三大特性即封装、继承、多态,这是每一门面向对象语言都具有的特性。


一、类和对象


1.1 前言


      Kotlin 是一门面向对象的开发语言。也有着面向对象语言的特性。而面向对象的三大特性即封装、继承、多态,这是每一门面向对象语言都具有的特性。


1.2 定义类


       使用 Kotlin 创建第一个类,咱描述的详细一点。


Kotlin 类可以包含:


  • 构造函数和初始化代码块


  • 函数(方法)


  • 属性(字段)


  • 嵌套类(内部类)


  • 对象声明。


       Kotlin 中使用关键字 class 声明类,后面紧跟类名。


1.2.1 创建类


微信图片_20220524200901.png


选择2:会直接创建一个.class的类

       选择3:可以自己在文件中创建一个类


class User{
    //大括号内是类体构成
}


这是一个空的类实现,跟Java一样都是使用class关键字来声明一个类(类名:User)。


1.2.2 添加属性和函数


class User{
    var name = ""
    var age = 0
    fun info(){
        println("$name 今年已经$age 岁了")
    }
}


 使用 var 关键字添加属性。如果使用 val 关键字,那么初始化之后就不能重新赋值了。同时,Kotlin自动生成了setter/getter函数。如下:


微信图片_20220524201010.png


1.2.3 使用


fun main() {
    //实例化User类
    var user = User()
    //调用name.setName函数
    user.name = "scc"
    //调用info函数
    user.info()
}


 Kotlin实例化一个类跟Java类似,只不过去掉了 new 关键字。


微信图片_20220524201045.png


1.3 field


       针对你定义的每一个属性,Kotlin都会产生一个field、一个getter、以及一个setter,field用来存储属性数据,你不能直接定义field,Kotlin会封装field,保护它里面的数据,只暴露给getter和setter使用。


       field使用场景:当你需要覆盖Kotlin自动生成的getter和setter时使用。


覆盖Kotlin自动生成的getter和setter时,要紧跟属性。


class User {
    var name = ""
    var age = 0
        get() = field + 10
        set(value) {
            field = value + 18
            println(field)
        }
}
fun main() {
    //实例化User类
    var user = User()
    //调用name.setName函数
    user.name = "scc"
    user.age = 3
    user.info()
}


微信图片_20220524201211.png


  • 1.初始化设置age=3


  • 2.调用覆盖的set函数,age=3+18


  • 3.调动覆盖的get函数,age=21+10


1.3.1 计算属性


       计算属性是通过一个覆盖的get或set运算符来定义,这时field就不需要了。为什么没关系?因为计算属性跟原来的属性值没关系。


    var age = 0
        get() = 3+15//计算属性,跟age原有的属性值没有关系。


微信图片_20220524201308.png


1.4 构造函数


       Koltin 中的类可以有一个主构造器,以及一个或多个次构造器,主构造器是类头部的一部分,位于类名称之后。


class UserInfo constructor(_name:String, _age:Int){}


1.4.1 主构造器


       我们在UserInfo类的定义头中定义一个主构造函数,使用临时变量为UserInfo的各个属性提供初始值,在Kotlin中,为便于识别,临时变量(包括仅引用一次的参数),通常都会以下划线开头的名字命名


如果构造器有注解,或者有可见度修饰符,这时constructor关键字是必须的,注解和修饰符要放在它之前。


class UserInfo(_name:String, _age:Int)  {
    var name = _name
    var age = _age
}


init 关键字


       主构造器中不能包含任何代码,初始化代码可以放在初始化代码段中,初始化代码段使用 init 关键字作为前缀。


class UserInfo(_name:String, _age:Int)  {
    var name = _name
    var age = _age
    init {
        println("初始化:$name 今年已经$age 岁了")
    }
}


微信图片_20220524202013.png


主构造函数定义属性


       Kotlin允许你不使用临时变量赋值,而是直接用一个定义同时指定参数和类属性,这种方式定义类属性,可以减少重复代码。


1.class UserInfo2(var name:String, _age:Int)  {
    var age = _age
}


  这里我们对name进行了改造,直接在主构造函数里面定义属性,而不是通过临时变量进行赋值。

1.4.2 次构造器


       我们可以定义多个次构造函数来配置不同的参数组合


       同时,可以使用次构造函数,定义初始化代码逻辑。


       在同一个类中代理另一个构造函数使用 this 关键字


class UserInfo2(var name: String, _age: Int) {
    var age = _age
    init {
        println("初始化:$name 今年已经$age 岁了")
    }
    //次构造器
    constructor(name: String) : this(name, _age = 19) {
        this.name = "$name,BOOM"
    }
}
fun main() {
    UserInfo2("主构造函数", 18)
    //调用次构造函数
    UserInfo2("次构造函数")
}


微信图片_20220524202136.png


默认值


       定义构造函数时,可以给构造函数参数指定默认值,如果用户调用时不提供值参,就使用这个默认值。


class UserInfo2(var name: String, _age: Int) {
    var age = _age
    var isMan = false//设置默认参数。
}


  给属性 isMan 设置默认值 false。


1.4.3 初始化顺序


  • 1、主构造函数里声明的属性
  • 2、类级别的属性赋值
  • 3、init初始化块里的属性赋值和函数调用
  • 4、次构造函数里的属性赋值和函数调用


class UserInfo2(var name: String, _age: Int) {
    var age = _age
    var isMan = false//设置默认参数。
    init {
        println("初始化:$name 今年已经$age 岁了,$isMan")
    }
    //次构造器
    constructor(name: String, _isMan: Boolean) : this(name, _age = 21) {
        this.name = "$name,BOOM"
        isMan = _isMan
        println("次构造器:$name 今年已经$age 岁了,$isMan")
    }
}
fun main() {
    //初始化顺序
    UserInfo2("顺讯",true)
}

微信图片_20220524202232.png


1.4.4 无构造器


       如果一个非抽象类没有声明构造函数(主构造函数或次构造函数),它会产生一个没有参数的构造函数。构造函数的访问权限修饰符为 public。


       如果你不想你的类有公共的构造函数,你就得声明一个空的主构造函数。


class UserInfo3 private constructor(){}


二、类的修饰符(类别)


       Kotlin 类的修饰符包括 classModifieraccessModifier


2.1 classModifier


       类属性修饰符,标示类本身特性(类别)


abstract    // 抽象类  
final       // 类不可继承,默认属性
enum        // 枚举类
open        // 类可继承,类默认是final的
annotation  // 注解类
data        // 数据类
sealed      // 密封类
object      // 单例类


2.2 accessModifier


       访问权限修饰符

       Kotlin与Java可见性修饰符对比


修饰符 Java Kotlin
public 所有类可见 所有类可见(默认)
private 当前类可见 当前类可见
protected 当前类、子类、同一包路径下的类可见 当前类、子类可见
default 同一包路径下的类可见(默认)
internal 同一模块中的类可见


文章知识点与官方知识档案匹配,可进一步学习相关知识

Java技能树类和接口类和面向对象19552 人正在系统学习中

相关文章
|
7月前
|
分布式计算 Java 数据安全/隐私保护
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(下 )
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(下)
34 0
|
7月前
|
Java Kotlin
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(上)
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(上)
33 0
|
9月前
|
安全 Java 编译器
Kotlin 学习笔记(一)—— 基本类型、函数、lambda、类与对象的写法
Kotlin 作为 Android 开发的首选语言,其基础语法和特性需要重点学习。本文概括总结了 Kotlin 的基本类型、关键字、函数、闭包、高阶函数、类与对象等核心知识点,并给出示例代码进行讲解。
152 0
Kotlin 学习笔记(一)—— 基本类型、函数、lambda、类与对象的写法
|
9月前
|
存储 Kotlin
Kotlin中嵌套类、数据类、枚举类和密封类的详解
Kotlin中嵌套类、数据类、枚举类和密封类的详解
68 1
|
12月前
|
安全 Java 编译器
3 亿美元的 bug,Kotlin 帮你避免 | 内联类 value class
3 亿美元的 bug,Kotlin 帮你避免 | 内联类 value class
92 0
|
Java Kotlin
Kotlin data数据类、copy()函数、sealed密封类
Kotlin data数据类、copy()函数、sealed密封类使用
114 0
|
安全 JavaScript 前端开发
Kotlin 之类和接口
Kotlin 之类和接口
Kotlin 之类和接口
|
Java C# Kotlin
Kotlin学历之特殊类
Kotlin学历之特殊类
75 0
|
设计模式 Java 开发者
带你踏入kotlin大门(五)|基本功_类和继承篇
本篇作为 Kotlin 基本功的倒数第二篇,将为大家带来关于 Kotlin 中类和继承的知识。如果你看到这篇文章的时候,还未听说过 Kotlin 或者从未学习过 Kotlin ,你可以点击链接从本系列的第一篇文章开始学习。
带你踏入kotlin大门(五)|基本功_类和继承篇
|
Kotlin
Kotlin | 实现数据类(data)深拷贝
在Kotlin中,data数据类默认的copy方法实现的是浅拷贝,但我们有时候需要实现深拷贝。 在kotlin中,实现就比较容易了。
535 0
Kotlin | 实现数据类(data)深拷贝