Java进阶封装、继承、多态、抽象
一、封装(Encapsulation)
概念
封装是面向对象编程的基本特性之一,它通过将对象的状态(属性)和行为(方法)包装在一起,对外隐藏对象的内部细节,只暴露必要的接口,以实现数据保护和隐藏实现细节的目的。
优点
- 数据保护:防止外部代码直接访问和修改对象的内部数据,确保数据的完整性和有效性。
- 隐藏实现细节:只暴露必要的接口,隐藏对象的实现细节,增强代码的可维护性和可扩展性。
- 提高灵活性:可以根据需要修改内部实现,而不影响外部代码。
- 代码复用:通过封装,将通用功能封装成独立的模块,提高代码复用性。
示例代码
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age > 0) { this.age = age; } else { System.out.println("年龄必须为正数"); } } public void displayInfo() { System.out.println("姓名:" + name + ",年龄:" + age); } } public class Main { public static void main(String[] args) { Person person = new Person("张三", 25); person.setAge(-5); // 设置无效年龄,输出错误信息 person.displayInfo(); // 输出:姓名:张三,年龄:25 } }
二、继承(Inheritance)
概念
继承是面向对象编程中的一种机制,它允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类可以复用父类的代码,并可以在子类中添加新的属性和方法,或重写父类的方法。
优点
- 代码复用:子类可以复用父类的属性和方法,减少重复代码。
- 易于扩展:可以在子类中添加新的属性和方法,或重写父类的方法,以实现代码的扩展。
- 提高可维护性:通过继承,可以将通用功能抽取到父类中,集中管理和维护,提高代码的可维护性。
示例代码
class Animal { public void makeSound() { System.out.println("Some generic animal sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Bark"); } } class Cat extends Animal { @Override public void makeSound() { System.out.println("Meow"); } } public class Main { public static void main(String[] args) { Animal myDog = new Dog(); Animal myCat = new Cat(); myDog.makeSound(); // 输出:Bark myCat.makeSound(); // 输出:Meow } }
三、多态(Polymorphism)
概念
多态是面向对象编程的一个重要特性,它允许对象以多种形式出现。多态主要通过方法重载(Overloading)和方法重写(Overriding)实现。通过多态,父类引用可以指向子类对象,并调用子类重写的方法。
优点
- 接口重用:通过多态,可以使用统一的接口来操作不同类型的对象,提高代码的重用性。
- 灵活性:通过多态,可以在运行时决定调用哪个子类的重写方法,提高代码的灵活性和扩展性。
- 提高可维护性:通过多态,可以将通用功能抽取到父类中,实现代码的集中管理和维护,提高代码的可维护性。
示例代码
interface Shape { double area(); } class Circle implements Shape { private double radius; public Circle(double radius) { this.radius = radius; } @Override public double area() { return Math.PI * radius * radius; } } class Rectangle implements Shape { private double length; private double width; public Rectangle(double length, double width) { this.length = length; this.width = width; } @Override public double area() { return length * width; } } public class Main { public static void main(String[] args) { Shape myCircle = new Circle(5.0); Shape myRectangle = new Rectangle(4.0, 6.0); System.out.println("Circle area: " + myCircle.area()); // 输出:Circle area: 78.53981633974483 System.out.println("Rectangle area: " + myRectangle.area()); // 输出:Rectangle area: 24.0 } }
四、抽象(Abstraction)
概念
抽象是面向对象编程的基本特性之一,它通过抽象类和接口来实现。抽象类是不能实例化的类,它可以包含抽象方法和具体方法。接口是一种纯抽象的类,所有方法都是抽象的,接口定义了类应该具有的方法,而不实现这些方法。
优点
- 代码重用:通过抽象类,可以将通用功能抽取到父类中,提高代码的重用性。
- 接口隔离:通过接口,可以定义类应该具有的方法,实现接口隔离,提高代码的灵活性和扩展性。
- 提高可维护性:通过抽象类和接口,可以将通用功能和具体实现分离,实现代码的集中管理和维护,提高代码的可维护性。
示例代码
abstract class Vehicle { abstract void start(); } class Car extends Vehicle { @Override void start() { System.out.println("Car is starting"); } } class Bike extends Vehicle { @Override void start() { System.out.println("Bike is starting"); } } interface Flyable { void fly(); } class Airplane implements Flyable { @Override public void fly() { System.out.println("Airplane is flying"); } } public class Main { public static void main(String[] args) { Vehicle myCar = new Car(); Vehicle myBike = new Bike(); myCar.start(); // 输出:Car is starting myBike.start(); // 输出:Bike is starting Flyable myAirplane = new Airplane(); myAirplane.fly(); // 输出:Airplane is flying } }
总结
封装、继承、多态和抽象是面向对象编程的四大基本特性,通过学习和实践这些特性,可以更好地设计和实现面向对象的程序,提高代码的质量、可维护性和可扩展性。在实际开发中,合理运用这些特性,可以编写出更高效、灵活和健壮的代码。