类与对象之间的关系
直接进入主题。
类:对象的模板
对象:类的实现
类只有通过(new Instance)对象实例后才能调用该类中定义的字段、方法!
通俗理解就是,类表示法律,对象就必须要遵守这个法律。如果不遵守Exception
以上就是面向对象思想!
在java与kotlin类的定义近乎相同,都是使用关键字是class
作为定义类的标识符:
<public> class JavaFile{...}
public
是可省略的,在java中如果舍去了public
那么默认标识符就是default
然而在kotlin中,如果省去了public
那么默认的就是public
。
*在kotlin中是可以使用java的可见性修饰符的,只不过默认是被隐藏的
网上找了一张图片,大家可以看看。
但是……你以为类的定义仅仅是这样么?
啧啧,太天真了!
在kotlin中,还存在一个空类的概念:
//定义一个空类
class Empty
没错,就这样,没有类体!
一. 构造器
java中我们定义类,通常是这样的:
public class JavaFile{
private String name;
public JavaFile(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
虽然在kotlin中也有类似的写法。
class KtFile {
private var name: String = ""
constructor(name: String) {
this.name = name
}
fun getName(): String {
return name
}
fun setName(name: String) {
this.name = name
}
}
但是,一般不这么写,kotlin之所以有简洁、高效这一说法,那么我们就来看看简洁、高效的写法。
一步一步来!
//这样写
class KtFile1{
constructor(name: String) {
var name: String = name
}
}
//这样写
class KtFile2(name: String) {
var name: String = name
}
//还能这样写
class KtFile3(var name: String) {}
怎么样?没想到吧?
来看第三种写法(最简写法),在第三种写法中,kotlin直接将类当做方法来写,只是修饰符不同,一个是fun
一个是class
那么既然构造器已经写在类名后面了,如果我有一系列初始化操作,该怎么办呢?
1). init{}
init{}
kotlin中提供了一个init{}
写法
class KtFile3(var name: String) {
init {
name = "姓名=$name"
}
}
2). 次要构造器
同时kotlin中页提供了一个次构造器的说法
可以用java中的方法重载来理解
class KtFile3(val name: String) {
constructor (name: String, age:Int) : this(name) {
}
}
如果你声明了一个次要构造器,那么就需要让它代理主构造器了,也就是上面的:this(name)
3). 私有构造器
在java中构造器的私有就是直接将private
加在构造方法上,kotlin中也一样
class KtFile4 private constructor(){
……
}
这么写就代表了这是一个私有构造器
二. get、set方法
在java中创建get
/set
方法很简单,就如上面所写
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
在kotlin中其实已经是默认了get
和set
方法,如果需要显示的写出来。
class KtFile3(var name: String) {
var age: Int = 0
get() = field
/*get(){
return field
}*/
set(value) {
if (value > 100)
field = 100
else if (value < 1)
field = 1
else
field = value
}
}
使用则是与正常的赋值相同:
fun main(args: Array<String>) {
val k = KtFile("k")
val k2 = KtFile2("k2")
val k3 = KtFile3("k3")
println(k.getName())
println(k2.name)
println(k3.name)
k3.age = 101
println(k3.age)
}
结果:
*这里之所以会用field
代替变量名,是因为一旦使用原变量age
将会造成无限递归。另外就是get
和set
中并不是不允许有var
,只是不能有与该变量相同名称的var
还有一点值得注意的是如果修饰符是val
那么该变量(常量)是没有set
方法的
最后一点:get
、set
方法只能被public
修饰
三. 对象的创建
在上面其实也已经写出来了。
在kotlin中,对象的创建并不需要new
关键字
fun main(args: Array<String>) {
val k = KtFile("k")
var k2 = KtFile2("k2")
}
这样就直接得到一个对象。
总结
- kotlin中存在空类体的定义方式
- kotlin中构造器可以直接写成
class 类名 (var 字段1:类型, val 字段2:类型){……}
的方式。 - kotlin中允许出现子(次)构造器,但是必须代理主构造器,关键字
this
- kotlin中
get
、set
方法默认隐式,也可以显示写在字段下方;引用字段需使用field
代替,不能直接使用字段名,会造成死递归;以val
所修饰的字段不允许有set
方法。 - kotlin中对象的创建不需要
new
关键字