1、 面向对象编程
1.1、OOP
Java的核心思想是面向对象(OOP Object-Oriented Programming)
,面向对象是一种编程的范式,它通过将数据和操作数据的代码组织为对象,来设计和实现软件。OOP 的主要目标是提高软件的可维护性和可重用性,它适合处理复杂问题,处理多人协作的问题。
面向对象编程的本质是:以类的方式组织代码,以对象的形式封装数据
。
- 面向过程强调的是通过一系列步骤来完成某种功能,基本不考虑后续的修改,所以面向过程是具有逻辑性的,它按照一步步的过程来操作,缺少其中一个步骤就可能导致结果发生错误。
- 而面向对象,更多的是要进行模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,所以,面向对象的开发更像是一个具备标准的开发模式。
比如说我们用一个简单的例子来理解面向过程和面向对象:
面向过程:告诉你做饭的每一个步骤,你需要按照指南一步步进行
- 准备食材
- 处理食材
- 炒菜,装盘
- 吃饭
它强调的是操作的步骤,你需要关心每一个步骤的具体实现,按照顺序调用这些步骤来完成最终的目标。
面向对象:面向对象则像是厨师们在厨房里工作。厨房里有不同的“对象”,比如厨师、炒锅、食材等,每个对象都有其特定的职责和行为:
- 对象厨师:负责调用其他对象的功能,指挥厨房工作的流程。
- 对象炒锅:具有烹饪的功能,可以“炒”食材。
- 对象食材:每种食材都有自己的特点
面向对象的过程中,不需要关心每一步的具体实现细节,只需要知道每个对象的功能和如何调用它们。
比如,想吃蛋炒饭时,你只需告诉厨师“做一份蛋炒饭”,厨师就会协调炒锅和各种食材,按照各自的职责完成任务。
面向过程更适合解决一些简单、规模小的问题,而面向对象适合解决规模大的问题。
在面向对象编程中,类(Class)和对象(Object)是面向对象的核心概念。它强调的是对象及其职责,通过设计互相协作的对象来解决问题。
比如之前常用的Scanner、Print等,我们只需要知道它们的功能,然后在需要时调用它们即可,并不关心它们怎么实现的,这就是面向对象的好处:一个已经存在的对象,我只需要知道其功能,就能直接拿来使用。
1.2、类和对象
类和对象是面向对象编程(OOP)的两个基本概念。
1.2.1、类
我们可以把类当成一个模板看待,通过这个模板可以量化产生无数的对象,由类构建对象的过程成为创建这个类的实例对象。
类本身不占用内存空间,只有在创建对象时,才会分配内存。可以把类看作是对象的设计图或模具,它是封装对象属性和行为的载体,而对象就是类的一个实例。
类和对象是共生的,我们通过代码编写一个个的类,然后通过类去生成一个个对象,我们通过操作和管理这些对象,最终产生一个复杂的程序。
类主要的两个组成:
- 字段(Fields):也称为属性或成员变量,表示对象的状态或特征。例如,人的类可能有姓名和年龄两个字段。
- 方法(Methods):表示对象的行为或功能。方法定义了对象可以执行的操作。例如,人的类可能有走路和说话的方法。
1.2.2、对象
那么什么是对象?
万物皆为对象,问题领域中的实体和概念都可以抽象为对象。如在学校领域中:学生、老师、课程、班级等等都可以当成一个对象处理。
- 对象在一个系统中是唯一的
- 对象具有属性和行为:静态部分(属性)和动态部分(行为)
现实中我们是怎么样描述一个人的?通常是通过名字、高矮胖瘦、性别、年龄等属性。除此之外一般还会描述他当前正在做的事情:说话、跑步、哭泣等等行为。通过这几个方面我们可以充分了解一个人。
比如张三正在哭,你向别人介绍张三:这人叫张三(属性姓名),都20好几的人了(属性年龄),180的大个子(属性身高),你看,动不动就哭(行为哭泣)。 - 对象具有状态:某个行为发生后可能会改变属性的取值。
- 对象都是某个类的具体实现。
比方人是一个类,需要有姓名、年龄、身高、体重等等特征,有跑步、走路、吃饭、学习等等行为。
那么对象呢,假如一个人叫张三,另一个叫李四,这两个他们的特征不同,正在进行的行为也不同,而张三李四就是依据人这个类为模板而生成的不同对象。
我们在计算机中如何准确去描述正在学习的学生A?
1、首先有一个统一的学生类(具有所有学生共用的特征):属性:学号、姓名、年龄、性别、班级等等。 行为:学习、游戏、运动等等
2、我们将学生这个类实例化为一个具体的对象,这时候考虑怎么通过类去区分出来是学生A?
3、先通过属性(姓名:A、学号:1111111、年龄:18、性别:男......),通过这些就能确切的定位到学生A
4、然后再通过行为去描述学生A正在学习。
这样我们通过分析学生的属性和行为就能确定一个具体的学生对象。
1.3、包
在Java中,类是存放在包(package)中的,借助包可以轻松组织代码,便于对类进行区分。
1.3.1、包的定义
在java中我们需要创建不同的类,根据类创建对象去编写程序,所以当我们的类越来越多时,如果将所有的类放在一起,管理的难度可想而知,而且我们的类又是唯一的,当类很多且堆积在一起的情况下,恐怕就连起名字都是一件让人头疼的事情。
所以在Java中引入了包(package)的概念。它类似于文件夹,可提供多层的命名空间,不同包内的类可以重名,因为Java中的类在加载时,是通过 包+类名 来区分的。
包的作用如下:
- 目录结构:通过建立不同的包,可以把具有相同功能的类放在同一包中,方便进行管理和维护(如controller、service等等)
- 命名空间:Java中类的全限定名为 包路径+类名,可以确保唯一性,避免类名的冲突。
- 访问控制:可以更方便的控制类的访问权限
- 代码重用:通过将功能相关的类组织到包中,可以更容易地重用代码。其他项目可以通过导入需要的包来使用其中的类和接口,而不必担心命名冲突。
每个类中的第一行代码就是包定义语句,通过关键字package + 类所在的包。后面跟包的导入语句,关键字为import
- package:用来指定所属的包,没有该关键字,则类默认属于无名包 ( unnamed package)
- 类内第一行使用package 关键字指定包名
- class文件位于对应的路径内
- import:入各种包层次下的类。如果想快速导入一个包内的所有类可以使用 * 号。(使用全限定名可以放置不同包内名字相同的问题)
package 包名; //必须位于源文件第一行,且只能有一个,表示该类所在的包(没有该语句则类位于默认包内)
import 包名+类名; //import需要在package之后,可以有多个
import 包名.*; //可以直接导入包内所有的类
............
Oracle公司建议使用公司的internet域名倒写作为包名。 比如域名为 xx.com,则包名为 com.xx
import除了可以导入类外,还能导入静态方法和静态字段
import static javaJang.System.*; 导入System类的静态方法和静态字段
1.3.2、常用包
Java的一些核心类都方法了Java包及其子包内,扩展的类放在了 javax包及其子包内,这些就是API。
- java.lang:内部包含Java语言的核心类(String、Math、System等等都在该包内),该包内的类不用impot导入即可使用,系统会自动导入。
- java.util:包含了Java的工具类和接口、集合框架类和接口(List、Set等都在该包内)
- java.io:包含了Java的输入、输出相关的类和接口
- java.text:包含与Java格式化相关的一些类
- java.sql:JDBC连接数据库相关的类和接口