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

来源:互联网 发布:ccd视觉编程软件 编辑:程序博客网 时间:2024/06/08 17:36
  • 共同学习

学习的步伐(五) 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    }

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

阅读全文
0 0