当前位置: 首页 > news >正文

Kotlin类与对象

类的定义与对象创建

类的创建是比较简单的,主要是看一下注意点:
1.如果主构造函数没有任何注释或可见性修饰符,则可以省略constructor关键字,如果类中没有其他内容要写,可以直接省略花括号,最后就变成下面这样:

class Student(name: String,age: Int)

但是,这里仅仅是定义了构造函数的参数,这还不是类的属性,我们可以为这些属性添加var或val关键字来表示这个属性是可变还是不可变的:

class Student(var name: String,val age: Int)

这样才算是定义了类的属性,我们也可以给这些属性设置初始值:

class Student(var name: String, val age: Int = 18)

除了将属性添加到构造函数中,我们也可以将这些属性值直接作为类的成员变量写到类中,但是这种情况必须要配一个默认值,否则无法通过编译:

class Student{var name: String = "" //必须配一个默认值var age: Int = 0
}

这样我们就可以不编写主构造函数也能定义属性,但是这里仍然会隐式生成一个无参的构造函数,为了构造函数能够方便地传值初始化,也可以像这样写:

class Student(name: String,age: Int){var name: String = name    //通过构造函数传递过来var age: Int = age
}

当然,如果不希望这些属性在一开始就有初始值,而是之后某一个时刻去设定初始值,我们也可以为其添加懒加载:

class Student{lateinit var name: String  //懒加载的属性可以不用在一开始赋值,但是在下一次使用之前一定要先完成赋值,否则报错var age: Int = 0
}

对象的创建和使用

fun main(){var stu = Student("aaa",18) //stu存放的是对象的引用,而不是本体,我们可以通过对象的引用来间接操作对象println(stu.name)
}
class Student(var name: String,val age: Int)

次构造函数的对象使用

fun main(){var stu = Student("aaa")  //这里就会调用次构造函数println(stu.name)
}
class Student(var name: String,val age: Int){constructor(name: String): this(name,18)
}

详解如下:
在这里插入图片描述
在这里插入图片描述
对象的初始化

在对象创建时,我们可能需要做一些初始化工作,我们可以使用初始化代码块来完成,初始化代码块使用init关键字来完成。假如我们希望对象在创建的时候,如果年龄不足18,岁,那么就设定为18岁:

class Student(var name: String, var age: Int){ //由于主构造函数无法编写函数体,因此我们可以在init的花括号中编写初始化代码
//注意这段初始化代码初,是在上面的类属性被赋值之后才执行的,所以说能拿到已经赋值的age属性
init {println("我是初始化操作")if(age < 18) age = 18println("初始化操作结束")}
}

这样我们再创建对象的时候,就会在创建的时候自动执行初始化代码块里面的代码:

fun main() {val stu = Student("小米",15)println(stu.age)
}
/*打印结果:
我是初始化操作
初始化操作结束
18
*/

init代码块也可以定义多个,执行是按照顺序从上往下执行。如果既有主构造函数的初始化代码块,又有次构造函数的函数体,那么执行顺序也是先主后次。
在这里插入图片描述
类的成员函数

调用类中的成员方法,同样使用.运算符即可。

fun main() {val stu = Student("小米",15)stu.hello()
}

在类的成员函数中,可以直接访问当前类对象中的一些属性,比如这里的用户名和年龄:

