Java 是一种面向对象的编程语言,其中封装、继承和多态是面向对象编程的三个基本概念。下面从这三个方面详细讲解。
封装
封装指的是将对象的状态或行为视为私有数据,并通过提供公共方法来保证外部代码不能直接访问和修改内部数据。封装的目的是为了保护类的数据,防止外部代码对其进行不当的修改。
举个例子,我们有一个表示用户的类 UserInfo,其中包含用户的姓名、身份证号码、年龄等信息。我们可以通过 private 关键字将属性设为私有,防止外部代码直接修改它们,而是通过公共的 get/set 方法来访问和修改数据。下面是示例代码:
public class UserInfo {
private String name;
private String idCard;
private int age;
public UserInfo(String name, String idCard, int age) {
this.name = name;
this.idCard = idCard;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在上面的代码中,属性 name、idCard 和 age 都被声明为 private,而对应的 get/set 方法是公共的,这样外部代码就只能通过这些方法来访问和修改数据,而不能直接修改属性值。
继承
继承指的是一个类可以派生出另一个类,从而继承了父类的属性和方法。子类可以在继承的基础上增加新的属性和方法,也可以重写父类的方法来改变其行为。
举个例子,我们有一个表示动物的类 Animal,其中包含方法 eat() 和 sleep()。我们可以通过 extends 关键字来派生出一个表示猫的类 Cat,在 Cat 类中然后扩展新的方法和属性。下面是示例代码:
public class Animal {
public void eat() {
System.out.println("Animal is eating");
}
public void sleep() {
System.out.println("Animal is sleeping");
}
}
public class Cat extends Animal {
public void meow() {
System.out.println("Cat is meowing");
}
@Override
public void sleep() {
System.out.println("Cat is sleeping");
}
}
在上面的代码中,Cat 类继承自 Animal 类,因此它也拥有了 eat() 和 sleep() 这两个方法。同时,Cat 类也添加了一个新的方法 meow(),以及重写了父类的 sleep() 方法。这样,我们就可以通过 Cat 类创建出新的对象,并调用它自身的方法和从父类继承来的方法。比如:
Cat cat = new Cat();
cat.eat(); // 输出 "Animal is eating"
cat.sleep(); // 输出 "Cat is sleeping"
cat.meow(); // 输出 "Cat is meowing"
多态
多态指的是不同的对象可以使用相同的方法,并根据实际对象的类型来执行不同的行为。在 Java 中,多态实现的基础就是继承和方法的重写。
举个例子,我们假设有一个表示图形的类 Shape,其中有个方法 calculateArea() 用于计算图形的面积。我们可以创建一个用于表示矩形的子类 Rectangle 和 用于表示圆形的子类 Circle,它们都重写了 calculateArea() 方法。下面是示例代码:
public class Shape {
public double calculateArea() {
return 0;
}
}
public class Rectangle extends Shape {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
public double calculateArea() {
return length * width;
}
}
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
在上面的代码中,我们创建了一个表示图形的类 Shape,以及两个子类 Rectangle 和 Circle,它们都继承自 Shape 类,并重写了 calculateArea() 方法。这样,我们就可以通过多态来使用相同的方法了。比如:
Shape shape1 = new Rectangle(10, 5);
System.out.println("矩形面积为:" + shape1.calculateArea());
Shape shape2 = new Circle(5);
System.out.println("圆形面积为:" + shape2.calculateArea());
在上面的代码中,我们创建了一个 Shape 对象 shape1 和一个 Shape 对象 shape2,但是它们分别指向了一个 Rectangle 对象和一个 Circle 对象。由于这两个子类都重写了 calculateArea() 方法,并根据实际对象的类型来执行不同的行为,shape1.calculateArea() 输出的是矩形的面积,而 shape2.calculateArea() 输出的是圆形的面积。这就是多态的应用。