定义类 函数 属性 以及get set方法
// 定义类
class Player {
//无参构造方法
constructor(){
}
// 有参构造方法
constructor(name : String){
this.name = name
}
var name = "bhb"
public get() = field // get方法 field关键字自动指向支持管理的字段
internal set(value){ // set方法
field = value
}
// 计算属性
var rollValue = 1
get() = (1..6).shuffled().first()
/**
* 定义方法 默认修饰符为public 一共有四种修饰符
* public 函数或属性对于外部可见
* private 函数或属性仅在自己的内部可见
* protected 函数或属性仅在类和该类的子类内部可见
* internal 函数和属性仅在同一模块内可见
*/
fun sayHello() {
println("hello $name")
}
}
// 创建类
var player = Player()
// 调用类方法
player.sayHello()
player.name = "baodaren"
println(player.name)
var player2 = Player("zhangsan");
player2.sayHello()
// 构造函数也可以这么写
class Student(_name :String){
var name = _name
fun saySomething(){
println("i am student $name")
}
}
var student = Student("bbb")
student.saySomething()
// 类名后面的是主构造函数 age为默认参数
class Teacher(var name:String, var subject :String , var age:Int = 20){
// constructor 修饰次要构造函数
constructor():this("defaultname","defaultclass")
constructor( _name:String):this(_name ,"defaultclass",22)
fun saySomething(){
println("i teacher $name teach $subject my age is $age")
}
}
var teacher = Teacher()
teacher.saySomething()
var teacher2 = Teacher("bhb" )
teacher2.saySomething()
//初始化块 用来检查创建对象时 传入参数的有效
init 方法必须要定义在属性定义之后
class Staff(var age :Int){
init {
//判断员工年龄是否大于18
require(age >= 18){ "age is too small "}
}
}
var staff = Staff(10) // 抛出异常IllegalArgumentException
// 延迟初始化
定义在class 内中的属性必须要有初始化 未经初始化的值会报错
这是因为类在完成实例化之后 你就立即可以使用对象的属性
我们可以通过使用默认值的方法
比如 var name :String = "" 附上一个空字符串
lateinit 慎用 我们可以使用该关键字 但是必须要保证在使用该属性前对该属性赋值
class Staff2(var age :Int){
lateinit var name :String
init {
//判断员工年龄是否大于18
require(age >= 18){ "age is too small "}
}
fun saySomething(){
println("i teacher $name my age is $age")
}
}
var staff2 = Staff2(20)
staff2.saySomething() // 调用该方法会抛出异常 UninitializedPropertyAccessException
// 惰性初始化
一开始不初始化 在初次使用时在初始化 一般用于复杂耗时或者耗费资源的对象
class Staff3(var age :Int){
val name by lazy { "bhb" }
fun saySomething(){
println("i teacher $name my age is $age")
}
}
var staff3 = Staff3(20)
staff3.saySomething()
继承
// java中所有类型都是Object 的子类 kotlin中所有类型都是Any 的子类
//先创建父类 使用关键字open 定义父类名 、 属性和父类方法
open class Person(){
open var name = ""
open fun saySomeThing(){
println("hello i am a persono")
}
fun helloWorld(){
println("hello world")
}
}
// 子类使用:继承父类
class Teacher : Person() {
// 使用override 覆盖父类属性
override var name = ""
get() = field
set(value) {field = value}
// 使用 override 覆盖父类方法
override fun saySomeThing(){
println("hello i am a teacher my name is $name")
}
fun teach(){
println("i can teach")
}
}
var person = Person()
person.saySomeThing()
// 创建子类
var teacher : Teacher = Teacher()
// 调用子类方法
teacher.name = "bbb"
teacher.saySomeThing()
teacher.helloWorld()
// 类型检测 使用 is 关键字
println(person is Teacher)
println(teacher is Person)
// 类型转换 使用 as 关键字
fun saysay(any: Any){
if(any is Person){
// 使用as转换
(any as Person).helloWorld()
// 智能类型转换
any.helloWorld()
}else{
println("just saysay")
}
}
saysay(teacher)