转载请注明出处:王亟亟的大牛之路
开篇之前还是老规矩,先安利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