Kotlin基础 — 嵌套类、内部类

1,786 阅读1分钟

官方文档: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()//单一抽象方法
    }
}