一般类形式:

class Person(var name: String){//构造函数放在类头部
var age = 1
var fulName: String
var address = "china" init {//初始化模块,与第一构造函数同时执行
fulName = name+"_haha"
} //类内部成员变量访问通过get,set方法访问
//备用字段使用field声明,field只能用于属性的访问器
var lastName: String = "zhang"
get() = field.toUpperCase()
set//禁止修改 //二级构造函数,需要加前缀 constructor:
constructor (name: String, age:Int) : this(name) {
//this.fulName = name
this.age = age
} var no: Int = 100
get() = field // 备用字段表示当前属性,对当前字段值只能通过此field处理
set(value) { //变量修改方式
if (value < 10) {
field = value
} else {
field = -1
}
} var heiht: Float = 145.4f
private set private fun selfMethod(){//私有方法
println("self method ")
} fun sayHello(){//无修饰符,默认public
print("hello! nice to meet you!")
} private val bar: Int = 1
inner class MyInner{//内部类 in
fun ff() = bar // 访问外部类成员
fun innerTest() {
var o = this@Person //获取外部类的成员变量
//内部类引用外部类成员
println("name=${o.name}, age=${o.age}")
}
} class Nested {// 嵌套类
fun foo() = "nest class content"
fun myHandle(){
println("Nested instance method invoke!")
}
} }

类访问
 val p = Person("haha")
 p.address = "beijing"//set

嵌套类访问
var pnest = Person.Nested()
pnest.foo()
内部类访问
var pinner = Person("Tom").MyInner()// 内部类,Outter后边有括号
pinner.innerTest()

匿名内部类:

kotlin object 对象表达式,相当于java匿名类

 fab.setOnTouchListener(object :View.OnTouchListener{//匿名类实现监听器
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
return false
}
})
//简化为lambda表达式形式
fab2.setOnTouchListener { v , event ->
            if(event.action == MotionEvent.ACTION_UP){
                var pnest = Person.Nested()
                var str = pnest.foo()
                tvContent?.text = str
            }
            false
 }

静态类,kotlin没有静态类,静态方法,可以使用object修饰符替代 Java static功能

object SampleClass{
var name: String = "jack tom"
var no: Int = 101
fun bar() {}
}

访问方式,

SampleClass.name
 SampleClass.bar()

class SingletonSample2 private constructor() {
// 一个类里面只能声明一个内部关联对象,即关键字 companion 只能使用一次
companion object {//通过companion object实现单例模式
val instance = SingletonHolder.holder
val tt:String = "static object"
} private object SingletonHolder {
val holder = SingletonSample2()
} fun hello(){} }

工厂模式实现:

interface Factory<T> {
fun create(): T
} class MyClass private constructor(){
companion object : Factory<MyClass> {
override fun create(): MyClass = MyClass()
}
}

类属性延迟初始化:

kotlin为确保类型安全,属性在声明和定义时需要指定属性值,但对于想要延迟初始化或者开始无法确定时我们需要特殊处理,实现方式 lateinit关键字,layzy函数

class User(var name:String){
//延迟初始化方式一
lateinit var play:String //lateinit表示延迟初始化,若没有初始化使用则抛出异常 fun setUpValues(){
play = "basketball"//String("football")
} //延迟初始化方式二
//lazy() 是一个函数, 接受一个 Lambda 表达式作为参数, 返回一个 Lazy <T> 实例的函数,
// 返回的实例可以作为实现延迟属性的委托
val lazyValue: String by lazy {
println("computed!") // 第一次调用输出,第二次调用不执行
"Hello world"
}
// println(lazyValue) // 第一次执行,执行lazy函数
// println(lazyValue) // 第二次执行,只输出返回值 hello //延迟初始化方式三,Delegates属性代理方式实现
//notNull 适用于那些无法在初始化阶段就确定属性值的场合
var notNullBar: String by Delegates.notNull<String>()
//foo.notNullBar = "bar"
//如果属性在赋值前就被访问的话则会抛出异常
//println(foo.notNullBar) fun member(){ print("member method") } }

继承类, 接口

kotlin被继承类必须使用open修饰,否则无法继承

