构造函数
kotlin 类
class MainActivity: AppCompatActivity()
class MainActivity:AppcompatActivity(),OnClickListener
kotlin 的类默认是 public final 的
open class MainActivity:AppCompatActivity()
open class MainActivity:AppCompatActivity(),OnClickListener
open class MainActivity : View.OnClickListener,AppCompatActivity(){
override fun onCreate(savedInstanceState:Bundle?){
setContent(R.layout.activity_main)
findViewById<View>(R.id.textview).setOnClickListener(this)
}
overrde fun onClick(v:View){
}
}
open class MainActivity(var int:Int) : View.OnClickListener,AppCompatActivity(){
init{
println("-----")
}
override fun onCreate(savedInstanceState:Bundle?){
setContent(R.layout.activity_main)
findViewById<View>(R.id.textview).setOnClickListener(this)
}
overrde fun onClick(v:View){
}
}
class TestView :View {
constructor(content:Context):super(content){
println("constructor")
}
constructor(content:Context,attrs:AttributeSet?):this(content,attrs,0)
constructor(content:Context,attrs:AttributeSet?,defStyleAttr:Int):super(content,attrs,defStyleAttr)
}
访问修饰符
- private 类私有
- protected 类以及继承类可访问
- public 本类以及其他类都可访问
- internal 表示一个模块(android module)中的类都可以访问到这个对象,跨模块的类无法访问
伴生对象
kotlin 中因为没有静态方法,所以无法通过类名.方法名 调用静态方法。除了使用jvmStatic 注解修饰方法, 还有一种方法便是 companion object (伴生对象) 伴生对象一定要写在类的内部
class StringUtils{
companion object{
fun isEmpty(str:String):Boolean{
return "" == str
}
}
}
fun main(args: Array<String>){
StringUtils.isEmpty("===")
}
public class CompanionTest{
public void test(){
StringUtils.Companion.isEmpty("afafba")
}
}
总结: 实际上伴生对象在编译好以后,会在这个类的内部生成一个静态对象,叫Companion的一个对象。java 在调用的时候,实际上是通过Companion 对象调用内部一些变量或方法;
伴成对象还有一个特性,用于声明一个单例。如下
单例类
class Single private constructor(){
compation object{
fun get:String{
return Holder.instance
}
}
private object Holder{
val instance = Single()
}
}
fun main(args : Array<String>){
Single.get()
}
动态代理(by)
interface Animal{
fun bark()
}
class Dog:Animal{
override fun bark(){
println("wang")
}
}
class Zoo(animal:Animal):Animal by animal
fun main(args:Array<String>){
Zoo(Dog()).brak()
}
kotlin 会将动态代理在编译后转为动态代理去调用,所以kotlin 的动态代理一定比java 的动态代理效率高; java 的动态代理本质上是通过反射调用的,而kotlin 的动态代理本质上是通过静态代理去调用的
kotlin 特有的类
数据类(通常用来替代java 中的JavaBean)
data class User(var id:Int,var name:String)
toString()
hashCode()
equeals()
copy()
class VIP(id:Int,name:String):User(id,name)
枚举类
enum class Command{
A、B、C、D
}
fun exec(command:Command)=when(command){
Command.A->{}
Command.B->{}
Command.C->{}
Command.D->{}
}
在kotlin 中我们很少会使用枚举类,一般会使用它更强大的一个类–密闭类
密闭类(超级枚举)
sealed class SuperCommand{
object A:SuperCommand()
object B:SuperCommand()
object C:SuperCommand()
object D:SuperCommand()
}
fun exec(command:SuperCommand)=when(command){
SuperCommand.A->{}
SuperCommand.B->{}
SuperCommand.C->{}
SuperCommand.D->{}
}
密闭类最大的特性在于,密码类是可以有扩展它的子类的,并且,它的子类也可以成为密码类的一个选项。例如下
sealed class SuperCommand{
object A:SuperCommand()
object B:SuperCommand()
object C:SuperCommand()
object D:SuperCommand()
class E:SuperCommand()
class E(var id :Int):SuperCommand()
}
fun exec(command:SuperCommand)=when(command){
SuperCommand.A->{}
SuperCommand.B->{}
SuperCommand.C->{}
SuperCommand.D->{}
is SuperCommand.E->{}
}
sealed class SuperCommand{
object UP : SuperCommand()
object DOWn : SuperCommand()
object LEFT : SuperCommand()
object RIGHT : SuperCommand()
object PACE(var pace:Int) : SuperCommand()
}
fun exec(command:SuperCommand)=when(command){
SuperCommand.UP->{}
...
is SuperCommand.PACE->{}
}
|