嵌套类
与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?) {
}
})
}
}