【Java 基础篇】Java 面向对象详解:面向对象编程的艺术

news2025/2/27 7:10:01

在这里插入图片描述

如果你正在学习Java编程,面向对象编程(Object-Oriented Programming,OOP)是一个不可或缺的概念。Java是一种面向对象的编程语言,这意味着它的编程范式基于对象、类和继承。在本篇博客中,我们将深入探讨Java中面向对象编程的核心概念,从什么是对象开始,逐步介绍类、继承、封装、多态等重要概念。无论你是初学者还是有一些编程经验,本篇博客都将帮助你建立对Java中面向对象编程的深刻理解。

什么是对象?

在面向对象编程中,对象是程序中的基本构建块。对象表示现实世界中的实体或概念,并具有状态(属性)和行为(方法)。换句话说,对象是数据和操作数据的组合。

让我们以一个简单的例子来理解对象。假设我们要模拟一个银行账户系统,每个账户都是一个对象。每个账户对象都有以下属性:

  • 账户持有者的姓名
  • 账户号码
  • 当前余额

这些属性描述了账户对象的状态。此外,账户对象还可以执行以下操作(方法):

  • 存款
  • 取款
  • 查询余额

这些操作描述了账户对象的行为。因此,在这个示例中,银行账户就是一个对象,它有属性和方法。

什么是类?

类是对象的模板或蓝图。它定义了对象的属性和方法。在Java中,类是创建对象的基础。对象是类的实例,而类定义了对象的结构和行为。

让我们以银行账户为例,定义一个简单的Java类来表示银行账户:

public class BankAccount {
    // 属性
    private String ownerName;
    private String accountNumber;
    private double balance;

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

    public void withdraw(double amount) {
        if (amount <= balance) {
            balance -= amount;
        } else {
            System.out.println("余额不足!");
        }
    }

    public double getBalance() {
        return balance;
    }
}

在上面的示例中,我们定义了一个BankAccount类,它有三个属性(ownerNameaccountNumberbalance)和三个方法(depositwithdrawgetBalance)。这个类描述了银行账户的结构和操作。

创建对象

一旦我们定义了一个类,就可以创建该类的对象。在Java中,通过使用关键字new来创建对象。例如,要创建一个BankAccount对象,可以这样做:

BankAccount myAccount = new BankAccount();

这行代码创建了一个名为myAccountBankAccount对象。现在,我们可以使用这个对象来存款、取款或查询余额。

属性和方法

在一个类中,属性用于表示对象的状态,方法用于表示对象的行为。属性通常是对象的特征或数据,而方法则是对象的操作或行为。

属性

在上面的BankAccount类中,ownerNameaccountNumberbalance是属性,它们用于描述银行账户的状态。属性通常应该是私有的,以封装对象的内部状态,只能通过方法来访问和修改。

方法

方法定义了对象的行为。在BankAccount类中,depositwithdrawgetBalance是方法,它们用于执行存款、取款和查询余额的操作。方法是对象的行为和功能的实现。

封装

封装是面向对象编程的一个重要原则。它指的是将对象的内部状态(属性)隐藏起来,并通过公共方法来访问和修改这些状态。这样做的好处是可以控制对对象的访问,防止不合法的状态修改,并提供了一种更加可控的方式来与对象交互。

BankAccount类中,我们使用了封装,将属性ownerNameaccountNumberbalance声明为私有属性,并提供了公共方法(depositwithdrawgetBalance)来访问和修改这些属性。这样,外部代码不能直接访问和修改对象的属性,必须通过方法来操作。

继承

继承是面向对象编程中的另一个关键概念。它允许你创建一个新类,该类可以继承另一个类的属性和方法。继承使得代码重用更容易,并允许你创建一个类层次结构,其中一个类(子类)继承另一个类(父类)的特征和行为。

让我们以一个示例来理解继承。假设我们要创建一个更复杂的银行账户系统,其中有多种类型的账户,如储蓄账户和支票账户。这些不同类型的账户有一些共同的属性和方法,如账户持有者的姓名和账户号码,但也有一些特定于每种类型的属性和方法。

我们可以创建一个通用的BankAccount父类,它包含了共同的属性和方法:

public class BankAccount {
    // 共同的属性
    private String ownerName;
    private String accountNumber;
    private double balance;

    // 共同的方法
    public void deposit(double amount) {
        balance += amount;
    }

    public void withdraw(double amount) {
        if (amount <= balance) {
            balance -= amount;
        } else {
            System.out.println("余额不足!");
        }
    }

    public double getBalance() {
        return balance
    }
}

现在,我们可以创建具体的账户类型,如储蓄账户和支票账户,它们继承自BankAccount父类,并可以添加特定于每种类型的属性和方法:

