嵌套类
与Java类似,在Kotlin中类与类可以互相嵌套,类与接口也可以互相嵌套。
class LoginContract {
private val TAG = javaClass.simpleName
class Presenter : BasePresenter<View>() {
fun login(username: String, pwd: String) {
//取不到TAG常量
}
}
}
如上代码,如果按照Java的思维,Presenter是LoginContract的内部类,可正常访问LoginContract内部成员。但实际Presenter是取不到TAG常量的,我们把代码转成Java代码看看究竟:
public final class LoginContract {
private final String TAG = this.getClass().getSimpleName();
public static final class Presenter extends BasePresenter {
public final void login(@NotNull String username, @NotNull String pwd) {
//静态内部类取不到TAG常量
}
}
}
静态内部类! 所以,在Kotlin中上面的代码叫嵌套类,是不持有外部类对象引用的。
除了类里面嵌套类,类里面也可以嵌套接口或者接口里面嵌套类。
class LoginContract {
private val TAG = javaClass.simpleName
interface View {
fun loginResult(loginResult: Any)
}
}
//转成Java代码
public final class LoginContract {
private final String TAG = this.getClass().getSimpleName();
public interface View {
void loginResult(@NotNull Object loginResult);
}
}
内部类
到这里有些同学就有疑问了,之前Java中持有外部类对象引用的内部类到哪里去了? 其实在Kotlin中它有另外的一种写法: 标记为inner的嵌套类能够访问其外部类的成员,会持有外部类对象的引用。
class LoginContract {
private val TAG = javaClass.simpleName
//inner的嵌套类持有外部类对象的引用
inner class Presenter : BasePresenter<View>() {
fun login(username: String, pwd: String) {
//可正常访问TAG
print(TAG)
}
}
}
转成Java代码看看:
public final class LoginContract {
private final String TAG = this.getClass().getSimpleName();
public final class Presenter extends BasePresenter {
public final void login(@NotNull String username, @NotNull String pwd) {
System.out.print(TAG);
}
}
}
熟悉的感觉回来了。
匿名内部类
在kotlin中使用对象表达式创建匿名内部类:
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val btn = Button(MeUtils.getInstance().context)
//匿名内部类
btn.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
}
})
}
}
本文介绍了Kotlin中的嵌套类和内部类的区别。在Kotlin中,嵌套类不持有外部类的引用,而inner类则可以访问外部类的成员并持有引用。同时,文章还提到了匿名内部类的使用,展示了如何通过对象表达式创建匿名内部类。
1165

被折叠的 条评论
为什么被折叠?