//open 修饰的类才能被继承
open class BaseP(var name:String){
constructor(name:String,age:Int):this(name){
println("-------base class construct init---------")
}
open fun getName(){ // open修饰方法,才允许子类重写
println("I'm base class")
} fun getHello(){//普通方法无法重写
//......
}
} //子类继承重写方法
class Student:BaseP{
constructor(name:String,age:Int,no:String,score:Int):super(name,age){
println("-------construct init---------")
println("name: ${name} age: ${age} num: ${no} score: ${score}")
} override fun getName() {
println("I'm student!")
}
}

接口定义及实现:

//接口定义,接口内可以有非抽象方法或属性
interface MyInterface {
val prop: Int // abstract
val name:String fun foo(){
print("MyInterface foo")
}
} //接口实现
class MyImpl1:MyInterface{
override val prop: Int
get() = 18 override val name: String
get() = "james bond" override fun foo() {
// super.foo()
print("MyImpl1 foo method")
}
}

多接口定义相同方法时,子类实现 对父类调用

interface IA {
fun foo() {
print( "A" )
} fun bar()
} interface IB {
fun foo() {
print( "B")
} fun bar() {
print("bar" )
}
} class D:IA,IB{
override fun foo() {
super<IA>.foo()//调用父类IA方法
super<IB>.foo()//调用父类IB方法 } override fun bar() {
super<IB>.bar()
}
}

类的扩展:

Kotlin 除了通过继承,组合等还可以通过自身扩展特性对一个类的属性和方法进行扩展,且不需要继承
扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响

class User(var name:String){

    fun member(){ print("member: ${name}") }

}

	//扩展函数
fun User.printName(){
print("name= $name")
}
//扩展函数和成员函数一致,则使用该函数时,会优先使用成员函数
fun User.member(){
print("add member!")
}

扩展系统类函数

//Extension functions
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1] // 'this' 代表当前扩展对象实例
this[index1] = this[index2]
this[index2] = tmp
}

对一个类的扩展提高了灵活性,同时可以替换部分工具类

kotlin内有许多扩展实现,如文件扩展,这里实现了元Java FileUtil的功能

fun handle_file(fileName :String,fileContent :String,fileContentAsArray:ByteArray){
File(fileName).writeText(fileContent)
File(fileName).writeBytes(fileContentAsArray) File(fileName).printWriter().use { out -> out.println(fileContent) }
File(fileName).bufferedWriter().use { out -> out.write(fileContent) } // Reads a file line by line
File(fileName).forEachLine { println(it) }
//read all lines
File(fileName).bufferedReader().readLines()
//we can convert that into bytes, and then into a complete String
File(fileName).inputStream().readBytes().toString(Charsets.UTF_8)
//Reads the entire content of the file as a String
File(fileName).readText(Charsets.UTF_8) //手动调用文件写操作
val ft = File(fileName)
ft.inputStream().use { input ->
val result = ByteArray(1024*5)
var offset = 0
var remaining = ft.length().toInt()
while (remaining > 0) {
val read = input.read(result, offset, remaining)
if (read < 0) break
remaining -= read
offset += read
}
}
//file dir scan
File("fdir").walkTopDown().forEach { println("${it.path}-isDir:${it.isDirectory}") }
//file dir1 to dir2
File("fcopySrcDir").copyRecursively(File("fcopyTarget"),overwrite = true)
//file dir delete
File("fdelSrcDir").deleteRecursively() }

activity 扩展应用

fun <T : View> Activity.find(@IdRes id: Int): T {
return findViewById(id) as T
} TextView label = find(R.id.label);
Button btn = find(R.id.btn);

可以看出扩展之后,编写代码更加便捷了

