面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,基于“对象”的概念来设计和构建软件系统。OOP有几个核心特征,这些特征帮助开发者构建模块化、可重用和可维护的代码。
1. 封装(Encapsulation)
定义
封装是将数据(属性)和操作数据的方法(行为)绑定在一起,限制对内部数据的直接访问,只通过公开的方法(接口)来操作数据。
优点
数据保护:防止外部代码直接修改对象的内部状态,确保数据的完整性和安全性。
隐藏实现细节:只暴露必要的接口,隐藏实现细节,减少代码之间的耦合。
提高可维护性:通过接口与实现分离,修改内部实现不会影响外部代码。
class Person {
private var name: String = "John Doe"
fun getName(): String {
return name
}
fun setName(newName: String) {
if (newName.isNotBlank()) {
name = newName
}
}
}
fun main() {
val person = Person()
println(person.getName()) // 输出:John Doe
person.setName("Jane Doe")
println(person.getName()) // 输出:Jane Doe
}
2. 继承(Inheritance)
定义
继承是一个类(子类)从另一个类(父类)继承属性和方法,子类可以扩展或重写父类的行为。
优点
代码重用:通过继承,子类可以重用父类的代码,减少重复代码。
层次结构:通过继承,可以建立类的层次结构,体现类之间的关系。
open class Animal {
open fun makeSound() {
println("Animal makes a sound")
}
}
class Dog : Animal() {
override fun makeSound() {
println("Dog barks")
}
}
fun main() {
val dog = Dog()
dog.makeSound() // 输出:Dog barks
}
3. 多态(Polymorphism)
定义
多态是指同一个接口或方法可以有不同的实现,具体的实现由调用时的对象类型决定。
优点
接口统一:通过多态,可以用统一的接口来调用不同的实现,提高代码的灵活性和可扩展性。
减少耦合:通过多态,可以减少代码之间的耦合,提高代码的可维护性。
open class Animal {
open fun makeSound() {
println("Animal makes a sound")
}
}
class Dog : Animal() {
override fun makeSound() {
println("Dog barks")
}
}
class Cat : Animal() {
override fun makeSound() {
println("Cat meows")
}
}
fun main() {
val animals: List<Animal> = listOf(Dog(), Cat())
for (animal in animals) {
animal.makeSound()
}
// 输出:
// Dog barks
// Cat meows
}
4. 抽象(Abstraction)
定义
抽象是指将对象的共性提取出来,形成抽象的类或接口,而不关注具体的实现细节。
优点
简化复杂性:通过抽象,可以简化复杂系统的设计,突出核心功能。
提高可维护性:通过抽象,可以将实现细节与接口分离,修改实现不会影响接口。
abstract class Shape {
abstract fun area(): Double
}
class Circle(private val radius: Double) : Shape() {
override fun area(): Double {
return Math.PI * radius * radius
}
}
class Rectangle(private val width: Double, private val height: Double) : Shape() {
override fun area(): Double {
return width * height
}
}
fun main() {
val shapes: List<Shape> = listOf(Circle(5.0), Rectangle(4.0, 6.0))
for (shape in shapes) {
println("Area: ${shape.area()}")
}
// 输出:
// Area: 78.53981633974483
// Area: 24.0
}