类
1.1 类的构造
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Kotlin写法与Java写法的区别
1 Kotlin省略了关键字public,源于它默认是开放的
2 Kotlin用冒号“:”代替extends,也就是通过冒号表示继承关系
3 Kotlin进行继承时,父类后面多了括号"()"
4 Kotlin对类进行初始化的函数名称叫init.
5 Kotlin打印日志叫println()
6 K..在创建实例省略了关键字new.
1.2 类的构造函数
直接上代码:
class Animal constructor(context: Context,name:String){
init {
println("Animal:这是动物")
}
constructor(context: Context, name:String,sex:Int): this(context,name){
var sexName:String= if (sex==0) "公" else "母"
println("Animal:这是动物 hahaha $sexName")
}
}
使用
val btn:Button =findViewById(R.id.btn_base);
btn.setOnClickListener{
var animal=Animal(this,"Hello")
val animal2=Animal(this,"HeiHei",0)
tv_base.text="WWWWWWWWWWW"
}
日志:
2895-2895/com.data.basekotlin I/System.out: Animal:这是动物
2895-2895/com.data.basekotlin I/System.out: Animal:这是动物
2895-2895/com.data.basekotlin I/System.out: Animal:这是动物 hahaha 公
分析:init会出现两次 原因:二级构造函数从属于主构造函数
修改:
class AnimalSeparate {
constructor(context:Context,name: String){
println("这是只$name")
}
constructor(context: Context,name: String,sex:Int){
var sexName:String= if(sex==0) "公" else "母"
println("ljt,这是${name}是${sexName}的")
}
}
两个二级构造函数没有从属关系。
2.伴生对象
Kotlin取消了static,引入了伴生对象,理解为“影子”,利用它可以间接 实现静态成员的功能。
class WildAnimalCompanion (var name:String,val sex:Int=0) {
var sexName:String
init {
sexName=if (sex==0) "公" else "母"
}
fun getDesc(tag:String):String{
return "欢迎来到$tag: 这只${name}是${sexName}的"
}
companion object WildAnimal{
fun jedgeSex(sexName:String):Int{
var sex:Int = when (sexName){
"公","雄" -> 0
"母","雌" -> 1
else -> -1
}
return sex
}
}
}
使用:
val btn:Button =findViewById(R.id.btn_base);
val sexArray:Array<String> = arrayOf("公","母","雄","雌")
btn.setOnClickListener{
// var animal= AnimalSeparate(this, "Hello")
// val animal2= AnimalSeparate(this, "HeiHei", 0)
// tv_base.text="WWWWWWWWWWW"
var count:Int=1
var sexName:String=sexArray[count++%4]
tv.text="\"$sexName\"对应的类型是${WildAnimalCompanion.jedgeSex(sexName)}"
}
3 成员属性
成员属性: 既然属性字段和构造函数的入参存在一一对应关系,那么可以通过某种机制让编译器自动对其命名与赋值。
class WildAnimalCompanion (var name:String,val sex:Int=0) {
}
class WildAnimalMember(var name:String,val sex:Int=0) {
var sexName:String
init {
sexName= if (sex==0) "公" else "母"
}
}
使用:
var count:Int=1
var animal = when(count %2){
0 -> WildAnimalMember("gong")
else -> WildAnimalMember("gong",12)
}
tv.text="这只${animal.name}是${animal.sexName}的"
4 成员方法
class WildAnimalMember(var name:String,val sex:Int=0) {
var sexName:String
init {
sexName= if (sex==0) "公" else "母"
}
fun getDesc(tag:String):String{
return "欢迎$tag:这只是${name}是${sexName}的"
}
}
使用:
var count:Int=1
var animal = when(count %2){
0 -> WildAnimalMember("gong")
else -> WildAnimalMember("gong",12)
}
tv.text="这只${animal.name}是${animal.sexName}的 ${animal.getDesc("动物园")}"