参考链接
类定义格式使用class关键字定义,格式如下:
class T{ //属性 //构造函数 //函数 //内部类 } Java Bean类 java bean类 //java bean类 public class Student { private String name; private int age; public Student() { } public Student(String name) { this.name = name; } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } java bean类(kotlin实现) //kotlin写法,get和set方法默认实现 class Student { /注意,这里的var代表着变量的数值之后可以被修改,也可以使用只读val //?是可为空的写法,后面会提到 //这里其实包含了主构造方法,不过因为主构造方法为空,所以省略了 var name: String? = null var age: Int = 0 //这几个constructor是次级构造方法 constructor() {} constructor(name: String) { this.name = name } constructor(name: String, age: Int) { this.name = name this.age = age } } //下面是没有省略主构造方法的 //注意,因为把默认的主构造方法写了出来,所以,不允许出现无参数的次构造方法 class Student public constructor() { //注意,这里的var代表着变量的数值之后可以被修改,也可以使用只读val //?是可为空的写法,后面会提到 //这里其实包含了主构造方法,不过因为主构造方法为空,所以省略了 var name: String? = null var age: Int = 0 //这几个constructor是次级构造方法 constructor(name: String) : this() { this.name = name } constructor(name: String, age: Int) : this(){ this.name = name this.age = age } } 主函数调用 //主函数调用 fun main(args: Array<String>){ //声明类不需要new关键字 val student = Student("star",12) //,使用对象.属性名调用,而不是使用get或set println(student.age)//获得属性 student.name = "stars"//修改属性 } 主构造方法(kotlin)kotlin类中可以有主构造方法和次构造方法,次构造方法也就是上面那段使用kotlin实现的Java Bean类(上面的主构造方法其实是省略了的)
/*下面三种方法都是声明了一个Student类 *Student包含了一个构造方法(两个参数),还有两个成员变量以及成员变量对应的get和set方法 */ //原始方式,使用主构造方法 class Student public constructor(name: String,age: Int) { //注意,这里的var代表着变量的数值之后可以被修改,也可以使用只读val var name = name var age = age } //简洁写法,如果主构造方法只有默认的修饰符(public,默认的修饰符可省略),可以把constructor省略 class Student(name: String,age: Int) { var name = name var age = age } //更简洁写法 class Student(var name: String,var age: Int) { } //使用Student类 fun main(args: Array<String>) { //声明类不需要new关键字 val student = Student("star",12) println(student.name) println(student.age) student.age = 19 //修改内容 println(student.age) } init(初始化块)如果我们想要在主构造方法进行初始化操作,需要在init代码块里面写我们的代码,如
//更简洁写法 class Student(var name: String,var age: Int) { init{ println("这里是初始化操作") } }注意,初始化块是主构造方法的一部分
初始化操作会在次构造方法之前执行,即使没有写主构造方法,如:
class Student{ var name: String? = null var age: Int = 0 init{ println("这里是初始化操作") } constructor(name: String, age: Int) { this.name = name this.age = age } } 主/次构造方法联合使用类定义了主构造器,次构造器必须直接或间接调用主构造器;
class Student() { var name: String? = null var age: Int = 0 //这几个constructor是次级构造方法,,这里的this()就是当前的主构造方法 constructor(name: String) : this() { this.name = name } constructor(name: String, age: Int) : this(){ this.name = name this.age = age } } class Student public constructor() { var name: String? = null var age: Int = 0 //这几个constructor是次级构造方法,,这里的this()就是当前的主构造方法 //这里用专业术语说,是次级构造方法需要委托给主构造方法 constructor(name: String) : this() { this.name = name } constructor(name: String, age: Int) : this(){ this.name = name this.age = age } } 伴生方法(静态方法) class Student{ ... companion object { @JvmStatic //下面定义一些方法 fun sayHello() { println("hello") } } } get/set方法修改看完上面,我们都知道kotlin默认帮我们实现了get和set方法,val修饰的变量是只读的,所以该变量没有setter方法
格式:
var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>] //表达式写法 get() = ... //花括号写法 get(){ ... return xx } class Student() { var name: String = "" var age: Int = 0 //这里使用val val isNameEmpty: Boolean get() = name.length==0 //使用var就得赋值 //val isNameEmpty: Boolean // get() = name.length==0 constructor(name: String) : this() { this.name = name } constructor(name: String, age: Int) : this(){ this.name = name this.age = age } }