学习的步伐(六) Kotlin 学习总结:类的特性

  • 共同学习

学习的步伐(五) Kotlin 基础语法学习总结:语法

学习的步伐(四) Kotlin 基础语法学习总结:操作符

学习的步伐(三)Kotlin TabLayout+Viewpager+Fragment实现基础框架

学习的步伐(二)Kotlin 实现Recyclerview列表

  • 构造方法
public  open class  Person  (var name : String){
    /**
     * 类的构造方法中:
     * 1.可以直接在类后面写(这样称之为主体构造)
     * 2.name默认是public val的常量 ,val是只读不可修改,var是可以修改单的
     * 3.如果不希望其他类访问,可以设置private
     * 4.如果希望name是变量,需要加上var,如果修改name的值的话可以在init{}修改
     * 5.创建类的实体:val Person = Person("创建类的实体")
     * */

    init {
        name="hello"
    }

     internal fun say(){
        Log.e(">>>>>>>>>>>>>>","hello $name")
    }
    }

如果要指定一个类的主构造函数的可见性,请使用以下语法(注意需要添加显式的构造函数关键字):

class Person public  constructor (var name : String) {

}

  • 创建类的实体
val Person = Person("创建类的实体")

  • 继承
/**
*Kotlin 中所有的类都有共同的父类 Any ,一个类没有父类声明,它默认继承(隐式继承)父类:
*/
public class  Aww {

}
/**
 * kotlin 修饰符
 * Kotlin给每个类的默认修饰符是final的,如果我们希望其他类可以继承这个类需要加上 open修饰符
 * */

public class  Aww(name: String) : Person(name) {

}
public  open class  Person  (var name : String){

}

  • 内部类
    第一种:跟正常java写法差不多
class AClass (name : String){

    private val string: String = "我是外部类常量"
    class Nested {
        fun foo() = 2
       //fun foo() = string   调用外部类的常量是不允许的
    }
}

//调用
        val demo = AClass.Nested().foo() // 结果是= 2

第二种:给内部类加上 inner

//官方介绍: 一个类可以标记为内部,以便能够访问外部类的成员。内部类对外部类的对象进行引用:
class AClass (name : String){

    private val string: String = "我是外部类常量"
    inner class Nested {
    //inner 就是一个标记 让内部类可以调用外部类的成员
        fun foo() = string
    }
}

  • 修饰符

    /**
     * 因为kotlin默认的权限修饰符是public的,
     * internal权限修饰符:属于模块级别的,也就是说编译时在统一个modle下的文件才有权利访问,不同的modle(我们开发时经常会用到不同的modle作为依赖,或者不同的app(跨应用))没有权利访问internal变量或方法
     *
     * */
    internal fun say(){
        Log.e(">>>>>>>>>>>>>>","hello $name")
    }

  • 重写(方法/属性)
public  open class  Person  (var name : String){
//如果想重写父类的方法(属性),必须给函数加上open
      open fun say1(){
        Log.e(">>>>>>>>>>>>>>","$name")
    }
}
//
public class  Aww(name: String) : Person(name) {
    override fun say1() {
        super.say1()
    }
}

重写规则:

例举一个场景:
Aww 继承了Person,同时有实现了一个自定义的接口(InterFace1),而Person和InterFace1里有一个函数名称是一样的:
public class  Aww(name: String) : Person(name) ,InterFace1{

}

public  open class  Person  (var name : String){
    open fun say1(){
         Log.e(">>>>>>>>>>>>>>","Person")
    }
   } 

 interface InterFace1{
    fun say1(){
          Log.e("我是接口:","InterFace1")
    }
 }

 那么当我们重写say1()函数时:
   override fun say1() {
        //需要在super<"在这里声明重写的方法属于哪个">
        //提示我们要指定:Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super<Foo>
        super<Person>.say1()
        super<InterFace1>.say1()
        //当然可以同时声明两个
        //打印结果:
        07-04 13:16:13.875 27192-27192/webred.cp.example.com.kotlingrammar E/>>>>>>>>>>>>>>: Person
        07-04 13:16:13.875 27192-27192/webred.cp.example.com.kotlingrammar E/我是接口:: InterFace1
    }

后续会陆续完善补充! 欢迎吐槽!一起共同学习!

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34501274/article/details/74315868
文章标签: Kotlin
个人分类: Kotlin
想对作者说点什么? 我来说一句

kotlin学习书籍(中文)

2017年11月14日 2.11MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