class Student(var name: String, var age: Int){fun hello(){println("大家好,我叫$name,今年${age}岁了") //这里的name 可以写成this.name,代表的就是类的成员变量}
}

空值和空类型

所有的变量除了引用一个具体的值之外,还有一种特殊的值可以使用,那就是null,它代表空值,也就是不引用任何对象。

在其他语言中,比如Java中null是一个非常常见的值,因为在某些情况下,引用类型的变量默认值就是null,这就经常会导致程序中出现一些空指针导致的异常,在Kotlin中,对于空值处理是非常严格的,正常情况下,我们的变量是不能直接复制为null的,否则会报错。无法编译通过:
在这里插入图片描述
这是因为所有的类型默认都是非空类型,非空类型的变量是不允许被赋值为null的,这个直接在编译阶段就避免了其他语言中经常存在的空指针问题。

那么,如果我们希望某个变量在初始化的情况下使用null而不去引用某一个具体对象,该怎么做呢,此时我们需要将变量的类型修改为可空类型,只需要在类型名称的后面添加一个?即可:

fun main(){var str: String? = null
}

既然现在是可空类型,那么很多问题就会出现了,比如当一个变量为 null时,此时如果使用类中的一些成员方法或是获取成员属性时,会出现一些问题:
在这里插入图片描述
Kotlin为我们提供了一种更安全的空类型操作,更安全地访问可能包含null值的对象属性,需要使用安全调用运算符?.,如果对象的属性为null,则安全调用运算符返回null,像下面这样:

fun main(){var str: String? = nullprintln(str?.length)
}

这里的调用结果存在两种情况:
1.如果str为null,那么这里得到的结果就是null,并且不会正常执行后面的操作
2.如果str不为null,那就正常返回这里本应该得到的结果。

因此,使用安全调用运算后,如果遇到null的情况,那么这里不会正常进行原本的操作,而是直接返回null作为结果,这在有些时候非常好用,比如我们希望一个学生类型的变量在为null时就不执行对象的语句:

fun main(){val stu: Student? = nullstu?.hello()
}

不过在有些时候,可能我们希望如果变量为null,在使用安全调用运算符时,返回一个我们自定义的结果,而不是null,我们可以使用Elvis运算符:

fun main(){val str: String? = null//Elvis运算符 ?: 左侧为空值检测目标,右侧为检测到null时返回的结果val len: Int = str?.length ?: 0
}

这里我们使用了Elvis运算符来判断左侧是否为null,如果左侧为null,那么这里直接得到右侧的自定义值,这个运算符长得巨像Java语言里面的三元运算符。

解构声明
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

as关键字可以起别名:
在这里插入图片描述

相关文章:

Kotlin类与对象

类的定义与对象创建 类的创建是比较简单的&#xff0c;主要是看一下注意点&#xff1a; 1.如果主构造函数没有任何注释或可见性修饰符&#xff0c;则可以省略constructor关键字&#xff0c;如果类中没有其他内容要写&#xff0c;可以直接省略花括号&#xff0c;最后就变成下面…...

Windows版 nginx安装,启动,目录解析,常用命令

Windows版 nginx安装&#xff0c;启动&#xff0c;目录解析&#xff0c;常用命令 一级目录二级目录三级目录 1. 下载2. 启动方式一&#xff1a;方式二&#xff1a; 3. 验证是否启动4. 安装目录解析5. 常用命令 一级目录 二级目录 三级目录 1. 下载 官网下载&#xff1a;ngi…...

基于51单片机的电子隐形防盗网proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1TSuRsB2i1tgAHjI0Miz3AQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…...

Fish Agent:多语言 Voice-to-Voice 开源语音模型;Runway 推出摄像机运镜功能丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思…...

locust压测工具环境搭建(Linux、Mac)

目录 使用anaconda搭建locust环境 1、anaconda安装python环境&#xff08;推荐&#xff09; 2、从conda安装locust 使用python虚拟环境搭建locust环境 1、直接安装python环境 2、从python环境安装locust 从依赖文件中安装locust环境 1、从anaconda安装locust 2、从pyt…...

欠定方程有多个真正解,超定方程可能无解所以有最小二乘解

Ax b x A\b ,但不是b/A,会报错矩阵维度不对应两个未知数&#xff0c;三个方程也可以是最小二乘解&#xff0c;因为无解满足三个方程&#xff0c;比如下面 A [0, 1; 1, 1;3,6]; % 一个接近奇异的矩阵 b [1; 2;3]; x A\b; % 求解线性方程组 % warning(off, MATLAB:…...

LeetCode27:移除元素

原题地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k…...

JAVA 插入 JSON 对象到 PostgreSQL

博主主页:【南鸢1.0】 本文专栏&#xff1a;JAVA 目录 ​编辑 简介 所用&#xff1a; 1、 确保 PostgreSQL 数据库支持 JSON&#xff1a; 2、添加 PostgreSQL JDBC 驱动 3、安装和运行 PostgreSQL 4、建立数据库的连接 简介 在现代软件开发中&#xff0c;由于 JSON 数据…...

视图,物化视图,普通表区别简介

普通视图与物化视图的主要区别&#xff1a; 数据存储方式&#xff1a; 普通视图&#xff1a;不存储数据&#xff0c;仅包含查询定义。查询时&#xff0c;Oracle会根据视图的定义转换为相应的SQL语句去查询底层数据。物化视图&#xff1a;实际存储数据&#xff0c;类似于物理表。…...

C++ | Leetcode C++题解之第530题二叉搜索树的最小绝对差

题目&#xff1a; 题解&#xff1a; class Solution { public:void dfs(TreeNode* root, int& pre, int& ans) {if (root nullptr) {return;}dfs(root->left, pre, ans);if (pre -1) {pre root->val;} else {ans min(ans, root->val - pre);pre root-&g…...

使用Node.js构建实时聊天应用

使用Node.js构建实时聊天应用 Node.js简介 安装Node.js 使用npm安装依赖 创建基本的Web服务器 设置静态文件夹 创建聊天客户端 连接WebSocket 发送消息 接收消息 处理消息 实现私聊功能 实现群聊功能 用户身份验证 存储聊天记录 使用WebSocket进行文件传输 使用WebSocket进行屏…...

STM32F103C8T6学习笔记1--新建工程模板

1、简介 STM32是一系列由STMicroelectronics&#xff08;瑞士意法半导体&#xff09;公司设计和生产的32位微控制器产品线。这些微控制器基于ARM Cortex-M内核&#xff0c;并具有高性能、低功耗和多种外设接口的特点。STM32处理器被广泛应用于各种嵌入式系统领域&#xff0c;包…...

RK3568平台开发系列讲解(内存篇)Linux 内存优化

🚀返回专栏总目录 文章目录 一、如何正确采集 Linux 内存可用空间二、系统内存优化参考步骤2.1、优化 Linux Kernel module 所占用的内存空间2.3、将 Wi-Fi built-in kernel2.4、优化 Linux 文件系统所占用的内存空间2.5、上层优化2.6、客户定制优化2.6.1、对具体客户的具体产…...

企业数字化转型实施中的挑战与解决方案:架构引领的战略路径

在企业推动数字化转型的过程中&#xff0c;通常会面临复杂的挑战。随着技术的不断演进和业务环境的变化&#xff0c;企业架构&#xff08;Enterprise Architecture, EA&#xff09;成为帮助企业应对这些挑战的关键工具。通过提供一个全面的战略蓝图&#xff0c;EA使企业能够在保…...

《数字图像处理基础》学习05-数字图像的灰度直方图

目录 一&#xff0c;数字图像的数值描述 &#xff11;&#xff0c;二值图像 &#xff12;&#xff0c;灰度图像 3&#xff0c;彩色图像 二&#xff0c;数字图像的灰度直方图 一&#xff0c;数字图像的数值描述 在之前的学习中&#xff0c;我知道了图像都是二维信息&…...

【漏洞复现】某平台-QRcodeBuildAction-LoginSSO-delay-mssql-sql注入漏洞

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 《Web安全》h…...

Centos安装ZooKeeper教程(单机版)

本章教程介绍,如何在Centos7中,安装ZooKeeper 3.9.3版本。 一、什么是ZooKeeper ? Apache ZooKeeper 是一个分布式协调服务,用于大型分布式系统中的管理和协调。它为分布式应用提供了一个高性能的通信框架,简化了开发人员在构建复杂分布式系统的任务。ZooKeeper 能够解决一…...

A011-基于SpringBoot的视频点播系统设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装视频点播系统软件来发挥其高效地信息处理的作用&#xff0c…...

云原生+AI核心技术&最佳实践

以下内容是我在陕西理工大学2023级人工智能专业和网络专业的演讲内容&#xff0c;分享给大家。 各位老师、同学们&#xff0c;大家好啊&#xff01;能在这里跟大家一起聊聊咱们计算机专业那些事儿&#xff0c;我真的觉得超级兴奋&#xff01; 首先&#xff0c;自我介绍一下&am…...

【Android】Service

文章目录 1.service2.startService3.bindService4.区别 1.service 在Android开发中&#xff0c;Service 是一个可以在后台长时间运行的组件&#xff0c;用于执行耗时操作或执行那些不需要与用户界面直接交互的任务。Service 不依赖于用户界面&#xff0c;即使用户切换到其他应…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

背包问题双雄:01 背包与完全背包详解(Java 实现)

一、背包问题概述 背包问题是动态规划领域的经典问题&#xff0c;其核心在于如何在有限容量的背包中选择物品&#xff0c;使得总价值最大化。根据物品选择规则的不同&#xff0c;主要分为两类&#xff1a; 01 背包&#xff1a;每件物品最多选 1 次&#xff08;选或不选&#…...