Kotlin学习-类(嵌套类,内部类,数据类,静态类)及类扩展的更多相关文章

  1. Kotlin学习笔记(9)- 数据类

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...

  2. Util应用程序框架公共操作类(一):数据类型转换公共操作类(介绍篇)

    本系列文章将介绍一些对初学者有帮助的辅助类,这些辅助类本身并没有什么稀奇之处,如何能发现需要封装它们可能更加重要,所谓授之以鱼不如授之以渔,掌握封装公共操作类的技巧才是关键,我会详细说明创建这些类的动 ...

  3. kotlin中的嵌套类与内部类

    Java中的内部类和静态内部类在Java中内部类简言之就是在一个类的内部定义的另一个类.当然在如果这个内部类被static修饰符修饰,那就是一个静态内部类.关于内部类 和静态内部类除了修饰符的区别之外 ...

  4. Kotlin学习快速入门(3)——类 继承 接口

    类 参考链接 类定义格式 使用class关键字定义,格式如下: class T{ //属性 //构造函数 //函数 //内部类 } Java Bean类 java bean类 //java bean类 ...

  5. Java7编程 高级进阶学习笔记--嵌套类

    定义: 在一个类中定义的类叫做嵌套类. 作用: 1.允许对相关类进行逻辑分组 2.增强了代码的封装性 3.使代码具有更强的可读性和维护性 使用方式: package com.cmz.baseTest; ...

  6. C++学习之嵌套类和局部类

    C++学习之嵌套类和局部类 局部类 在一个函数体内定义的类称为局部类. 局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关.在定义局部类时需要注意:局部类 ...

  7. Java学习笔记-嵌套类

    嵌套类 嵌套类有两种类别:static and non-static,分别对应为静态嵌套类和内部类. class OuterClass { ... static class StaticNestedC ...

  8. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  9. 基于RTP的H264视频数据打包解包类

    from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...

  10. Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流)

    1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creat ...

随机推荐

  1. 实施 GitOps 的三个关键步骤

    GitOps 是一种自动化和管理基础架构和应用程序的模型,通过许多团队已经使用的相同 DevOps 最佳实践来形成的模型,例如版本控制.代码审查和 CI/CD 流水线.在实施 DevOps 时,我们找 ...

  2. 前端h5适配刘海屏和滴水屏

    前端适配苹果刘海屏,安卓刘海屏水滴瓶 其实w3c早就为我们提供了解决方法(CSS3新特性viewport-fit) 在w3c.org官方给出的关于圆形展示(Round display)的标准中, 提到 ...

  3. Redis基本操作(2)

    一.list类型 列表的元素类型为string 按照插⼊顺序排序 增加.修改 例1:在左侧插⼊数据 lpush key value1 value2 ... 例2:在右侧插⼊数据 rpush key v ...

  4. BFS广度优先搜索例题分析

    洛谷P1162 填涂颜色 题目描述 由数字 \(0\) 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 \(1\) 构成,围圈时只走上下左右 \(4\) 个方向.现要求把闭合圈内的所有空间都填写成 \ ...

  5. JQuery拖拽移动

    /** * zzh_2022032101_拖拽移动 * @param obj 目标对象 / #id / .class * @param moveOut 是否可以移出边界 */ function dra ...

  6. 微机原理与系统设计笔记2 | 8086CPU结构与功能

    打算整理汇编语言与接口微机这方面的学习记录.本部分讲解8086CPU的结构和基本功能以及特性. 参考资料 西电<微机原理与系统设计>周佳社 西交<微机原理与接口技术> 课本&l ...

  7. py教学之元组

    元组介绍 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号 ( ),列表使用方括号 [ ]. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. tup1 = ...

  8. 【随笔记】NDK 编译开源库 nghttp2/openssl/curl

    工作中有遇到需要使用支持 http2 访问的 https 安全加密的开源库,便于使用 http2 与云端通信,经过调研发现 libcurl 可以满足需求,但是 libcurl 本身也是需要依赖于 ng ...

  9. ChatGPT保姆级注册教程

    ChatGPT保姆级注册教程 最近几天OpenAI发布的ChatGPT聊天机器人火出天际了,连着上了各个平台的热搜榜.这个聊天机器人最大的特点是模仿人类说话风格同时回答大量问题. 有人说ChatGPT ...

  10. typora配置图床

    PicGo无法上传图片,报下图错误 Error: Error in repo name 这里我使用图床是gitee 上传之前需要安装插件 解决方法: 最后一步:配置typora, 点击验证图片选项,查 ...