大创项目个人周报(2024.7.15—2024.7.21)
本周个人情况汇报
一、搭建开发环境
1.下载Android Studio
2.运行第一个程序
二、入门Kotlin语言
1.打印语句的操作,用println()函数
fun main() {
println("Hello World!")
}
2.变量的定义:在Kotlin中定义变量只有以如下两种方式定义
var [变量名称] : [数据类型]
val [变量名称] : [数据类型]
- val用来声明一个不可变的变量,var用来声明一个可变的变量。
- Kotlin编译器会自动根据变量所赋的值推导出变量自身的类型
- 对于要延迟赋值的变量,可以显式声明其类型,如:
var a : Int = 10
3.数字类型的变量
类型 | 位 | 最大值 | 最小值 |
---|---|---|---|
Byte | 8 | -128 | 127 |
Short | 16 | -32768 | 32767 |
Int | 32 | -2,147,483,648 (-2^31 ) | 2,147,483,647(2^31 - 1) |
Long | 64 | -9,223,372,036,854,775,808 (-2^63) | 9,223,372,036,854,775,807(2^63-1) |
- 除了整数类型外,Kotlin还为无符号整数提供以下类型:
UByte:一个无符号8位整数,范围从0到255
UShort:无符号16位整数,范围从0到65535
UInt:一个无符号32位整数,范围从0到2^32 - 1
ULong:一个无符号64位整数,范围从0到2^64 - 1
- 要注意的是,在Long类型与无符号类型里,定义的数字后面要加上如L、UL、U来区分
类型 | 大小(位) | 符号与尾数位数 | 阶码位数 | 小数位数 |
---|---|---|---|---|
Float | 32 | 24 | 8 | 6-7 |
Double | 64 | 53 | 11 | 15-16 |
- 数字类型变量的计算 有 + - * / % ++ -- += -= *= /= %=
等,悉如C语言。整数的位运算操作,可以直接在二进制层面上与数字表示的位进行操作,不过只适用于Int和Long类型的数据:
shl(bits)– 有符号左移
shr(bits)– 有符号右移
ushr(bits)– 无符号右移
and(bits)– 按位与
or(bits)– 按位或
xor(bits)– 按位异或
inv()– 取反
4.字符串类型
Kotlin中的字符串,有专门的类型,其操作较之C语言更加方便。
- 可以在字符串里储存多行的字符
val text = "Hello\nWorld"
val text = """
Hello
hello
World
"""
- 可以将字符串拼接使用
val s1 = "Hello"
val s2 = "World!"
val str = s1 + s2//字符串与字符串拼接
val a = 10
val text = "这是拼接的值" + a//字符串与其他类型拼接,但只能被拼接的类型在后
val text = "这是拼接的值$a"
val text = "$a 这是拼接的值"//$为模版表达式,可以直接将后面跟着的变量或表达式以字符串形式替换到这个位置
val text = "${a}这是拼接的值"
5.流程控制
- if条件语句
if (条件判断) 判断成功执行的代码;
Kotlin中的if语句是可以有返回值的,故可做如下操作
val value == if(num1 > num2){
num1
}
else{
num2
}
- when语句
when定义具有多个分支的条件表达式。类似C语言中的switch语句,作如下形式:
when (条件) {
匹配值1 -> 代码...
匹配值2 -> 代码...
else -> {
代码...
}
}
- for循环
fun main() {
for (i in 1..3) {
println("666")
}
for (i in 0 until 10 step 2) {
println("666")
}
for (i in 0 downTo 10 step 2) {
println("666")
}
}
- while循环
大致与C语言相同
三、函数
函数形式如下,可以以Unit作返回值类型作无返回值函数,也可以定义递归函数。
fun 函数名称([函数参数...]): 返回值类型 {
//函数体
}
在函数内部也可以定义函数
四、类
在Kotlin中,可以定义一个类,然后进一步创建许多这个类的实例对象。可以定义如下:
class Person {
var name = ""
var age = 0
fun eat(){
println(name + " is eating.He is " + age + " years old.")
}
}
对对象的操作:
fun main(){
val p = Person()
p.name="Jack"
p.age=19
p.eat()
}
本周遇到的问题及利用chatGPT等AI工具的解决过程
在本周的学习中,学习类时对不同类的定义方法不太分得清楚,故利用AI解答。
Q:在Kotlin语言中,类的定义可以如何定义?请给出具体的不同的定义方法
A:在Kotlin语言中,类的定义可以通过以下几种方式进行定义:
1. 基本类定义
class MyClass {
// 类的成员变量、方法等定义
}
这是最基本的类定义方式,其中MyClass
是类的名称。
2. 带有构造函数的类定义
class MyClass constructor(param1: Type1, param2: Type2) {
// 类的成员变量、方法等定义
}
在构造函数中声明了参数,可以根据需要指定参数的类型。
另一种简化的方式是使用constructor
关键字可以省略:
class MyClass(param1: Type1, param2: Type2) {
// 类的成员变量、方法等定义
}
3. 带有初始化块的类定义
class MyClass {
init {
// 初始化块中的代码
}
// 类的成员变量、方法等定义
}
初始化块中的代码会在类的实例化过程中执行,用于初始化类的成员变量等操作。
4. 带有继承的类定义
open class ParentClass {
// 父类的成员变量、方法等定义
}
class ChildClass : ParentClass() {
// 子类的成员变量、方法等定义
}
ChildClass
继承自ParentClass
,通过冒号(:
)来实现继承关系。
5. 带有接口实现的类定义
interface MyInterface {
// 接口定义
}
class MyClass : MyInterface {
// 类的成员变量、方法等定义
}
MyClass
实现了MyInterface
接口,通过冒号(:
)来实现接口的实现关系。
这些是Kotlin中类的几种定义方式,可以根据需求选择适合的方式进行类的定义。
Q:可以通过具体的实例演示一下后两种定义的方式吗?可以就实例说明一下它们的区别吗?
A:当然可以!我将为你提供一个具体的示例来说明继承和接口实现的区别。
open class Animal(val name: String) {
open fun makeSound() {
println("$name makes a sound.")
}
}
interface Swimmer {
fun swim()
}
class Dog(name: String) : Animal(name), Swimmer {
override fun makeSound() {
println("$name barks.")
}
override fun swim() {
println("$name swims.")
}
}
class Fish(name: String) : Animal(name), Swimmer {
override fun makeSound() {
println("$name doesn't make a sound.")
}
override fun swim() {
println("$name swims.")
}
}
在上面的示例中,我们定义了一个Animal
类作为父类,它有一个name
属性和一个makeSound()
方法。然后我们定义了一个Swimmer
接口,其中包含一个swim()
方法。
接下来,我们定义了两个子类:Dog
和Fish
。Dog
类继承自Animal
类并实现了Swimmer
接口,Fish
类也继承自Animal
类并实现了Swimmer
接口。
在Dog
类和Fish
类中,它们都重写了makeSound()
方法,并且Dog
类实现了swim()
方法,而Fish
类也实现了swim()
方法。
现在我们来看看如何使用这些类:
fun main() {
val dog = Dog("Buddy")
dog.makeSound() // Output: Buddy barks.
dog.swim() // Output: Buddy swims.
val fish = Fish("Nemo")
fish.makeSound() // Output: Nemo doesn't make a sound.
fish.swim() // Output: Nemo swims.
}
在main()
函数中,我们创建了一个Dog
对象和一个Fish
对象,并分别调用它们的方法。
输出结果如下:
Buddy barks.
Buddy swims.
Nemo doesn't make a sound.
Nemo swims.
通过这个示例,我们可以看到继承和接口实现的区别:
- 继承允许子类继承父类的属性和方法,并且可以重写父类的方法。在示例中,
Dog
和Fish
类继承了Animal
类的name
属性和makeSound()
方法,并且分别重写了makeSound()
方法。 - 接口实现允许类实现接口中定义的方法。在示例中,
Dog
和Fish
类都实现了Swimmer
接口的swim()
方法。
综上所述,继承用于类与类之间的层次结构和代码重用,而接口实现用于类与接口之间的行为规范和多态性。
下周计划
- 继续学习Kotlin语言,学习Lambda编程
- 利用Kotlin实现CS架构