Kotlin中类是否与Java一样存在封装、继承、多态?
一、核心结论Kotlin 完整支持面向对象三大特性封装、继承、多态设计思想和 Java 一致但语法规则、默认行为、关键字有大量差异很多坑点需要区分。二、封装访问控制、数据隐藏1. 访问修饰符对比修饰符JavaKotlin作用范围public默认默认全部可见private当前类内当前类内仅本类访问protected本类子类本类子类同一包子类可访问default(包私有)同包可见无此修饰符Kotlin 不提供包私有internal无Kotlin独有同一模块内可见2. Kotlin 封装特色属性自带 getter/setter天然封装Java 需要手动写 get/setKotlin 自动生成还能自定义访问器classUser{varage:Int0set(value){if(value0)fieldvalue}valname:Stringtest// 只读只有getter无setter}val / var 区分只读/可变强化封装val等同于 Java final 字段外部无法修改数据类 data class封装数据自动生成 equals、toString、拷贝私有化构造函数实现单例、禁止外部实例化classManagerprivateconstructor()3. 与 Java 封装区别Kotlin 没有包私有新增internal模块级可见字段不会直接暴露访问必然走 getter封装更彻底无需大量模板代码。三、继承1. 核心规则差异重点Java 类默认可继承Kotlin 类默认final不可继承Kotlin 想要被继承必须显式加open// Java 默认能被继承classParent{}openclassParent// 不加open无法子类继承classSon:Parent()方法同理普通方法默认 final重写需父类open、子类override单继承和 Java 一致只能继承一个父类不支持多类继承构造函数继承Java 子类构造第一行必须super()Kotlin 在子类父类声明处直接调用构造Son : Parent(参数)抽象类abstract class和 Java 作用一致不能实例化可包含抽象方法接口interfaceJava 8 前接口只有抽象方法Kotlin 接口可带属性、实现方法一个类可实现多个接口弥补单继承限制。2. 代码示例openclassAnimal(name:String){openfunspeak(){}}classDog(name:String):Animal(name){overridefunspeak(){println(汪汪)}}四、多态Kotlin 完全支持多态分为方法重写多态、接口多态逻辑和 Java 完全一致。1. 多态实现条件和Java相同存在继承/实现关系父类/接口方法open子类重写override父类引用指向子类对象。2. 示例openclassAnimal{openfunspeak()println(动物叫声)}classCat:Animal(){overridefunspeak()println(喵喵)}classBird:Animal(){overridefunspeak()println(叽叽)}funmain(){// 父类引用接收不同子类多态体现vala1:AnimalCat()vala2:AnimalBird()a1.speak()// 喵喵a2.speak()// 叽叽}3. 接口多态常用interfacePlay{fungame()}classBoy:Play{overridefungame()println(打游戏)}classGirl:Play{overridefungame()println(画画)}funplayGame(p:Play){p.game()}// 传入不同实现类多态分发playGame(Boy())playGame(Girl())五、补充Kotlin 独有的面向对象补充特性Java没有密封类 sealed class限制继承范围强化多态分支判断枚举类 enum class语法更简洁对象表达式 object匿名内部类简化多态临时实现委托 by语法快速实现接口代理简化多态代码。六、总结封装完整支持新增 internal、自动get/set、val只读封装能力强于Java继承规则大体一致唯一关键区别Kotlin 类/方法默认 final需 open 才能继承重写同样单类继承、多接口实现多态底层原理、使用场景和 Java 完全相同依靠重写 父类引用指向子类实现Kotlin 只是优化语法没有删减面向对象三大基础特性。