Java面向对象设计

1. 概述

Java是一种面向对象的编程语言,它的核心思想是将现实世界中的事物抽象为对象,并通过类来定义对象的属性和行为。面向对象的设计可以提供更好的可扩展性、可维护性和重复使用性,使程序更加易于理解和维护。

2. 类和对象

在Java中,类是对象的模板,它定义了对象的属性和行为。对象是类的一个实例,它可以有自己的状态(属性)和行为(方法)。下面是一个简单的示例,展示了如何定义一个类和创建对象:

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 int getAge() {
        return age;
    }
    
    public void sayHello() {
        System.out.println("Hello, my name is " + name);
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", 20);
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
        person.sayHello();
    }
}

在上面的例子中,我们定义了一个Person类,它有两个私有属性nameage,以及一个构造方法和三个公有方法。在Main类中,我们创建了一个Person对象,并调用了它的方法。

3. 封装

封装是面向对象设计的重要概念之一,它指的是将数据和方法封装在类中,通过访问修饰符来控制对外部的可见性。在Java中,我们可以使用privateprotectedpublic和默认访问修饰符来限制对属性和方法的访问。下表展示了这些访问修饰符的作用:

访问修饰符 同类 同包 子类 其他包
private ✔️
默认 ✔️ ✔️
protected ✔️ ✔️ ✔️
public ✔️ ✔️ ✔️ ✔️

我们来看一个例子,展示如何使用封装来保护对象的属性:

public class Circle {
    private double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    public double getRadius() {
        return radius;
    }
    
    public double getArea() {
        return Math.PI * Math.pow(radius, 2);
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(5.0);
        System.out.println("Radius: " + circle.getRadius());
        System.out.println("Area: " + circle.getArea());
    }
}

在上面的例子中,Circle类有一个私有属性radius,通过getRadius()方法可以获取它的值,而getArea()方法用来计算圆的面积。这样做的好处是,在类的外部无法直接修改radius的值,保证了对象的数据安全性。

4. 继承

继承是面向对象设计中的另一个重要概念,它允许我们创建一个新的类,并从现有的类中继承属性和方法。被继承的类称为父类或超类,新创建的类称为子类。子类可以添加新的属性和方法,也可以重写父类的方法。下面是一个示例,展示了如何使用继承:

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    public void sleep() {
        System.out.println(name + " is sleeping.");
    }
}

public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    
    public void bark() {
        System.out.println(getName() + " is barking.");
    }
}

public class Main {
    public static void