Java面向对象的理解

作为一名从C语言开始起家的蒟蒻来说,C语言是面向过程编程,Java是面向对象编程,两个其实有着本质上的区别。本蒟蒻对于Java有一些个人的理解和看法,如果有错误请各位大佬指正!当然,我们学各种编程的最终目的都是买车买房实现财富自由,然后辞职躺平。那我们就用财富自由后开了一个汽车厂来举例吧!

华丽丽的分割线



以下是正文

开汽车厂得有轮胎,所以我们先找一家生产轮胎的厂家设计一款轮胎的流水线(这就好比是类的出厂设置):

public class 轮胎厂 {// 成员变量private String 型号;private int 使用年龄;// 构造方法(从类外部调用该类时,参数作为类的输入)public 轮胎厂(String 型号, int 使用年龄) {this.型号 = 型号;this.使用年龄 = 使用年龄;}// 成员方法(供外部调用该类,返回类的值)public String get型号() {return 型号;}public int get使用年龄() {return 使用年龄;}
}

一辆车需要多个轮胎,而轮胎的基本样式相差不大,所以可以直接从轮胎厂家购买轮胎用于汽车生产:

轮胎厂 轮胎前 1 = new 轮胎厂("A", 5);
轮胎厂 轮胎前 2 = new 轮胎厂("A", 2); // 假如爆过胎所以换了一个,使用年数比较少
轮胎厂 轮胎后 1 = new 轮胎厂("A", 5);
轮胎厂 轮胎后 2 = new 轮胎厂("A", 5);

以上是面向对象编程的基础,厂中生产轮胎的类型就如同java中的,买来装在车上的轮胎就是java中的对象。类是面向对象编程的基石,它是一种模板或者蓝图,用于创建对象。而对象是类的实例。


厂家生产的轮胎,其型号和使用年龄可不能随意被他人修改,不然会出现轮胎与车辆不匹配或者以旧充新的问题。不过,当需要维修更新数据时,又不能无法修改。

这就涉及到了数据保护和代码的可维护性,也就是封装。封装的目的是将对象的属性和方法整合在一起,为对象的内部数据提供保护。在 Java 中,我们通过访问修饰符(如 private、public、protected)来实现封装。

在轮胎类中,我们把型号和使用年龄变量设为 private,这就意味着它们只能在类的内部被访问。外部代码无法直接修改这些变量,必须通过类提供的公共方法(如 get 型号和 get 使用年龄)来获取它们的值。


后来,你的汽车厂规模不断扩大,实现了一个小目标,那一个轮胎厂生产的轮胎不够你的汽车厂使用的,所以你又找到了一个轮胎厂希望可以一起生产,但是又不需要重新设计轮胎,直接把之前厂家的流水线继承过来就行(不考虑什么专利之类的现实问题)。

public class 轮胎厂 2 extends 轮胎厂 {private int 轮胎厂 Id;public 轮胎厂 2(String 型号, int 使用年龄, int 轮胎厂 Id) {super(型号, 使用年龄);this.轮胎厂 Id = 轮胎厂 Id;}public int get轮胎厂 Id() {return 轮胎厂 Id;}
}

这体现了 Java 中一个重要的概念 —— 继承。继承是面向对象编程中实现代码复用的关键机制。它允许我们创建一个新的类(子类),从已有的类(父类)中继承属性和方法。

在轮胎厂 2 类中,它继承了轮胎厂类的型号和使用年龄属性以及相关方法,同时还有自己的属性轮胎厂 Id。通过 super 关键字,我们可以在子类的构造方法中调用父类的构造方法来初始化继承的属性。继承使得代码更加简洁且易于维护。如果多个类有相似的属性和方法,我们可以把这些共同部分提取到一个父类中,让其他类继承这个父类。


轮胎厂 2 继承了轮胎厂的流水线,但两个厂商生产的轮胎需要打上不同的标签来区分。

public class 轮胎厂 {//...public void 标签() {System.out.println("型号: " + 型号 + "\n 使用年龄: " + 使用年龄);}
}public class 轮胎厂 2 extends 轮胎厂 {//...@Overridepublic void 标签() {System.out.println("型号: " + 型号 + "\n 使用年龄:" + 使用年龄 + "\n 轮胎厂 Id: " + 轮胎厂 Id);}
}

这就是方法重写,方法重写发生在子类中,当子类想要提供一个与父类中已有的方法具有相同签名(方法名、参数列表、返回类型相同或兼容)的方法时,当我们在轮胎厂 2 对象上调用标签方法时,执行的是轮胎厂 2 类中重写后的版本。

你的汽车厂不仅有卖车业务,还推出了汽车保养服务,不过不同的车保养的数值不一样(原谅我找不到更合适的例子了)。

public class 汽车保养 {public int 维修(int 磨损程度, int 保养效果) {return 保养效果 - 磨损程度;}public double 维修(double 磨损程度, double 保养效果) {return 保养效果 - 磨损程度;}
}

这就是方法重载。方法重载是在同一个类中,存在多个方法具有相同的方法名,但参数列表不同(参数个数、类型或顺序不同)。

