1.kotlin里面的顶层函数和熟悉相当于java里面的静态函数,就是直接把函数跟熟悉写在顶层的类外面,其他地方可以直接用
package com.project.test fun joinTestStaticString() : String{ for (i in 0..3){ numberCount = i ; } return "static_string $numberCount" } var numberCount = 0;
--------------
fun main(args: Array<String>) {
println(joinTestStaticString())
}
------
控制台输出 static_string 3
顶层函数和方法不属于任何一个类 ,可以直接调用
const val NUMBER :Int = 0; //相当于java的 public static final int NUMBER = 0 ;
2.给别人的类添加方法或者属性
fun String.getLastChar() : Char = this.get(this.getLength - 1) 这个表示我给String类添加了一个叫getLastChar()的方法,返回值是Char 等号右边的意思是获得当前最后一个Char 我把上面的参数拿下来
println(joinTestStaticString().getLastChar())
输出最后一个字符是 3 ,可以给任何类添加方法
fun Student.sayHello() : String { return "${this.name} sayHello" }这个表示我给一个Student类添加了一个
sayHello()方法,返回值为String
这些方法都是写在顶部的 ,可以给所有的类添加方法
使用的话需要导入当前文件所在的包名,同样也可以用as 来修改名称
import com.project.test.sayHello as hello
把上面的sayHello方法修改成为hello方法 ,使用的时候直接通过Student对象拿出来即可,
在JAVA中调用就跟静态类一样
char hello = StaticStringKt.lastChar("Hello");
StaticStringKt.sayHello(new Student("xm", 22, "男", "sh"));
StaticStringKt是文件名
3.类的继承重写
父类要加上open 需要重写的方法也需要加上open 这样子类才能拿到父类需要给子类重写的类
//父类
open class ParentClass{ open fun onClick() = println("parent click") }
//子类
// ParentClass()需要加括号,表示已经构建了这个对象 如果是接口则不需要加括号 重写的方法需要加override
class ChildClass : ParentClass() { override fun onClick() { println("child click") super.onClick() } }
--------
调用 父类引用指向子类对象 ,会调用子类的方法,重写了
val testClass : ParentClass = ChildClass();
testClass.onClick();
输出child click
parent click
-----
如果在顶部添加了扩展方法,方法名字取的一样 ,则不会重写父类的扩展方法
fun ParentClass.onStop() = println("parent stop") fun ChildClass.onStop() = println("child stop")
----------
val testClass : ParentClass = ChildClass();
testClass.onStop();
输出 parent stop
总结,父类类里面的方法如果暴露出来是可以重写的,外部添加的扩展方法不支持重写,还有如果内部函数跟扩展函数重名,则会优先调用内部函数
4.给类动态添加属性
var StringBuild.addChar : Char
get() = get(length -1)
set(value : Char){
this.append(value)
}
-----
val stringBuilder = StringBuilder("kotlin") stringBuilder.addChar = 'n'; stringBuilder.addChar = 'b'; println(stringBuilder.toString())
-----
输出kotlinnb
给StringBuild类动态添加了一个叫addChar 的属性 ,里面的get() set()方法必须要写
5.listof arrayListOf.... 等 都是在java的基础上新加的扩展函数 vararg表示不限制参数的数量
/** * Returns a new [ArrayList] with the given elements. * @sample samples.collections.Collections.Lists.arrayList */ public fun <T> arrayListOf(vararg elements: T): ArrayList<T> = if (elements.size == 0) ArrayList() else ArrayList(ArrayAsCollection(elements, isVarargs = true))
动态的给Student类添加了一个增加学生的方法 vararg不限制参数个数
fun Student.addStudents(vararg student : Student) : ArrayList<Student> { val arrayList = ArrayList<Student>() if (student.size == 0)arrayList else arrayList.addAll(student) return arrayList; }
----->>>
val student = Student("xm", 11, "男", "sh") val arrayListOf = arrayOf(student, student) val addStudents = student.addStudents(student, student, student, *arrayListOf); for (stu in addStudents){ println(stu.toString()) }
输出Student{name='xm', age=11, sex='男', address='sh'} Student{name='xm', age=11, sex='男', address='sh'} Student{name='xm', age=11, sex='男', address='sh'} Student{name='xm', age=11, sex='男', address='sh'} Student{name='xm', age=11, sex='男', address='sh'}
在参数vararg里面 用*加参数集合 可以一起放进去处理