目录
- 嵌套类(静态内部类)
- Java版本
- Kotlin版本
- 内部类
inner
(非静态内部类)
- Java版本
- Kotlin版本
- 匿名内部类
嵌套类
Java版本
public class Outer { // 外部类成员变量 private String name = "Elson"; //private static String name;//静态成员变量 // 静态(嵌套)内部类 static class Inner { public String getName() { return name;// 这里会报错,因为无法获取外部类的非静态成员变量 } } } class Main { public void main() { Outer.Inner inner = new Outer.Inner(); inner.getName(); } }
Kotlin版本
class Outer { private val name: String = "Elson" //嵌套内部类 class Inner { fun getName(): String = name } } class Main { val inn: Outer.Inner = Outer.Inner() inn.getName() }
内部类
Java版本
public class Outer { // 外部类成员变量 private String name = "Elson"; class Inner { // 获取外部类成员变量 public String getName() { return name; } } } class Main { public void main() { Outer.Inner inner = new Outer().new Inner(); inner.getName();//"Elson" } }
Kotlin版本
class Outer { private val name: String = "Elson" //内部类(关键字 inner ) inner class Inner { fun getName(): String = name } } class Main { val inn: Outer.Inner = Outer().Inner() inn.getName()//"Elson" }
匿名内部类
Android中常见的匿名内部类就是各种事件的监听
class JokeDetailActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.joke_activity_joke_detail)
// ctx:扩展属性;
// 匿名内部类:object:TextWatcher {...}
EditText(ctx).addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
})
}
}
如果匿名内部类中只有一个抽象方法,可以使用Lambda表达式代替
class Main {
fun test() {
// 对应方法一
setListener {
//...
}
// 对应方法二:跟Java写法一致
setListener(object : Listener {
override fun onClick() {
//...
}
})
}
// 方法一:Lambda表达式
fun setListener(listener: () -> Unit) {}
// 方法二
fun setListener(listener: Listener) {}
interface Listener {
fun onClick()//单一抽象方法
}
}