Kotlin基礎 — 巢狀類、內部類

Elson_6發表於2018-03-01

官方文件:Nested and Inner Classes

目錄

  1. 巢狀類(靜態內部類)
    • Java版本
    • Kotlin版本
  2. 內部類 inner (非靜態內部類)
    • Java版本
    • Kotlin版本
  3. 匿名內部類

巢狀類

  1. 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();
        }
    }
    複製程式碼
  2. Kotlin版本
    class Outer {
        private val name: String = "Elson"
        //巢狀內部類
        class Inner {
            fun getName(): String = name
        }
    }
    
    class Main {
    	val inn: Outer.Inner = Outer.Inner()
        inn.getName()
    }
    複製程式碼

內部類

  1. 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"
        }
    }
    複製程式碼
  2. 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()//單一抽象方法
    }
}
複製程式碼

相關文章