方法重写(Overriding)和方法重载(Overloading)都属于多态的范畴。多态是面向对象编程中另一个重要的概念,它允许不同的类对象对同一消息做出不同的响应。通过多态,我们能够编写更灵活、可扩展的代码。不同的对象可以依据自身类型执行特定的行为,而调用代码无需知晓具体对象的类型。



那么,回到最初的问题,Java 和 C 语言的区别究竟在哪里呢?还是用汽车的例子来说明,这次假设你要开车上高速,在此之前需要对车辆进行保养和检查。

面向对象编程就像是你把汽车送到 4S 店进行保养,你只需查看最终的检查报告单信息就行,此时汽车被当作一个整体对象。

面向过程编程则是你自己对汽车进行检查,需要一步一步地测量胎压,按照步骤逐个检查各项数值。

面向过程编程(Procedural Programming):是一种以过程(或函数)为中心的编程范式。它强调的是程序的执行流程,将一个复杂的问题分解为一系列的步骤,通过函数来实现这些步骤,然后按照一定的顺序调用这些函数来解决问题。在这种范式中,数据通常是全局的或者通过参数在函数之间传递。

面向对象编程(Object - Oriented Programming):是以对象为中心的编程范式。它将数据和操作数据的方法封装在一起,形成对象。对象是现实世界中事物的抽象,具有自己的属性(数据)和行为(方法)。通过对象之间的交互来完成程序的功能,并且强调代码的复用性、可维护性和可扩展性,通过继承、多态等特性来实现这些目标。

C 语言没有像 Java 那样的类(class)的概念来封装数据和方法。虽然可以通过结构体(struct)来组合数据,但没有内置的机制将函数和结构体紧密地绑定在一起作为一个对象的概念。例如,在 C 语言中,没有继承、多态这些面向对象编程中用于代码复用和行为多态性的特性。虽然可以通过函数指针等方式模拟多态的某些行为,但这与面向对象语言中天然的多态机制相比,实现起来更加复杂和不直观。

Java 具有完整的面向对象特性。

  • 封装:通过访问修饰符(如private、public、protected)可以控制类的成员变量和方法的访问权限,实现数据的封装。例如,一个BankAccount类可以将账户余额设为private,通过公共的方法(如deposit和withdraw)来操作余额,从而保证数据的安全性和完整性。
  • 继承:可以创建子类继承父类的属性和方法。例如,SavingsAccount类可以继承BankAccount类,并且可以添加自己特有的属性和方法,如利息计算方法。这使得代码复用变得更加容易,同时也符合现实世界中的层次关系。
  • 多态:Java 支持方法重写和接口实现等多态机制。例如,有一个Shape接口,Circle和Rectangle类都实现了这个接口,并且重写了calculateArea方法。在处理Shape类型的对象集合时,可以统一调用calculateArea方法,根据对象的实际类型(Circle或Rectangle)来执行不同的计算,这体现了多态性,使得代码更加灵活和可扩展。

虽然 C 语言主要是面向过程编程,Java 主要是面向对象编程,但这并不意味着 C 语言不能实现面向对象的一些概念,也不意味着 Java 不能有面向过程的部分代码。只是它们在设计理念和主要编程范式上有所不同,以适应不同的编程需求和场景。



总结

总之,Java 的面向对象编程为我们提供了一种强大的编程范式。通过类和对象、封装、继承和多态这些核心概念,我们可以构建出结构清晰、易于维护和扩展的软件系统。无论是小型项目还是大型企业级应用,掌握 Java 面向对象编程都是迈向成功的关键一步。希望这篇博客能帮助大家更好地理解和应用 Java 面向对象编程的知识。

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

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

相关文章

C++上机实验|多态性编程练习

1.实验目的 (1)理解多态性的概念。 (2)掌握如何用虚函数实现动态联编 (3)掌握如何利用虚基类。 2.实验内容 设计一个飞机类 plane,由它派生出歼击机类fighter和轰炸机类 bomber,歼击机类fighter 和轰炸机类bomber 又共同派生出歼轰机(多用途战斗机)。利用虚函数和虚基类描述…

学习threejs,使用对象组合

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.Object3D 三维物体 二…

遇到的问题

