Java 面向对象编程(OOP)

面向对象编程(Object-Oriented Programming,OOP)是Java编程语言的核心思想之一。通过OOP,Java提供了一种结构化的编程方式,使代码更易于维护和扩展。

一、类和对象

1. 类的定义

类是对象的蓝图或模板,定义了对象的属性和行为。一个类通常包含字段(变量)和方法(函数)。下面是一个简单的Java类示例:

public class Person {
    // 字段
    String name;
    int age;

    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 方法
    public void display() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

2. 对象的创建

对象是类的实例,通过类的构造方法来创建对象。使用 new 关键字可以创建一个新的对象:

Person person = new Person("Alice", 30);
person.display();  // 输出:Name: Alice, Age: 30

3. 对象的属性和方法

对象的属性是通过类中的字段定义的,对象的行为是通过类中的方法定义的。可以通过对象访问其属性和方法:

Person person = new Person("Bob", 25);
person.name = "Bob";
person.age = 25;
person.display();  // 输出:Name: Bob, Age: 25

二、继承

继承是OOP的一个重要特性,允许一个类继承另一个类的属性和方法,从而实现代码的重用。被继承的类称为父类(或基类),继承的类称为子类(或派生类)。

1. 继承的实现

在Java中,使用 extends 关键字来实现继承:

public class Employee extends Person {
    // 新增字段
    String company;

    // 构造方法
    public Employee(String name, int age, String company) {
        super(name, age);  // 调用父类的构造方法
        this.company = company;
    }

    // 新增方法
    public void display() {
        super.display();  // 调用父类的方法
        System.out.println("Company: " + company);
    }
}

2. 方法重写

子类可以重写(Override)父类的方法,以提供特定的实现。重写的方法必须具有相同的方法签名(方法名、参数类型和返回类型):

public void display() {
    super.display();  // 调用父类的方法
    System.out.println("Company: " + company);
}

3. 多层继承

Java支持单继承,即一个类只能有一个直接父类,但可以通过多层继承实现复杂的继承关系:

public class Manager extends Employee {
    String department;

    public Manager(String name, int age, String company, String department) {
        super(name, age, company);
        this.department = department;
    }

    public void display() {
        super.display();
        System.out.println("Department: " + department);
    }
}

三、多态

多态性是OOP的核心概念之一,指同一个方法调用由于对象不同会表现出不同的行为。多态性主要通过方法重写和接口实现。

1. 方法重写

方法重写是实现多态性的一个方式,子类重写父类的方法,使得相同的方法调用在不同的对象上表现出不同的行为:

Person person = new Employee("Charlie", 28, "Tech Corp");
person.display();  // 调用的是 Employee 类的 display 方法

2. 接口实现

接口定义了一组方法,任何类都可以实现这些接口,从而保证一定的行为。接口的多态性通过接口引用来实现:

interface Printable {
    void print();
}

class Document implements Printable {
    public void print() {
        System.out.println("Printing document...");
    }
}

class Photo implements Printable {
    public void print() {
        System.out.println("Printing photo...");
    }
}

public class Main {
    public static void main(String[] args) {
        Printable p1 = new Document();
        Printable p2 = new Photo();

        p1.print();  // 输出:Printing document...
        p2.print();  // 输出:Printing photo...
    }
}

四、封装

封装是指将对象的属性和方法私有化,通过公共的访问方法(getter 和 setter)来访问和修改属性。封装提高了代码的安全性和可维护性。

1. 封装的实现

通过将字段声明为 private,并提供 public 的 getter 和 setter 方法来实现封装:

public class BankAccount {
    // 私有字段
    private double balance;

    // 构造方法
    public BankAccount(double balance) {
        this.balance = balance;
    }

    // Getter 方法
    public double getBalance() {
        return balance;
    }

    // Setter 方法
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    public void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
        }
    }
}

2. 访问和修改属性

通过 getter 和 setter 方法来访问和修改私有属性:

BankAccount account = new BankAccount(1000);
account.deposit(500);
account.withdraw(200);
System.out.println("Balance: " + account.getBalance());  // 输出:Balance: 1300

五、抽象

抽象是OOP的另一重要特性,通过抽象类和接口来实现。抽象类不能实例化,只能被继承;接口定义一组方法,任何类都可以实现这些方法。

1. 抽象类

抽象类可以包含抽象方法(没有实现的方法)和具体方法。抽象类不能实例化,只能被继承:

abstract class Animal {
    // 抽象方法
    public abstract void makeSound();

    // 具体方法
    public void sleep() {
        System.out.println("Sleeping...");
    }
}

class Dog extends Animal {
    public void makeSound() {
        System.out.println("Woof");
    }
}

2. 抽象方法的实现

子类必须实现抽象类中的所有抽象方法:

Dog dog = new Dog();
dog.makeSound();  // 输出:Woof
dog.sleep();  // 输出:Sleeping...

3. 接口

接口是一组方法的声明,任何类都可以实现接口,并提供接口方法的具体实现:

interface Flyable {
    void fly();
}

class Bird implements Flyable {
    public void fly() {
        System.out.println("Bird is flying");
    }
}

class Plane implements Flyable {
    public void fly() {
        System.out.println("Plane is flying");
    }
}

4. 接口实现的多态性

接口的多态性通过接口引用来实现:

Flyable f1 = new Bird();
Flyable f2 = new Plane();

f1.fly();  // 输出:Bird is flying
f2.fly();  // 输出:Plane is flying

六、组合与聚合

组合和聚合是面向对象设计中的两个重要概念,表示对象之间的关系。

1. 组合

组合表示一个对象由多个部分组成,是一种强依赖关系。如果整体被销毁,部分也会被销毁:

class Engine {
    // 引擎的实现
}

class Car {
    private Engine engine;

    public Car() {
        engine = new Engine();  // 组合关系,Car 创建时创建 Engine
    }
}

2. 聚合

聚合表示一个对象包含另一个对象,是一种弱依赖关系。如果整体被销毁,部分可以独立存在:

class Library {
    private List<Book> books;

    public Library(List<Book> books) {
        this.books = books;  // 聚合关系,Library 包含 Book
    }
}

Java的面向对象编程通过类和对象、继承、多态、封装和抽象等概念,使得代码更加模块化、可维护和可扩展。理解和掌握这些概念是成为一名优秀Java开发者的关键。通过实践和项目经验,能够更好地应用这些OOP原则,编写出高质量的Java代码。

黑马程序员免费预约咨询

  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值