public class SavingsAccount extends BankAccount {
    private double interestRate;

    public SavingsAccount(String ownerName, String accountNumber, double initialBalance, double interestRate) {
        // 调用父类构造方法初始化共同属性
        super(ownerName, accountNumber, initialBalance);
        this.interestRate = interestRate;
    }

    public void applyInterest() {
        double interest = getBalance() * interestRate;
        deposit(interest);
    }
}

public class CheckingAccount extends BankAccount {
    private double overdraftLimit;

    public CheckingAccount(String ownerName, String accountNumber, double initialBalance, double overdraftLimit) {
        // 调用父类构造方法初始化共同属性
        super(ownerName, accountNumber, initialBalance);
        this.overdraftLimit = overdraftLimit;
    }

    public void withdrawWithOverdraft(double amount) {
        if (amount <= getBalance() + overdraftLimit) {
            withdraw(amount);
        } else {
            System.out.println("超出透支额度!");
        }
    }
}

在上面的示例中,SavingsAccountCheckingAccount类都继承自BankAccount父类,并添加了特定于每种类型的属性和方法。这样,我们可以创建不同类型的账户对象,每种类型都继承了共同的属性和方法,并且具有自己的特性。

多态

多态是面向对象编程的另一个重要概念。它允许不同类型的对象对相同的消息(方法调用)做出不同的响应。多态使得代码更灵活和可扩展,能够处理不同类型的对象,而无需知道其具体类型。

让我们以一个多态的示例来理解。假设我们有一个printAccountInfo方法,该方法接受一个银行账户对象,并打印账户信息:

public void printAccountInfo(BankAccount account) {
    System.out.println("账户信息:");
    System.out.println("账户持有者:" + account.getOwnerName());
    System.out.println("账户号码:" + account.getAccountNumber());
    System.out.println("当前余额:" + account.getBalance());
}

这个方法接受一个BankAccount对象作为参数,但实际上可以传递任何继承自BankAccount的对象,如储蓄账户或支票账户。这是多态的体现,同一个方法可以适用于不同类型的对象。

SavingsAccount savingsAccount = new SavingsAccount("Alice", "SA123", 1000.0, 0.03);
CheckingAccount checkingAccount = new CheckingAccount("Bob", "CA456", 500.0, 100.0);

printAccountInfo(savingsAccount); // 打印储蓄账户信息
printAccountInfo(checkingAccount); // 打印支票账户信息

在上面的示例中,我们分别传递了储蓄账户和支票账户对象给printAccountInfo方法,它能够正确地打印不同类型账户的信息。

结语

面向对象编程是Java编程的核心,它提供了一种组织和管理代码的强大方式,使得代码更具可读性、可维护性和可扩展性。在本篇博客中,我们讨论了对象、类、封装、继承、多态等面向对象编程的核心概念。通过深入理解这些概念,并在实际编程中应用它们,你将能够更好地设计和组织Java程序,充分发挥面向对象编程的优势。

继续学习和实践,不断提高你的面向对象编程技能,将有助于你成为一名更优秀的Java程序员。面向对象编程是Java世界中的基石,它值得你投入时间和精力去学习和掌握。

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

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

相关文章

IIR滤波器算法

IIR&#xff08;Infinite Impulse Response&#xff09;滤波器是一类递归型数字滤波器&#xff0c;其输出信号不仅与当前的输入信号有关&#xff0c;还与之前的输入和输出信号有关。因此&#xff0c;IIR滤波器的阶数相对较低&#xff0c;可以实现更为复杂的频率响应。 IIR滤波…

C++包含整数各位重组

