1.继承与重写的Open关键字
open class Product(val name:String
) {fun description() = "Product: $name"open fun load() = "Nothing .."}class LuxuryProduct:Product("Luxury"){//继承需要调用 父类的主构造函数override fun load(): String {return "LuxuryProduct loading ..."}}fun main() {val p:Product = LuxuryProduct()println(p.load())
}
2.类型检测
3.智能类型转化
import java.io.Fileopen class Product(val name:String
) {fun description() = "Product: $name"open fun load() = "Nothing .."}class LuxuryProduct:Product("Luxury"){//继承需要调用 父类的主构造函数override fun load(): String {return "LuxuryProduct loading ..."}fun special():String = "Speical LuxuryProduct Function"}fun main() {val p:Product = LuxuryProduct()println(p.load())println(p is Product)println(p is LuxuryProduct)println(p is File)if (p is LuxuryProduct){p.special()}
}
4. Any 超类
跨平台支持得更好,他的Any类里的 toString hashcode equals 在不同平台有不同的实现,是为了更好的跨平台支持。
5. 对象
5.1 object关键字 单例模式
object ApplicationConfig{var name :String = "singleName"init {println("ApplicationConfig loading ...")}fun doSomething(){println("doSomething")}}fun main() {//类名,实例名 就是一个单例对象ApplicationConfig.doSomething()println(ApplicationConfig)println(ApplicationConfig)println(ApplicationConfig)println(ApplicationConfig===ApplicationConfig)
}
5.2 对象表达式 相当于匿名内部类
open class Player{open fun load() = "loading nothing"
}fun main() {val p = object : Player(){ //匿名内部类相当于override fun load(): String {return "anonymous nothing"}}println(p.load())
}
5.3 伴生对象 一个类只能有一个
import java.io.Fileopen class ConfigMap(val name:String){companion object{ //伴生对象 相当于静态内部类 创建的单例对象// 不管这个ConfigMap类实例化多少次,这个伴生对象就是单例,因为是不基于对象创建的,是类加载时创建的private const val PATH = "XXXX"var s:String ="asd"fun load() = File(PATH).readBytes()}}fun main() {ConfigMap.load()
}
import java.io.Fileopen class ConfigMap(val name:String){companion object{ //伴生对象 相当于静态内部类 创建的单例对象// 不管这个ConfigMap类实例化多少次,这个伴生对象就是单例,因为是不基于对象创建的,是类加载时创建的private const val PATH = "XXXX"var s:String ="asd"fun load() = File(PATH).readBytes()init {println("companion object 被加载了")}}}fun main() {ConfigMap("a")
}
6. 嵌套类 实际上就是 静态内部类
class Player2 {class Equipment(var name: String) {fun show() = println("equipment:$name")}fun battle(){}}fun main() {val equipment = Player2.Equipment("sharp knife")}
7. 数据类
data class Coordinate(var x: Int, var y: Int) {var isInBounds = x > 0 && y > 0}fun main() {println(Coordinate(10, 20))//== 比较的是内容,equals,Any 默认实现 === ,比较引用//=== 比较引用println(Coordinate(10, 20) == Coordinate(10, 20))
}
8.copy函数 数据类专属
data class Student (var name:String,val age:Int){private val hobby = "music"var subject:Stringinit {println("initializing student")subject = "math"}constructor(_name:String):this(_name,10)override fun toString(): String {return "Student(name='$name', age=$age, hobby='$hobby', subject='$subject')"}constructor(_name:String,_age:Int,_hobby:String,_subject:String):this(_name,10){subject=_subject}}fun main() {val s = Student("JACK")val copy = s.copy(name = "Rose") //copy只跟主构造函数有关println(s)println(copy)
}
9.结构声明
class PlayerScore(var experience:Int ,val level :Int,val name:String){operator fun component1() = experience //component后面那个数字必须从1开始operator fun component2() = name}fun main() {/*** 普通的结构*/val (x,y) = PlayerScore(10,20,"小智")println("$x $y")}
data class PlayerScore(var experience:Int ,val level :Int,val name:String){}fun main() {/*** 数据类自带的结构*/val (x,y) = PlayerScore(10,20,"小智")println("$x $y")
}
10. 运算符重载
data class Coordinate(var x: Int, var y: Int) {var isInBounds = x > 0 && y > 0// operator fun plus(other:Coordinate):Coordinate {
// return Coordinate(x+other.x,y+other.y)
// }operator fun plus(other: Coordinate) = Coordinate(x+other.x,y+other.y)}fun main() {val c1 = Coordinate(10, 20)val c2 = Coordinate(10, 20)println(c1+c2)
}
11.枚举类
enum class Direction {EAST,WEST,SOUTH,NORTH
}fun main() {println(Direction.EAST)println(Direction.EAST is Direction)
}
11.1 枚举类定义函数
enum class Direction (private val coordinate: Coordinate){EAST(Coordinate(1,0)),WEST(Coordinate(-1,0)),SOUTH(Coordinate(0,-1)),NORTH(Coordinate(0,1));fun updateCoordinate(playerCoordinate: Direction) =Coordinate(playerCoordinate.coordinate.x+coordinate.x,playerCoordinate.coordinate.y+coordinate.y)}fun main() {val updateCoordinate = Direction.EAST.updateCoordinate(Direction.WEST)println(updateCoordinate)
}
11.2 代数数据类型
enum class LicenseStatus {UNQUALIFIED,LEARNING,QUALIFIED;}class Driver(var status: LicenseStatus) {fun checkLicense(): String {return when (status) {LicenseStatus.UNQUALIFIED -> "没资格"LicenseStatus.LEARNING -> "在学"LicenseStatus.QUALIFIED -> "有资格"}}}fun main() {println(Driver(LicenseStatus.LEARNING).checkLicense())
}
12.密封类
//密封
sealed class LicenseStatus2 {object UnQualified : LicenseStatus2(){val id :String = "2131"}object Learning : LicenseStatus2()class Qualified(val licenseId: String) : LicenseStatus2()}class Driver2(var status: LicenseStatus2) {fun checkLicense(): String {return when (status) {is LicenseStatus2.UnQualified -> "没资格 ${(this.status as LicenseStatus2.UnQualified).id}"is LicenseStatus2.Learning -> "在学"is LicenseStatus2.Qualified -> "有资格,驾驶证编号 ${(this.status as LicenseStatus2.Qualified).licenseId}"}}}fun main() {println(Driver2(LicenseStatus2.UnQualified).checkLicense())
}