Kotlin学习 PART 3:类,对象和接口

= =,感觉自己写的东西没什么人看呢= =,算了,本来就是自己写给自己看的东西,尽力了就行,也不指望像鸿神一样出名= =

1.

class User constructor(_nickname:String) {
val nickname:String
init{
nickname = _nickname
}
}
constructor用来开始一个主构造方法或从构造方法的声明。
init用来引入一个初始化语句块
最简单的表示方法
class User(val:nickname:String, 
val isSubscribed:Boolean=true)//可以设置默认值


***注意:如果所有的构造方法参数都有默认值,编译器会生成一个额外的不带参数的构造方法来使用所有的默认值。这可以让Kotlin使用库是变得更简单,因为可以通过无参构造方法来实例化类。


如果有父类:
classTwitterUser(nickname:String) :User(nickname){...}


如果没有给一个类声明任何的构造方法,将会生成一个不做任何事情的默认构造方法:
open class Button
那么如果子类没有提供任何的构造方法,必须显示地调用父类的构造方法
class RadioButton:Button()


如果不希望类被其他代码实例化,必须把构造方法标记为private
class Secretive private constructor() {}


大多数在Java中需要重载构造方法的场景都被Kotlin支持参数默认值和参数命名的语法含盖了。
***不要声明多个从构造方法用来重载和提供参数的默认值,取而代之的是应该直接表明默认值。
open class View{
constructor(ctx:Context) {
//some code
}
constructor(ctx:Context, attr:AttributeSet){
//some code
}
}


从一个构造方法中调用你自己中的另外一个构造方法
class MyButton:View {
constructor(ctx:Context):this(ctx, MY_STYLE) {
//...委托给父类
}
constructor(ctx:Context, attr:AttributeSet):super(ctx, attr) {
//...委托给自己的其他构造方法
}
}


2.通过getter或者setter访问支持字段
我们希望在任何对储存在属性中的数据进行修改时输出日志,声明了一个可变属性并且在每次setter访问时执行额外的代码。
class User(val name:String) {
var address:String = "unspecified"
set(value:String) {
println("""
Address was changed for $name:
"$field" -> "$value".""".trimIndent())
field=value
}
}
在setter的函数体,使用特殊的标识符field来访问支持字段的值


3.修改访问器的可见性
class LengthCounter{
var counter:Int = 0
private set
fun addWord(word:String) {
counter+=word.length
}
}


4.==运算符是比较两个对象的默认方法:本质上说它就是通过调用equals来比较两个值的。
println(client1 == client2)


5.Kotlin中的is检查是java中的instanceof的模拟,用来检查一个值是否为一个指定的类型。


6.hashCode()
>>>val processed = hashSetOf(Client("Alice", 342562))
>>println(precessed.contains(Client("Alice", 342562)))
false


原因就是Client类缺少了hashCode方法,因此他违反了通用的hashCode契约:如果两个对象相等,他们必须有着相同的hash值


猜你喜欢

转载自blog.csdn.net/qq_31433709/article/details/80750715
今日推荐