系列文章路引 👀 https://blog.csdn.net/weixin_44235109/article/details/119680974
文章目录
一、类与接口
1.类的定义
kotlin类的默认修饰符是public,如下java与kotlin声明的类是一致的。
//java
public class SimpleClass {
public int x;
public void y(){
}
}
//kotlin
class SimpleClass{
var x : Int = 0 //必须初始化
fun y(){
}
}
构造器分为主构造器和副构造器
主构造器即为 class SimpleClass(){} (类前面的括号) ,副构造器使用constructor修饰,默认调用主构造器,也可以继承调用其他的副构造器。如下所示:
class InitConstructorTest() {
/*次构造方法*/
constructor(name: String) : this() {
}
constructor(name: String, gender: Boolean) : this(name) {
println("constructor")
}
}
kotlin 主构造器会自动生成对应的成员属性。如果是var则有对应的get set方法 如果是val 则有对应的get方法 和 java对比如下
//java
public class SimpleClass{
public int x;
public SimpleClass(int x){
this.x = x;
}
}
//kotlin
class SimpleClass(var x : Int){
}
类的实例化 , kotlin省去了new关键字
//java
SimpleClass cls = new SimpleClass(10);
Sytsem.out.println(cls.x);
cls.y();
//kotlin
val cls = SimpleClass(10)
println(cls.x)
cls.y()
2.接口抽象类相关
接口的定义,java与kotlin对比,如下所示:
//java
public interface SimpleInfo{
void simpleMethod();
}
//kotlin
interface SimpleInfo(){
fun simpleMethod()
}
接口的实现,java与kotlin对比,如下所示:
//java
public class SimpleClass implements SimpleInfo{
@Override
public void simpleMethod(){}
}
//kotlin
class SimpleClass(var x : Int) : SimpleInfo{
override fun simpleMethod(){}
}
抽象类的定义,java与kotlin对比(kotlin的方法和正常的类默认不可以覆写,需要加上open关键字),如下所示:
//java
public abstract class AbsClass{
public abstract void absMethod();
protected void overrideMethod(){}
public final void nonOverridable(){}
}
//kotlin 和上面java对应
abstract class AbsClass{
abstract void absMethod()
open protected void overrideMethod(){}
void nonOverridable(){} //正常的方法默认不允许被覆写
}
抽象类的继承,java与kotlin对比,如下所示:
//java 实现继承以及实现接口
public class SimpleClass extends AbsClass implements SimpleInfo{
....
}
//kotlin 实现继承以及实现接口 注意继承 需要调用对应的构造方法
clsss SimpleClass(var x : Int) : AbsClass() , SimpleInfo{
....
}
3.属性的引用
kotlin属性的引用,分两种情况:
1、直接以类型引用,默认没有绑定receiver,调用属性需要传入receiver。
2、以对象引用,默认绑定receiver,不许哟啊传入receiver。
//直接以类名调用
val ageRef = Person :: age
val person = Rerson(10,"zxf")
ageRef.set(person,10) //调用需要传入receiver
//以对象调用
val person = Rerson(10,"zxf")
val ageRef = person :: age
ageRef.set(10)//调用不需要传入receiver
二、扩展方法
1.扩展方法的简单介绍
kotlin扩展方法:在正常的方法名字之前加上对应的类名,即可。如下例子所示:
//给String扩展方法
fun String.isEmail() : Boolean {
...
}
//使用String,可直接调用该方法
val checkEmail = "zxf".isEmail()
2.扩展方法的简单举例
fun String.padding(count : Int , char : Char = ' ') : String{
val padding = (1 .. count).jointToString(""){char.toString()}
return "${padding}${this}${padding}"
}
println("zxf".padding(10))
//结果
" zxf "
3.扩展方法的类型
fun String.times(count : Int) : Boolean{....}
//未绑定receiver
String :: times (String,Int) -> Boolean 或者 String.(Int) -> Boolean
//绑定receiver
"**" :: times (Int) -> Boolean
三、空类型安全
1.空类型安全概念
kotlin分为可null类型,以及不可null类型,如下所示:
var nonNull : String = "zxf" //直接写为不可null 类型
nunNull = null //直接这么写,编译不通过 报错 不可null类型不可复制为null
var nullable : String? = "zxf" //增加? 为可null类型
nullable = null //可赋值为null
2. !!. ?. ?: 的使用与区别
!!. 强转为不可null类型 如果出现null 则出抛异常
var nullable : String? = "zxf"
//强制转换为 不可null 类型 然后调用length 此时 变量length的类型为 Int
val length = nullable!!.length
?. 如果不为null 则走?.
var nullable : String? = "zxf"
//相当于if判断 如果不为null 则回去length 此时 变量length的类型为 Int?
val length = nullable?.length
?: 判断前方如果为null,则走?:
var nullable : String? = "zxf"
//相当于if判断 如果不为null 则回去length 如果为null 则返回0 此时 变量length的类型为 Int
val length = nullable?.length?:0
3. 空类型的继承关系
好像找不到可null类型与不可null类型之间的继承关系,但是不可null类型可以赋值给可null类型,反过来却不行,所有从某种程度来说,不可null类型继承自可null类型。
var x : String = "hello"
var y : String? = "world"
x = y // 编译器报错 Type mismatch
y = x // 正常赋值成功
4. 除了可null与不可null类型之外,kotlin还有平台类型 !
平台类型:比如kotlin调用java的对象,此时拿到的就是平台类型(!),表示不知道是否为可空类型:如下
//java
public class Person {
public String getName () {...}
}
//kotlin 调用
val person = Person()
val title : String! = person.title //String!表示平台类型,不知道是否为可null类型
四、智能类型转换
1.Java以及kotlin类型转换对比
kotlin :is 判断一个实例是某种类型,as 类型的强转 , Java 使用 instanceOf 进行类型判断。
//java 类型转化 虽然判断过了 但是还是需要进行一次强制转换
IPerson person = new Person()
if(person instanceOf Person){
System.out.println((Person)person.name) //需要再次进行强制转换
}
//kotlin 正常转换
val person : Iperson = Person()
if (person is Person){
println((person as Person)person.name)
}
//kotlin 智能转换 if已经判断类型了 可直接进行使用
val person : Iperson = Person()
if (person is Person){
println(person.name)
}
//可null类型的智能转换
var value : String? = "zxf"
if(value != null){
println(value.length) //此时value已经是不可null类型了,可直接调用
}
2.不支持智能转换的情况
var tag : String? = "zxf"
fun main(){
if (tag !=null){
//此时tag依旧为可null类型,因为虽然赋值为null,但是别的线程可能对其有影响,编译器不会进行帮忙自动转换了
println(tag!!.length)
}
}
3.类型的安全转换
val person : Iperson = Person()
println((person as? Person)person.name) //安全转换,如果转换失败则返回null 直接使用as 转换失败 抛异常
总结 (使用Retrofit进行简单的网络请求)
提示:这里对文章进行总结:
以上就是kotlin简单的类型学习,可以写一个列子练练手。
列如:使用Retrofit发送网络请求
interface GitHubApi {
@GET("/repos/{owner}/{repo}")
fun getRepository(@Path("owner") owner: String, @Path("repo") repo: String): Call<Repository>
}
fun main() {
val gitHupApi = Retrofit.Builder().baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(GitHubApi::class.java)
val response = gitHupApi.getRepository("JetBrains", "Kotlin").execute()
val repository = response.body()
if (repository == null) {
println("Error! ${response.code()} - ${response.message()}")
} else {
println(repository.name)
println(repository.owner.login)
println(repository.stargazers_count)
println(repository.forks_count)
println(repository.html_url)
File("kotlin.html").writeText(
"""
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${repository.owner.login} - ${repository.name}</title>
</head>
<body>
<h1><a href='${repository.html_url}'>${repository.owner.login} - ${repository.name}</a></h1>
<p>${repository.description}</p>
<p>Stars: ${repository.stargazers_count}</p>
<p>Forks: ${repository.forks_count}</p>
</body>
</html>
""".trimIndent()
)
}
}
以上使用到的实体类,单独放置:
data class Repository(
var id: Int,
var node_id: String,
var name: String,
var full_name: String,
var private: Boolean,
var owner: Owner,
var html_url: String,
var description: String,
var fork: Boolean,
var url: String,
var forks_url: String,
var keys_url: String,
var collaborators_url: String,
var teams_url: String,
var hooks_url: String,
var issue_events_url: String,
var events_url: String,
var assignees_url: String,
var branches_url: String,
var tags_url: String,
var blobs_url: String,
var git_tags_url: String,
var git_refs_url: String,
var trees_url: String,
var statuses_url: String,
var languages_url: String,
var stargazers_url: String,
var contributors_url: String,
var subscribers_url: String,
var subscription_url: String,
var commits_url: String,
var git_commits_url: String,
var comments_url: String,
var issue_comment_url: String,
var contents_url: String,
var compare_url: String,
var merges_url: String,
var archive_url: String,
var downloads_url: String,
var issues_url: String,
var pulls_url: String,
var milestones_url: String,
var notifications_url: String,
var labels_url: String,
var releases_url: String,
var deployments_url: String,
var created_at: String,
var updated_at: String,
var pushed_at: String,
var git_url: String,
var ssh_url: String,
var clone_url: String,
var svn_url: String,
var homepage: String,
var size: Int,
var stargazers_count: Int,
var watchers_count: Int,
var language: String,
var has_issues: Boolean,
var has_projects: Boolean,
var has_downloads: Boolean,
var has_wiki: Boolean,
var has_pages: Boolean,
var forks_count: Int,
var mirror_url: Any,
var archived: Boolean,
var disabled: Boolean,
var open_issues_count: Int,
var license: Any,
var forks: Int,
var open_issues: Int,
var watchers: Int,
var default_branch: String,
var organization: Organization,
var network_count: Int,
var subscribers_count: Int
) {
data class Owner(
var login: String,
var id: Int,
var node_id: String,
var avatar_url: String,
var gravatar_id: String,
var url: String,
var html_url: String,
var followers_url: String,
var following_url: String,
var gists_url: String,
var starred_url: String,
var subscriptions_url: String,
var organizations_url: String,
var repos_url: String,
var events_url: String,
var received_events_url: String,
var type: String,
var site_admin: Boolean
)
data class Organization(
var login: String,
var id: Int,
var node_id: String,
var avatar_url: String,
var gravatar_id: String,
var url: String,
var html_url: String,
var followers_url: String,
var following_url: String,
var gists_url: String,
var starred_url: String,
var subscriptions_url: String,
var organizations_url: String,
var repos_url: String,
var events_url: String,
var received_events_url: String,
var type: String,
var site_admin: Boolean
)
}