目录
三、设计一个函数adder,支持复数的加法运算。然后在main函数中调用adder函数,并验证该函数是否能够正确完成复数的加法运算。
一、新建一个Android项目
1. 在该项目的包名下,新建main.kt文件并加入代码
图1 main.kt文件
运行结果截图
图2 运行结果截图
1.1 变量d#(#为1-5)各为什么类型?
d1:整数类型(Int); d2:浮点数类型(Float);
d3:双精度浮点数类型(Double); d4 布尔类型(Boolean);
d5:字符串类型(String)。
1.2 d2中的数值表示方法
在 Kotlin 中,使用 f 后缀可以将整数直接转换为浮点数。
这样就可以将整数值 10 赋给浮点数变量 d2。
二、将以下代码也添加到main函数中,并体会和思考
2.1 代码如下
val name = "Lily"
println("Hello $name !")
(1)name是什么数据类型?
字符串(String)
(2)打印函数println中的字符串,是什么表达式?
字符串模板,在 Kotlin 中,使用 $ 符号可以在双引号内插入变量的值,并将其替换为实际的值。
(3)运行截图
图3 题目2-1运行截图
2.2 代码如下
val a = 1
println("a = $a")
(1)a是什么数据类型?
整数类型(Int)
(2)运行截图
图4 题目2-2运行截图
2.3 代码如下
a = 20
(1)此时运行会出现什么?为什么?
运行会报错。使用 val关键字声明的变量是不可变的,一旦被赋值后就不能再次修改。因此被val声明的a无法再次被赋值为20。
(2)运行截图
图5 题目2-3运行截图
2.4 代码如下
var b = 10f
println("b = $b")
b = 20F
println("b = $b")
(1) b是什么数据类型?
浮点数(float)
(2)val和var的区别?
val声明的是常量,不可再次赋值;
而var声明的是变量,值可以变化。
(3)运行截图
图6 题目2-4运行截图
2.5 代码如下
println("${0..10}")
println("${0 until 10}")
(1) ..和until的区别?
① 相同点都是表示一个区间。
② 不同点是0..10表示创建一个两端都为闭区间的区间,相当于[0,10];
而0 until 10表示创建一个左闭右开的区间,相当于[0,10) 。
(2)运行截图
图7 题目2-5运行截图
6. 代码如下
val friends = listOf("Tom", "Tom", "Lily")
val fruits = setOf("apple", "banana", "orange", "apple")
val prices = mapOf("apple" to 1, "banana" to 2, "orange" to 3.0)
println(friends)
println(fruits)
println(prices)
(1)列表、集合和映射的区别?
① 列表(List):是一个有序集合,可以包含重复元素。在 Kotlin 中,列表使用 listOf() 或者 mutableListOf() 来创建,可以通过索引访问元素,也可以进行添加、删除和遍历等操作。
② 集合(Set):是一个不包含重复元素的无序集合。在 Kotlin 中,集合使用 setOf() 或者 mutableSetOf() 来创建,不支持通过索引访问元素,但可以进行添加、删除和遍历等操作。
③ 映射(Map):是由键值对组成的集合,每个键都唯一对应一个值。在 Kotlin 中,映射使用 mapOf() 或者 mutableMapOf() 来创建,可以通过键来访问值,也可以进行添加、删除和遍历等操作
(2)运行截图
图8 题目2-6运行截图
三、设计一个函数adder,支持复数的加法运算。然后在main函数中调用adder函数,并验证该函数是否能够正确完成复数的加法运算。
1. ComplexNumber.kt
package com.example.androidtest
class ComplexNumber(var real: Float, var imaginary: Float)
2. main.kt
fun adder(d1: ComplexNumber, d2: ComplexNumber): ComplexNumber {
var sum = ComplexNumber(1.0f, 1.0f)
sum.real = d1.real + d2.real
sum.imaginary = d1.imaginary + d2.imaginary
return sum
}
3. 简化函数adder之后的代码
fun adder(d1: ComplexNumber, d2: ComplexNumber) =
ComplexNumber(d1.real + d2.real, d1.imaginary + d2.imaginary)
4. 主函数
val complex1 = ComplexNumber(2.0f, 3.0f)
val complex2 = ComplexNumber(5.0f, 6.0f)
val result = adder(complex1, complex2)
println("Sum = ${result.real} + ${result.imaginary}i")
5. 测试结果
图9 adder函数完成复数加法运算截图
四、类、构造函数、继承、接口、循环和条件语句
1. Person类
package com.example.androidtest
//定义一个Person类
open class Person(
protected val name: String,
protected val age: Int,
protected val gender: String
) {
init {
checkGender(gender)
}
//检查性别填写规则,只允许小写字母
private fun checkGender(gender: String) {
if (gender.lowercase() !in listOf("female", "male")) {
println("Gender should be only female of male!")
}
}
}
2. PrintInfo接口
package com.example.androidtest
//定义一个PrintInfo接口
interface PrintInfo {
// 1. 打印基本信息
fun printBasicInfo(){
}
// 2. 打印课程分数
fun printScores(){
}
}
3. Course类
package com.example.androidtest
//定义一个课程类
data class Course(val title: String, val score: Float)
4. Student类
package com.example.androidtest
/* 1.继承Person类(三个字段也要继承)
* 2.继承接口PrintInfo(方法需要重写)
* 3.添加自己本身的字段
* */
class Student(
name: String,
age: Int,
gender: String,
val sno: Int,
val major: String,
val grade: Int,
val scores: ArrayList<Course>
) : Person(name, age, gender), PrintInfo {
override fun printBasicInfo() {
super.printBasicInfo()
println("学生姓名:$name")
println("年龄:$age")
println("性别:$gender")
println("学号:$sno")
println("专业名称:$major")
println("年级:$grade")
}
override fun printScores() {
super.printScores()
println("课程分数如下:")
for (course in scores) {
println("${course.title} = ${course.score}")
}
}
}
5. Main函数
val scores = {
val l = ArrayList<Course>()
l.add(Course("JavaWeb程序设计", 93f))
l.add(Course("数据库原理", 92f))
l.add(Course("人工智能", 95f))
l
}
val p = Student(
name = "小煊", age = 20, gender = "female", sno = 2130502441,
major = "计算机科学与技术", grade = 2021,
scores = scores()
)
p.printBasicInfo()
p.printScores()
6. 测试结果
图10 学生信息运行截图
五、心得体会
1. 对Kotlin编程有了更深刻的理解。虽然Kotlin有些语法和Java是差不多的,但细节上还是有出入。掌握了一些基础语法,比如常用的数据类型、var和val声明变量的区别、..和until的区别、以及列表、集合和映射的区别。
2. 在做面向对象编程的时候,我学习了如何在 Kotlin 中定义类、创建对象,以及使用面向对象的特性,如封装、继承和多态。这使我能够更好地组织和管理代码,提高代码重用性和可维护性。理解了Kotlin 中的类默认是不可被继承的,如果要指定某个类可以被其他类继承,需要使用 open 关键字来明确指定该类是可继承的;如果子类希望重写父类的方法,需要在父类方法前加open关键字,并在子类中使用 override 关键字来表示该方法是被覆盖的等等。