void 包含整数各位重组() {//缘由https://bbs.csdn.net/topics/395402016int shu 100000, bs 4, bi shu * bs, a 0, p 0, d 0;while (shu < 500000)if (a<6 && (p to_string(shu).find(to_string(bi)[a], p)) ! string::npos && (d to_string(bi…

2PCNet:昼夜无监督域自适应目标检测(附原代码)

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 Column of Computer Vision Institute 由于缺乏夜间图像注释&#xff0c;夜间目标检测是一个具有挑战性的问…

反转了,中国发售5G手机,ASML就出售先进光刻机,跪地求饶

日前据《中国日报》等多家知名媒体确认&#xff0c;ASML已获得荷兰许可出售先进的2000i光刻机&#xff0c;这款光刻机可用于生产7纳米工艺&#xff0c;而就在数天前一家中国手机企业发布了国产化的5G手机&#xff0c;采用国产的5G芯片和5G射频芯片&#xff0c;这实在太巧合了。…

Linux持续学习者的必备工具:文本处理神器awk

引言 作为一名Linux持续学习者&#xff0c;我们经常需要处理各种各样的文本文件&#xff0c;例如日志文件、配置文件等。而对于大规模的文本数据&#xff0c;手动处理往往效率低下且容易出错。那么&#xff0c;有没有一种快速而强大的工具可以帮助我们进行文本处理呢&#xff1…

废品回收功能文档

废品回收 基础版 后台功能 功能字段描述二级分类表字段&#xff1a;图标、名称、描述、图片、注意事项、上一级、状态功能&#xff1a;前端展示和筛选&#xff1b;增删改查今日指导价表字段&#xff1a;关联分类、名称、价格、单位、状态功能&#xff1a;前端展示和预估价格&…

基于java+springboot+vue的考研资讯平台-lw

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; ssm mybatis Maven mysql5.7或8.0等等组成&#xff0c;B…

Windows Network File System Remote Code Execution Vulnerability

文章目录 NFS(Network File System)漏洞描述攻击者如何利用此漏洞&#xff1f;该漏洞的危险程度机密性-high真实性-high可用性-high 如何降低漏洞风险推荐阅读 NFS(Network File System)漏洞描述 Name Microsoft Windows Network File System Remote Code Execution Vulnerabi…

IM即时聊天项目

目录 IM即时聊天项目WebSocket 原理搭建环境设置代理创建环境配置驱动&#xff08;搭建环境需要的驱动&#xff09;conf&#xff08;配置信息&#xff09;cache&#xff08;redis&#xff09;model&#xff08;数据库连接&#xff09; 用户注册serializermodelserviceapirouter…

CSS中如何实现元素的旋转和缩放效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 元素的旋转和缩放效果⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

打卡智能中国(六):村里出了“飞行员”

提起返乡青年&#xff0c;你的第一印象是什么&#xff1f;失败、躺平、卷不动了&#xff1f; 我们在浙江、福建、青海等地&#xff0c;参观一些农业智能化项目时&#xff0c;陪同参观的“飞手”&#xff0c;高兴地跟我们分享自己的心路历程&#xff1a; 在家门口做农业无人机操…

每日一题 98验证二叉搜索树(中序遍历)

题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a…

Java-API简析_java.net.Inet4Address类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/132643590 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

2023开学礼新疆财经大学图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》许少辉新财经理工

2023开学礼新疆财经大学图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》许少辉新财经理工

【经济研究】论文《经济ZC不确定性与创新》数据复现

数据简介&#xff1a;当前宏观经济面临较大下行压力&#xff0c;需要“稳中求进”兼顾经济高质量发展与经济增速等多种目标&#xff0c;这就不可避免地导致各种经济ZC的频繁调整&#xff0c;产生不确定性风险。在此背景下&#xff0c;经济政策不确定性上升如何影响企业决策&…

无涯教程-JavaScript - RANK函数

RANK函数取代了Excel 2010中的RANK.EQ函数。 描述 该函数返回数字列表中数字的等级。数字的等级是其相对于列表中其他值的大小。 如果对列表进行排序,则数字的排名将是其位置。 语法 RANK (number,ref,[order])争论 Argument描述Required/OptionalNumberThe number whose…

c++11 标准模板(STL)(std::basic_stringstream)(四)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_stringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::alloc…

C++插入加密,替代加密

void 插入加密() {//缘由https://bbs.csdn.net/topics/396047473int n 1, j 0;char aa[60]{}, aaa[] "abcde";cin >> aa;while (j < 60 && (aa[j] - \0))cout << aa[j] << aaa[j % 5]; } void 插入加密() {//缘由https://bbs.csdn.n…

如何快速掌握一门新技术,有什么独特的学习方法和技巧可以分享吗?

今日话题&#xff1a;如何快速掌握一门新技术&#xff0c;有什么独特的学习方法和技巧可以分享吗&#xff1f; 这个话题引起了我的思考和总结&#xff0c;现在的技术这么多&#xff0c;我们该如何高效的学习呢&#xff1f;我先总结一下我所了解的技术和学习的路径。 我的技术栈…

【Maven教程】(四)坐标与依赖:坐标概念,依赖配置、范围、传递性和最佳实践 ~

Maven 坐标与依赖 1️⃣ 什么是Maven 坐标2️⃣ 坐标详解3️⃣ 依赖的配置4️⃣ 依赖范围5️⃣ 传递性依赖6️⃣ 依赖调解7️⃣ 可选依赖8️⃣ 最佳实践8.1 排除依赖8.2 归类依赖8.3 优化依赖 &#x1f33e; 总结 正如前面文章所述&#xff0c;Maven 的一大功能是管理项目依赖…