2021-04-05 setter getter方法 inClass内部类等

/**

  属性默认提供了setter方法和getter方法

  setter方法 提供给外部设置值的一个接口/方法(存值)

  getter方法  提供给外部访问值的方法(取值)

  val声明的变量 默认只有getter方法

  var声明的变量 setter/getter方法都有

  系统默认提供的set方法实现

  fun setWeight(aWeight:Int){

weight = aWeight

}

  系统默认提供的get方法实现

  fun getWeight():Int{

return weight

}

  有些时候需要自己重写get和set方法

当获取一个属性的值时,需要做额外的事情

或者给一个属性设置值时,需要做额外的事情

属性真正存数据的地方:数据域

*/

class Animal{

val color:String ="黑色"

    var weight:Int =100

        set(value) {

//value就是外部传递过来的值

            //1.把传递过来的值复制给数形变量

              field = value +1

            //2.做额外的事情

        }

get() {

return field -1

        }

var name:String ="动物"

}

fun main() {

val dog1 = Animal()

val dog2 = Animal()

dog1.weight =30

}


inClass内部类

class Shape{

var sideCount =0

    fun perimeter():Int{

return 0

    }

companion object{

var cornercount =3

    }

//普通的内部类(这里命名有问题 不要学)

    //这个类和外部类没有任何关系  唯一的就是写在外部类的内部

    //类似于静态类 当外部类被加载的时候就会被加载进来

    class inClass{

//普通内部类无法直接访问外部类的普通属性和方法

        //sideCount = 20\

        init {

cornercount

        }

}

//内部类

    //普通的实例类,必须有外部类的一个对象才能访问

    //内部类可以访问外部类的属性和方法

    inner class DoSomethingClass{

init {

sideCount =3

            perimeter()

}

}

}

fun main() {

val shape = Shape()

val inclass =Shape.inClass()

val innerclass = Shape().DoSomethingClass()//其实就是先建立innerclass这个对象在调用内部类

}


inheritance 继承

/**

  面向对象三大特性:封装 继承 多态

  a : b

  父类b

  子类a

    类默认不能被继承

    使用open修饰这个类才能被继承

默认情况下,父类的属性和方法都是受保护的

    purblic protected  private

    父类中私有的属性和方法,子类无法继承

    //自定义控件/View/ViewGroup

  父类的属性和方法默认是final不能被继承 要用open继承

什么时候需要重写  当子类的实现和父类的实现不相同 就需要重写

  java:extends

  Kotlin  使用":"

*/

open class Animal(val name: String){

constructor(name: String,color:String):this(name){

}

    var color:String ="黑色"

    open fun sleep(){

println("动物前准备")

}

}

class Dog(name: String):Animal(name,"baise"){

constructor(name: String,age:Int):this(name)

override fun sleep(){

super.sleep()

println("小狗在狗窝里睡")

color ="白色"

        }

}

/**

* 对象的调用顺序

* 0.主构造函数

* 1.创建属性

* 2.init代码块

* 3.次构造函数

*

* this  当前对象

* 指明需要调用当前(自己)对象的属性/方法

* 用来区分全局和局部

* 用来区分当前类还是父类

*

* super:父类

* 当子类的实现需要调用父类的时候使用super

*/

class Cat(hh:Int){

var age =10

    init {

println("init")

println("age = $age")

}

constructor(name:String,age:Int):this(age){

println("次构造函数")

this.age++

println("age = $age")

}

fun test(){

age =30

    }

}

fun main() {

//    val c = Cat("mm",30)

//    c.test()

//

//    val c2 = Cat("mm",30)

//    c2.test()

}

你可能感兴趣的:(2021-04-05 setter getter方法 inClass内部类等)