1,Java不能函数内部定义函数;
为什么要有嵌套函数?
让一些代码块独立,不让外部和内部的其他方法访问,但要注意:(1)如果嵌套函数内部想访问其他嵌套函数,必须是在其他嵌套函数定义之后;(2)嵌套函数可以访问外部的属性。
2,kotlin与Java一大区别:扩展函数与属性。
思考:如何在已有类基础上添加属性和方法?
继承,扩展,
(一)扩展方法
kotlin&Java默认没有open的就是final的,即不能被继承,也就无法通过继承添加属性和方法eg:String类,并且系统默认的final或open属性是不能更改的,但是kotlin可以扩展属性和方法。
kotlin扩展函数模版格式:fun 扩展的类名.扩展函数函数名(参数):返回类型{};
补充:变量.函数名().sout可以直接输出函数的返回值;
注意:
-1,扩展函数并没有在扩展类中添加对应的方法!
-2,扩展函数通常定义在外部(顶层函数),即不定义在一个类的内部,一处定义,多处可调用;kotlin中可以给所有类添加方法,eg:给Any类添加show方法:fun Any.show(){println(this)}(Java不行,因为Java只能单继承);
-3,只有这个类或者子类可以访问这个类的扩展函数;
-4,如果扩展函数和原有类的成员函数重名,原有函数的优先级更高;
-5,若要扩展类/静态方法,则格式eg:fun father.Companion.test(){}
(二)扩展属性
格式eg:var Person .name:String(注意不能直接用“=”初始化),初始化用getter方法。
注意:扩展属性不是真的添加属性,不提供默认的变量field,因此无法存值,要给值的话用return,实现的本质:在里面创建对应的set和get方法,即扩展set,get方法(前提是var)。
思考:那无法存值的话扩展属性有啥用?
给机会干事,通过扩展的一个属性做些事情,通过get,set方法触发某一任务。
注意:若扩展属性与原类中的一个属性重名,则原属性优先级更高。
3,继承
思维:写程序不能太多继承,否则耦合性太紧密,不够灵活。
(1)Java&kotlin只能单继承,如果一定要多继承,则用接口;
(2)kotlin类默认属性和方法都是final,不能被继承,如果需要继承重写则使用关键字open
(3)
-1,如果父类只有默认构造函数
a.class Child:Father1();
b.class Child:Father1{ constructor(age;Int){} }
-2,父类有构造函数(主,次)
a.//⽗类
open class Father1(val name:String)
//⼦类
class Child(name:String): Father1(name)
b.//⽗类
open class Father1(val name:String)
//⼦类
class Child: Father1{
constructor(name: String):super(name){}
}
4,重写
子类重写父类,父类方法前要加open,再在子类重写方法时会自动加上override,若重写函数中仍需调用父类的super,eg:super.startEngine(),super指父类的对象
补充this:访问自己的属性或者方法,指调用这个方法的对象
上图第一个this指类对象,第二个this指伴随对象,静态方法里不能访问属性和对象方法,
网友评论