(1)类的定义
class EmptyClass
fun main(args:Array<String>){
var ec = EmptyClass() //kotlin创建对象不需要new
println(ec.toString())//调用类的toString()方法
println(ec::class) //::表示将class方法传入一个方法中当参数
println(ec is EmptyClass)//判断类的归属
}
(2)带参类的定义
class Student{
var name:String
var score:Int = 60 //Int类型必须有初始化值
var cls:Int = 3
constructor(name: String, score: Int, cls: Int){
this.name = name
this.score = score
this.cls = cls
}
override fun toString(): String {
return "Student(name='$name', score=$score, cls=$cls)"
}
}
fun main(args:Array<String>){
var student = Student("name",32,34)
println(student.toString())
}
或者:
class Teacher(name:String,age:Int){
var mName = name;
var mAge = age;
override fun toString(): String {
return "name = ${mName} and age = ${mAge}"
}
}
fun main(args:Array<String>){
var teacher = Teacher("ailian",32)
println(teacher.toString())
}
还有一种办法可以不创建属性mName/mAge,而是在构造参数前添加var
class Teacher(var name:String, var age:Int){
override fun toString(): String {
return "name = ${name} and age = ${age}"
}
}
fun main(args:Array<String>){
var teacher = Teacher("ailian",32)
println(teacher.toString())
}
(3)抽象类
abstract class Animal{//定义一个抽象类
abstract var name:String//抽象类的属性必须是抽象的
abstract var age:Int
abstract fun cry():Boolean//定义抽象方法
/**
* 定义一个普通方法、Unit表示无需返回值
* 默认是final,不可以覆写
*/
fun smile():Unit{
"haha..."
}
/**
* 定义一个可以覆写的普通方法
*/
open fun call():Unit{
"haha..."
}
}
class Dog(override var name: String, override var age: Int):Animal(){//override:覆写属性,Cat继承Animal,并实现抽象方法
override fun cry(): Boolean { //实现方法
println("${name} is cry...")
return true
}
override fun call() {
super.call()
println("${name} is call...")
}
}
class Pig: Animal() {
override var name: String = ""
override var age: Int = 0
override fun cry(): Boolean {
println("${name} is cry... age is ${age}")
return true
}
}
fun main(args:Array<String>):Unit{
var pig = Pig()
pig.name = "Peppa"
pig.age = 4
println(pig.cry())
var dog = Dog("dahuang",3)
println(dog.call())
println(dog.cry())
}
(4)接口
/**
* 定义一个Animal接口
*/
interface Animal {
var name: String
var age: Int
fun cry()
fun smile() {
println("I am smile ... ")
}
}
/**
* 定义一个Action接口
*/
interface Action {
}
/**
* 创建一个Pig类并实现Animal和Action接口
*/
class Pig(override var name: String, override var age: Int) : Animal,Action{
override fun cry() {
println("${name} is cry ... ")
}
}
/**
* 用另一种形式创建一个类Dog并实现Animal和Action接口
*/
class Dog:Animal,Action{
override var name: String =""
override var age: Int = 0
override fun cry() {
println("${name} is cry ... ")
}
}
fun main(args:Array<String>):Unit{
var pig = Pig("Peppa",2)
println(pig.cry())
var dog = Dog()
dog.name = "xiaowang"
dog.age = 3
println(dog.cry())
}
(5)内部类
package 类与对象
class Outter{
val a:Int=0
//非静态内部类
inner class Inner{
val a:Int=5
fun hello(){
println(this@Outter.a)
}
}
//静态内部类
class Innera{
}
}
interface OnClickListener{
fun onClick()
}
class View{
var onClickListener:OnClickListener?= null
}
fun main(args: Array<String>) {
val inner=Outter.Innera()
val view=View()
view.onClickListener=object :OnClickListener{
override fun onClick() {
}
}
}
(6)伴生对象与静态成员
package 类与对象
class A{
val ww:String="fadas"
companion object {
fun ss(){
val ss=A.a
}
val a:String="sdada"
}
}
(7)扩展方法
考虑四点:
1.那个类需要扩展 String
2.扩展的方法名 multiply
3.是否需要参数 int
4.是否需要返回值 String
package 类与对象
//扩展方法
fun main(args: Array<String>) {
println("abc".multiply(13))
}
fun String.multiply(int:Int):String{
val stringBuilder=StringBuilder()
for (i in 0 until int){
stringBuilder.append(this)
}
return stringBuilder.toString()
}
(8)属性代理 by关键字
1.val/var 定义的属性名 by 类名
2.类中实现get/set方法
package 类与对象
import kotlin.reflect.KProperty
class Delegates{
val hello by lazy {
"hello"
}
val hello2 by X()
var hello3 by X()
}
class X{
private var value:String?=null
operator fun getValue(thisRef:Any?,property:KProperty<*>):String{
return "Hello"
}
operator fun setValue(thisRef:Any?,property:KProperty<*>,value:String){
this.value=value
}
}
fun main(args: Array<String>) {
val delegates=Delegates()
println(delegates.hello)
println(delegates.hello2)
println(delegates.hello3)
delegates.hello3="dsadasdasd"
println(delegates.hello3)
}
(9)数据类(javaBean)
package 类与对象
data class Country(val id:Int,val name:String)
fun main(args: Array<String>) {
val china=Country(0,"中国")
println(china)
println(china.component1())
println(china.component2())
val (id,name)=china
println(id)
println(name)
}
(10)枚举类
package 类与对象
enum class LogLevel(val id:Int){
VERBOSE(0),DEBUG(1),INFO(2),WARN(3),ERROR(4);
fun getTag():String{
return "$id,$name"
}
}
class LogLevel2 protected constructor(){
companion object {
val VERBOSE=LogLevel2()
val DEBUG=LogLevel2()
val INFO=LogLevel2()
val WARN=LogLevel2()
val ERROR=LogLevel2()
}
}
(11)密封类
package 类与对象
sealed class PlayerCmd{
class Play(val url:String,val position:Long=0):PlayerCmd()
class Seek(val position: Long):PlayerCmd()
object Pause:PlayerCmd()
object Resume:PlayerCmd()
object Stop:PlayerCmd()
}