分享下学习Kotlin的历程-构造函数/抽象类/枚举
来源:互联网 发布:万得数据 编辑:程序博客网 时间:2024/06/03 19:40
转载请注明出处:王亟亟的大牛之路
开篇之前还是老规矩,先安利https://github.com/ddwhan0123/Useful-Open-Source-Android 还是尽量每天做更新和维护
Kotlin和Java一样支持多构造函数的姿势,并且对属性对get/set方法进行了二次封装
这一篇,也通过简单的demo来讲一下相关知识
构造函数
在说Kotlin构造函数之前先提一提Java的构造函数和实例方法那些事
构造方法和实例方法的区别:
主要的区别在于三个方面:修饰符
、返回值
、命名
1、和实例方法一样,构造器可以有任何访问的修饰符,public、private、protected或者没有修饰符
,都可以对构造方法进行修饰。不同于实例方法的是构造方法不能有任何非访问性质的修饰符修饰,例如static、final、synchronized、abstract等都不能修饰构造方法。2、返回类型是非常重要的,实例方法可以返回任何类型的值或者是无返回值(void),而构造方法是没有返回类型的,void也不行。
3、至于命名就是构造方法与类名相同,当然了实例方法也可以与类名相同,但是习惯上我们为实例方法命名的时候通常是小写的,另一方面也是与构造方法区分开。
而构造方法与类名相同,所以首字母一般大写。
Kotlin的构造函数相对来说就更简便
如果是无参数的就和java中的 类定义一摸一样
class Wjj
如果是有参数的,就直接加在类名后面,像这样
class Wjj(userName:String,age:Int)
因为无法在主构造函数中做高端操作,所以提供了一个init{}的姿势来解决一些 初始化的问题,像这样
init { println("----> "我是init") }
Kotlin也支持多个构造函数,但是都是会继承主构造函数,像这样
open class Student(var name: String) { init { if (name.equals("wjj")) { name = "王亟亟" } println("----> Student 构造函数 name " + name) } var age: Int = 0 var sex: Boolean = true get() { return !name.equals("王亟亟") } constructor(name: String, age: Int) : this(name) { this.age = age } constructor(name: String, age: Int, sex: Boolean) : this(name) { this.age = age this.sex = sex }}
类定义时默认是final属性,不可被继承。若需要继承,使用open关键字进行修饰。
这一点在之前的文章也有提过
Kotlin也提供了,对参数预设值的姿势,极大的避免了 我们那些空指针的恶心姿势,像这样
open class Grade(var GradeStr: String = "没名字") {}
那么当你创建对象的时候,不传参也就不会报错了,像这样
val grade = Grade()等同于val grade = Grade("")
抽象类
Kotlin中的抽象类允许有abstract
修饰的成员方法,非抽象类不允许有抽象方法
abstract class Wjj{ abstract fun hellow()}class Wmm{ abstract fun hellow() // 编译错误}
抽象类默认是可被继承的,接口是特殊的抽象类,允许有抽象方法:
interface Wjj{ abstract fun hellow()}
枚举类
Kotlin也支持枚举,每个枚举常量都是一个对象
enum class Direction { NORTH, SOUTH, WEST, EAST}
由于每个枚举都是枚举类的实例,因此可以进行初始化
enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF)}
部分模块模块知识点来源于:https://www.kotlincn.net/docs/reference/enum-classes.html
ok,废话讲完了,这下拿例子解释下
新建三个类
可被继承的学生类 Student.kt
open class Student(var name: String) { //初始化方法 init { if (name.equals("wjj")) { name = "王亟亟" } println("----> Student 构造函数 name " + name) } var age: Int = 0 var sex: Boolean = true//修改引用的值 get() { return name != "王亟亟" } constructor(name: String, age: Int) : this(name) { this.age = age } constructor(name: String, age: Int, sex: Boolean) : this(name) { this.age = age this.sex = sex }}
继承于学生类的班级类 Classes.java
public class Classes extends Student { //学生人数 private int StudentNumber; //班名 private String ClassName; //年级 private int GradeNumber; //年级中文名 private String GradeStr; public Classes(String name) { super(name); this.ClassName = name; } public Classes(String name, int age) { super(name, age); } public Classes(String name, int age, boolean sex) { super(name, age, sex); } public int getStudentNumber() { return StudentNumber; } public void setStudentNumber(int studentNumber) { StudentNumber = studentNumber; } public String getClassName() { return ClassName; } public void setClassName(String className) { ClassName = className; } public int getGradeNumber() { return GradeNumber; } public void setGradeNumber(int gradeNumber) { GradeNumber = gradeNumber; } public String getGradeStr() { return GradeStr; } public void setGradeStr(String gradeStr) { GradeStr = gradeStr; }}
年级类:Grade.kt
open class Grade(var GradeStr: String = "没名字") { var flag = false var GradeNumber: Int = 0 get() { return if (flag) { 9 } else { 10 } } init { println("----> Grade 构造函数 GradeStr " + GradeStr) } constructor(GradeStr: String, GradeNumber: Int = 7) : this(GradeStr) { this.GradeNumber = GradeNumber println("----> Grade 次构造函数 GradeNumber " + GradeNumber) }}
调用的方法:
var classes = Classes("三年级二班") Log.d("----> ", "SecondActivity onResume classes " + classes.className) var student = Student("wjj", 20, true) Log.d("----> ", "SecondActivity onResume student sex " + student.sex) val grade = Grade() Log.d("----> ", "SecondActivity onResume Grade GradeNumber " + grade.GradeNumber)
打印结果:
----> Student 构造函数 name 三年级二班---->: SecondActivity onResume classes 三年级二班----> Student 构造函数 name 王亟亟---->: SecondActivity onResume student sex false----> Grade 构造函数 GradeStr 没名字---->: SecondActivity onResume Grade GradeNumber 10
源码地址:https://github.com/ddwhan0123/KotlinAndroidDemo
- 分享下学习Kotlin的历程-构造函数/抽象类/枚举
- 分享下学习Kotlin的历程-环境/简单使用
- 分享下学习Kotlin的历程-变量/数据类型(1)
- 分享下学习Kotlin的历程-数据类型(2)
- 分享下学习Kotlin的历程-访问作用域/类修饰词/继承
- kotlin的 类,继承,重载,抽象类,构造函数
- 分享下学习Kotlin的历程-开始写逻辑吧 if/for/while/when
- Kotlin学习记录(二)—— Kotlin的变量、属性、类、构造函数、继承、方法
- 抽象类的构造函数
- 抽象类的构造函数
- 关于抽象类中构造函数的一些学习
- Kotlin学习之枚举类
- 抽象类构造函数
- Idea下kotlin的抽象类和继承,多态
- java枚举类的构造函数
- C++ Primer 学习笔记_52_类与数据抽象 -构造函数【下】
- C#抽象类的构造函数
- java抽象类构造函数的含义
- Failover vs Failfast vs Failback vs Failsafe
- DNS 定义和选择
- Sublime Text3/2使用windows编译器编译和运行C/C++程序
- 数据库类型
- Ubuntu虚拟机网络设置
- 分享下学习Kotlin的历程-构造函数/抽象类/枚举
- iOS开发之UIAlertController的使用
- liunx WordPress 安装(超详细)
- hash_map
- 把一个c类的网络地址192-168-1-0划分为6个子网,请计算出...
- 欢迎使用CSDN-markdown编辑器
- Python time strftime()方法
- vuex下state数据的存储
- 二叉树求序