目錄
- 巢狀類(靜態內部類)
- 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()//單一抽象方法
}
}
複製程式碼