刚遇到的问题: 一直以为这个图片数据结构是以下这种: {"descrlong1": [{"CL04": "人力违纪"},{"CL05": "其他"}], }其实数据结构是: {"descrlong1": [{"key": &quo…

发现8个高风险漏洞 NVIDIA GeForce用户必须更新GPU驱动程序

所有NVIDIA GeForce图形处理器都面临着高风险,因为该公司在其图形处理器驱动程序中发现了几个漏洞,这些漏洞可能会让黑客利用你的系统。公司敦促用户更新到最新的GeForce显示屏和VGPU驱动程序,以确保他们的系统不受任何漏洞的影响。 NVIDIA在…

Redis 中 Bitmap 原理和应用

Bitmap Redis中的Bitmap(位图)是一种较为特殊数据类型,它以最小单位bit来存储数据,我们知道一个字节由 8个 bit 组成,和传统数据结构用字节存储相比,这使得它在处理大量二值状态(true、false 或…

微信小程序开发,诗词鉴赏app

文章目录 1. 项目功能思维导图2. 项目涉及到的技术点3. 开发环境4. 项目运行效果5. 部分功能实现6. 关于本人其它项目的介绍 1. 项目功能思维导图 2. 项目涉及到的技术点 使用MySQL数据库实现数据存储使用setInterval实现启动页3s倒计时使用storage实现数据持久化存储&#xf…

什么是阿里云上的主机安全服务?

在数字化时代,数据安全和网络安全成为了企业最关心的问题之一。随着越来越多的企业将业务迁移至云端,如何确保云环境的安全性,成为了企业必须面对的重要挑战。阿里云安全中心(SAS)作为一款全面的云安全解决方案&#x…

在K8s平台部署个人博客

在K8s平台部署个人博客 实验步骤查看wordpress前端的service配置word press 实验步骤 kubectl create secret generic mysql-pass --from-literalpasswordYOUR_PASSWORD把mysql.tar.gz和wordpress.tar.gz上传到K8s工作节点,手动解压即可: 通过网盘分享的…

【原创】java+ssm+mysql收纳培训网系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

Java | Leetcode Java题解之第523题连续的子数组和

题目&#xff1a; 题解&#xff1a; class Solution {public boolean checkSubarraySum(int[] nums, int k) {int m nums.length;if (m < 2) {return false;}Map<Integer, Integer> map new HashMap<Integer, Integer>();map.put(0, -1);int remainder 0;fo…

【时间之外】IT人求职和创业应知【27】

目录 新闻一物理智能公司完成4亿美元融资 新闻二A股IPO和再融资受理、审核回暖 新闻三AI流量变现财富峰会举办 认知和思考决定了你的赚钱能力。以下是今天可能引起你思考的热点新闻&#xff1a; 今日关键字&#xff1a;没吃过猪肉&#xff0c;还没见过猪跑吗&#xff1f; 新…

【前端开发入门】JavaScript快速入门--函数技巧

目录 引言一、函数基本注意事项1. 函数定义2. 默认参数3. 函数返回值及闭包3.1 举个函数返回值的简单例子3.2 当我需要利用函数内部变量做一些运算时&#xff0c;就需要使用js的闭包 二、函数注释1. 单行注释2. 多行注释3. 进阶玩法 三、总结 引言 本系列教程旨在帮助一些零基础…

权威认证!蓝卓获评IDC数字工厂领导者

日前&#xff0c;全球领先的IT市场研究和咨询公司IDC公布了《IDC MarketScape: 中国数字工厂整体解决方案厂商评估&#xff0c;2024》。其中&#xff0c;蓝卓成功入选IDC中国数字工厂整体解决方案厂商&#xff0c;位列领导者象限。 数字工厂整体解决方案领导者 《IDC MarketSc…

$tab的所有用法以及vue关闭页面的方法汇总

1、最简单粗暴的就是直接window.close(); 2.可以设置一个窗口的显示隐藏变量&#xff0c;比如点击新增按钮时&#xff0c;新增页面窗口就进行显示&#xff0c;点击关闭就把这个值置为flase 在最外层绑定open 初始值设为false 点击新增和修改按钮时&#xff0c;把状态置为true即…

全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…

10天进阶webpack---(2)webpack模块兼容性处理

回顾CMJ和ESM的区别 CMJ的本质可以使用一个函数概括 // require函数的伪代码 function require(path){if(该模块有缓存吗){return 缓存结果;}function _run(exports, require, module, __filename, __dirname){// 模块代码会放到这里}var module {exports: {}}_run.call(mod…

【STM32】NVIC / EXTI / AFIO 介绍

文章目录 中断系统NVIC简介NVIC基本结构NVIC优先级分组EXTI外部中断EXIT基本结构AFIO复用IO口EXTI内部框图 AFIO / EXTI / NVIC 相关函数AFIO相关函数EXTI相关函数NVIC相关函数 旋转编码器简介对射式红外传感器计次接线图CountSensor&#xff08;传感器&#xff09;驱动程序封装…

【Linux内核大揭秘】程序地址空间

文章目录 什么是程序地址空间地址空间的组成虚拟内存技术 如何理解程序地址空间页表页表的细节关于堆区 在Linux中如何查看各个分段的信息总结 什么是程序地址空间 程序地址空间是一个程序在执行期间可以访问的内存范围。它由操作系统为每个进程分配&#xff0c;以确保进程之间…

nginx代理出现的请求头中获取不到acc_token问题

1.问题 程序开发完成之后&#xff0c;发现页面登录之后&#xff0c;获取不到用户信息。发现时没有获取到token信息。本地程序开发完成&#xff0c;后端服务成功署到服务器。通过云服务器开放对应的端口&#xff0c;使用本地的前端服务&#xff0c;直接连接服务器后端服务&…

WordPress之generatepress主题安装

1.打开主题列表 2.如果没有自己需要主题点击安装新主题 点击安装并启用 3.不喜欢的 主题可以点击主题进去删除 4.主题自定义编辑 打开自定义&#xff0c;可以修改布局&#xff0c;颜色&#xff0c;排版等等