Java 面向对象编程(OOP)

news2024/11/15 19:33:24

面向对象编程(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代码。

黑马程序员免费预约咨询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1705448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

回收站删掉的照片还能找回来吗?掌握这5个方法,很简单!

“我一不小心在回收站中误删了一些照片&#xff0c;这些照片对我来说是比较重要的&#xff0c;不知道这些还有机会将它们找回来吗&#xff1f;” 当我们不小心将珍贵的照片从计算机的回收站中误删时&#xff0c;那种瞬间的心痛和焦虑难以言表。这些照片可能记录了我们生活中的重…

大数据开发面试题【Kafka篇】

83、介绍下Kafka&#xff0c;Kafka的作用?Kafka的组件?适用场景? kafka是一个高吞吐量、可扩展的分布式消息传递系统&#xff0c;在处理实时流式数据&#xff0c;并能够保证持久性和容错性 可用于数据管道、流分析和数据继承和关键任务应用&#xff08;发布/订阅模式&#…

雷达基数据绘制成雷达图

x波段雷达基数据绘制成雷达图 1.雷达基数据格式Z_RADR_I_ZR001_20240521020002_O_DOR_YLD2-D_CAP_FMT.bin.bz2 2.基数据读取 python f StandardData(i) # 新版本标准数据radarTime f.scantime # 获取雷达时次date_str radarTime.strftime(%Y-%m-%d %H:%M:%S)date_str d…

盘点10大灵动惊艳小演员❗谁是你的心头好?

盘点国内影视那些惊艳观众的小演员们无疑为影视作品注入了新的活力。以下是10个备受赞誉的小演员&#xff1a; 1.韩昊霖&#xff1a;凭借在《我和我的祖国》和《庆余年》中的出色表现 韩昊霖的演技赢得了观众和业界的广泛认可 他能够准确地把握角色的情感和细节&#xff0c;展…

STM32_USART

1、USART简介 USART&#xff0c;即Universal Synchronous/Asynchronous Receiver/Transmitter&#xff0c;通用同步/异步收发器。USART是STM32内部集成的硬件外设&#xff0c;可根据数据寄存器的一个字节数据自动生成数据帧时序&#xff0c;从TX引脚发送出去&#xff0c;也可自…

claude3国内API接口对接

众所周知&#xff0c;由于地理位置原因&#xff0c;Claude3不对国内开放&#xff0c;而国内的镜像网站使用又贵的离谱&#xff01; 因此&#xff0c;团队萌生了一个想法&#xff1a;为什么不创建一个一站式的平台&#xff0c;让用户能够通过单一的接口与多个模型交流呢&#x…

点云工具CloudCompare下载、安装与汉化

一、下载 软件免费开源&#xff0c;所以可以直接在官网下载&#xff0c;官网地址&#xff1a; CloudCompare - Open Source project 进入官网后&#xff0c;点击菜单栏【Download】 选择合适系统进行下载 二、安装 常规软件安装流程即可 三、汉化 打开软件后&#xff0c;…

社交媒体数据恢复:微信电话本

首先&#xff0c;请确保您的微信已登录&#xff0c;并且您具有管理员权限。接下来&#xff0c;按照以下步骤进行操作&#xff1a; 第一步&#xff1a;备份微信数据 在进行数据恢复之前&#xff0c;建议您先备份微信数据。这可以帮助您在数据丢失的情况下更好地保护您的微信数据…

成都百洲文化传媒有限公司引领电商服务新风尚

在当今数字化时代&#xff0c;电商行业正以前所未有的速度蓬勃发展&#xff0c;而在这个充满机遇与挑战的领域中&#xff0c;成都百洲文化传媒有限公司以其专业的电商服务&#xff0c;成为了行业的佼佼者。作为一家专注于电商服务的传媒公司&#xff0c;百洲文化不仅为商家提供…

NDK下载与配置以及遇到的问题

通过 Android Studio进行下载或者官网下载&#xff0c;下面是在 androidStudio中下载在项目中配置ndk 菜单栏点开 File-》Project Structure&#xff0c;可以看到配置好的ndk配置ndk的系统环境变量&#xff0c;系统变量 -> 新建一个变量名为 NDK_HOME -> 变量值为文件路…

新旅程:类与对象的魔法课堂

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…

AI大模型在测试中的深度应用与实践案例

文章目录 1. 示例项目背景2. 环境准备3. 代码实现3.1. 自动生成测试用例3.2. 自动化测试脚本3.3. 性能测试3.4. 结果分析 4. 进一步深入4.1. 集成CI/CD管道4.1.1 Jenkins示例 4.2. 详细的负载测试和性能监控4.2.1 Locust示例 4.3. 测试结果分析与报告 5. 进一步集成和优化5.1. …

RK3588 camera驱动总结二之图像格式

camera驱动中很重要的一个设置就是格式&#xff0c;此文来看看这块。 在驱动中有个重要的参数mbus-code&#xff0c;即Media Bus Pixel Codes&#xff0c;它描述的是用于在物理总线上传输的格式&#xff0c;比如 sensor 通过mipi dphy 向 isp 传输的图像格式&#xff0c;或者在…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试5月28日预测第4弹

今天继续基于8883的大底进行测试&#xff0c;今天继续测试&#xff0c;好了&#xff0c;直接上结果吧~ 首先&#xff0c;888定位如下&#xff1a; 百位&#xff1a;3,4,2,5,0,7,8,9 十位&#xff1a;3,2,4,1,6,7,8,9 个位&#xff1a;0,1,2,3,4,5,6,7 …

如果你使用vscode的ssh插件远程连接不了服务器,解决办法如下

CtrlShiftP打开命令面板&#xff0c;在命令面板中输入setting&#xff0c;选择User Settings 在页面中配置"remote.SSH.useLocalServer": true,保存重启后再重新连接就好了 再次连接就可以输入密码连接了

YOLOv5改进 | 卷积模块 | 提高网络的灵活性和表征能力的动态卷积【附代码+小白可上手】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 轻量级卷积神经网络由于其低计算预算限制了CNNs的深度&#xff08;卷积层数&#xff09;和宽度&#xff08;通道数&#xff09;&#xff0c;…

手机号码携号转网查询保障用户权益、信息透明、优化用户体验

携号转网服务是指在同一本地网范围内&#xff0c;蜂窝移动通信用户&#xff08;不含物联网用户&#xff09;变更签约的基础电信业务经营者而用户号码保持不变的一项服务。近年来&#xff0c;随着通信行业的不断发展&#xff0c;携号转网服务已成为满足用户个性化需求、提升服务…

使用nexus搭建的nodejs私库,定期清理无用的npm组件,彻底释放磁盘空间

一、背景 昨天我们整理了一篇关于docker私库&#xff0c;如何定期清理以释放磁盘空间的文章。 虽然也提及了npm前端应用的组件该如何定期清理的&#xff0c;本文是对它作一个补充说明。 前文也看到了&#xff0c;npm组件占用的blob空间为180多GB&#xff0c;急需清理。 二、…

给pdf加水印,python实现

from PyPDF2 import PdfReader, PdfWriterdef add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):"""把水印添加到pdf中"""pdf_output PdfWriter()input_stream open(pdf_file_in, rb)pdf_input PdfReader(input_stream, strictFalse…

111.二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 返回它的最小深度 2. 思路&#xff1a; 后序遍历&#xff08;左右中&#xff…