javaSE——面向对象(简述)

本文介绍了面向对象的基本概念,包括对象、对象的描述、对象的引用者。深入讲解了面向对象程序设计理念,对比了面向过程和面向对象的区别。重点讨论了面向对象的三大特性——封装、继承和多态,并详细阐述了封装的好处和实现方式,以及继承的原理和应用。此外,还涵盖了类与对象的关系、接口、抽象类、内部类、枚举和Lambda表达式等Java面向对象编程的重要知识点。
摘要由CSDN通过智能技术生成

一、什么是面向对象(opp)

1.什么是程序

(《操作系统》对其有明确定义)。这里不是讨论程序的定义

在我的认识中,自我接触编程以来,以至于即将走上工作岗位。我写的程序都是在 解决问题

从基础的 解决一些数学问题(如:求和,水仙花,平闰年等等)。到解决生活中的小需求(在控制台与自己互动的一些小案例)。程序之于我,就是解决问题的一种方式。

无论是面向对象 还是 面对什么,管他呢,究其根本它不过是解决问题的一种方式。

2.什么是对象

java中万物皆可为对象。

对象可以代表一切客观存在的事物!看得见(不局限于肉眼)!摸得着!具有实体!一个对象代表着一个真实存在的物体!

3.如何描述对象

这里的描述指的是,将现实生活中真实存在的物体,映射到程序中(在java中)的一种方法或者规范。

在java中从两个方面描述对象:对象的属性、对象的方法(行为)。

  1. 对象的属性
    对象的属性指的是,这个具体的事物有哪些特征(如:一瓶饮料这个对象,它具有容量,价格,味道等等特征)
  2. 对象的方法
    对象的方法,一般由对象的 调用者(对象的引用)来调用。一般用来对外提供服务。及“我(对象)”可以做什么。方法就是由程序员编写的函数。在opp程序语言设计中,方法一般可以独立完成一个行为或人物。

4.什么是对象的引用者

假设有 一个 Person 类

先看下面这段代码:

Person p = new Person(); 
/*	这句话的意思不是创建了一个类型为Person 的 p对象。!!!
	可以这样去理解,但是不能这样去解释!!!
	代码的执行顺序应该是从 左——> 右。
	new Person();这句话代表着,创建了一个对象。
	Person p 这句话代表着一种操作权限。意味着 p可以操作一个 Person类的对象!
	通过 = 将两者之间的关系 对应起来。
*/
/*	“=” 是赋值运算符。变量p中存放的是,这个Person对象在(堆)内存中的地址。
	因此可以将其理解成这个对象的引用,即对象的操作者。
*/

二、面向对象程序设计理念

1.面向过程

引入一个脑筋急转弯:大象装冰箱的故事。

将大象装冰箱需要几步呢?答:第一步打开冰箱。第二步把大象装进去。第三步关闭冰箱门。
如果将其映射到程序中,首先找找我们要解决的问题是是那么?----把大象装进冰箱
解决方式是什么? 第一步-----第二步-----第三步…。

这就是面向过程的解题思路:将程序的重心放在 告诉计算机第一步怎么做第二步怎么做第三步怎么做 这样就可以解决问题。如果映射到程序中就是:先执行哪个函数,再执行哪个函数,,,直到解决问题为止。

2.面向对象

所谓面向,就是将程序的重心放在哪。面向对象就是将程序的重心,放在设计对象上。通过 操作对象(调用对象中的方法/函数)来解决问题。

生活中我们解决问题,为了追求高效,往往我们会借助一些工具。比如我们盖一栋房子,我们需要各种各样的人和材料,有人设计图纸,有人搬砖,有人打水泥,有人砌墙,有人开拖拉机,有人负责统筹安排。总的来说就是四个字 分工明确相互配合

所谓分工明确,就是根据什么人或者工具或者事物 可以完成什么工作 (比如搬砖的工人他的 体力大,因此让他去搬砖;懂设计的人我们会让他去设计图纸;挖土机可以高效的铲土;扳手可以用来拧螺丝。),程序中的对象也是一样。因此创建对象时,这个对象有什么——对象需要哪些数据(属性)以及可以做什么——如何使用这些数据(方法/函数),是我们需要思考的问题。

创建对象时,尽可能根据需要去描述对象。比如描述 “一个学生” 这个对象,我们可能只需要他的姓名、学号、性别、年龄,这些属性。并不需要他一顿可以吃几碗饭这种、用左手写字还是右手,这种“不重要(对程序没有帮助)”的属性。

对象有什么是比较广泛的,但是对于程序来说,有可能仅仅需要操作其中部分的属性(数据)。在锻炼思维的时候,我更倾向于先设计方法,再补充所需要的数据。


三、面向对象程序设计方法(★★★★★)

1、类 与 对象

什么是类?

在现实生活中,类是由具体的具有共性的事物,一步步抽象出来的。方便我们管理和认识。(比如猫类,狗类,人类,草本植物,被子植物
等等)。如果从离散的角度考虑,没有共性的事物也可抽象成一个类。但是程序中编写这样的类对解决问题毫无帮助。

类与对象的关系

对象是现实生活中客观存在的具体的事物,可以看的见摸得着的东西。类是事物的集合,那么集合中某一个具体的元素,就是所谓的 对象。

在程序中,将具有相同的属性以及方法的 对象,被抽象成一个集合,在程序中被称为 “类”。对象的存在往往属于某个类,创建什么样的对象需要一个统一的模板——类。

举个小例子:当我们玩游戏时,需要创建一个具体的人物角色,那么程序中就需要有一个“人物”这样的模板。这个人物有身高,体重,技能,头发颜色,眼睛颜色等等。但是这个模板并没有指定 身高,体重的具体的值。具体的数值,随着对象的诞生而诞生。

对象是需要通过类去创建!

2、面向对象三大特点——封装

为什么要封装

程序中通过操作 对象 来解决问题,如果对象的数据保护的不够好(封装遭到破坏)。这就意味着,对象的操作者——对象的引用。可以随意修改对象的内部数据。对于这样的“不完全的对象” 严重影响程序的安全性。

封装的原则/好处
  1. 确保数据的隐私性——外来者(对象的引用)无法直接操作对象的属性。
  2. 隐藏服务细节——对象的引用者仅仅知道 可以调用此对象的哪些方法,调用方法可以获得什么。至于这些方法如何实现,操作者无需知道。
如何封装

java中提供private关键字供对象使用,表示这个属性其他人不可访问。
被private 修饰的变量(属性)和方法,表示只有在对象的方法 内部 之间才可以用。

封装不意味着封闭,对象通过getXXX、setXXX方法,使对象对外提供操作这些数据的机会。

既然又对外提供操作,那么又何必多此一举呢?

有了封装就是有了保障数据安全的可能性,可以根据需要根据实际情况选择是否对数据进行保护,这与对数据的安全的不作为,是两回事。

封装远远不止 保障数据的安全、隐藏服务细节,便于维护 这样简单。类的设计本身也是封装的体现。

4、面向对象三大特点——继承

什么是继承

一个新类可以从现有的类中派生,这个过程称为类继承,新类继承了原始类的特
性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

为什么要继承

在很多时候,设计单个且相互没有关联的类,不利于去解决问题。并且,在现实生活中,类 是一个强大的集合,它的成员可以是 另一个类。

比如:教师这个群体。教师有很多分类{ 普通教师、特级教师 }。
普通教师具有授课小学生,中学生的能力。
特级教师不仅具有授课小学生,中学生的能力,还有授课高中生的能力。

如果没有继承,我们要编写两个类,即 class OrdinaryTeacher{}、class SuperTeacher{} 两个类。但两个类的差别,仅仅在于 特级教师比普通教师多了 教授高中的能力。但是在编写代码的时候,却要编写两个几乎一样的类。这不仅增加了编写代码的量,还增加了维护的负担。

如何继承

通过extends 关键字。实现两个类之间的继承关系。(java不支持手动的多继承,但支持多实现)

继承的特点(优点)

子类拥有父类的的属性和方法(private成员由于权限关系因此不能访问,可以将private 换成 protected 且不会破坏原有类的封装。)
子类可以拥有自己属性和方法,即子类可以对父类进行扩展
子类可以用自己的方式实现父类的方法:子类可以根据实际需要重写父类中(允许重写)的方法。

方法重写的原则、注意事项:
1.子类重写父类的方法时,方法名,参数列表,返回值类型,都相同。
2.子类重写父类的方法的访问修饰符的权限 要小于等于 父类中方法的访问权限。

5、面向对象三大特点——多态

什么是多态

Java中多态性指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。

 这到底啥意思呢?

首先实现多态的前提是要有继承。多态的实现是发生在父子类之间的。

我们都知道,一个对象同时只能有 一个引用者(操作者)。这是因为,在操作者获取对象的引用时,已经声明了,只能操作此对象。

发送消息: 就是这个对象的操作者,操作了一次这个对象(调用了一次这个对象的方法。)。
**做出响应:**就是,这个对象执行了这个操作。

假设有三个子类和一个父类。倘若我们用 父类的 引用 去操作 三个子类型的对象会发生? 很显然java是允许这种操作方式的。这种 操作方式称之为——多态。

向上造型&向下造型

向上造型:其实就是父类型引用指向子类型对象。
向下造型:合理的向下造型,实际上是 降低引用权限。需要满足以下特点:

  1. 父类型的引用中,保存的是子类型的对象。(向上造型)
  2. 将父类型的引用 强转为 其具体操作的子类型对象的引用。(向下造型)
class Father{}
class Child01 extends Father{}
class Child02 extends Father{}
class Child03 extends Father{}
class Test{
	public static void main(String[] args){
		Father f = new Child01();//向上造型
		Child01 c1 = (Child01)f; //合理的向下造型
		Child02 c2 = (Child02)f;//不合理的向下造型
		/*f中保存的具体对象是Child01这个子类对象
		  因此只能将其造型为Child01这个对象的引用。
		*/
	}
}
编译期类型与运行期类型

在进行对象造型时,用来声明引用的父类类型我们称为编译期类型,而实际用于构建对象的子类类型我们称为运行期类型。

6.接口和抽象

抽象类
与抽象所对立的是具体。

java中通过操作对象来解决问题,对象的创建都需要类。被创建的对象迄今为止都有所属(明确的属于某一类型)。但并不是所有的类都可以创建具体的对象,比如Animal、Shape等类。这种类型,就可被称为抽象类。用abstract修饰。

尽管我们可以通过代码new一个对象出来,但是这对象,有些违背了,对象的概念即物质世界真实存在的个体。

抽象类是抽象方法的容器,如果某个类中包含有抽象方法(没有具体的方法体,只有签名的方法),那么该类就必须定义成抽象类。抽象类中也可以包含有非抽象的方法甚至抽象类中可以没有抽象方法(只要一个类不应该有具体对象,就应该是抽象类,但不一定是有抽象方法)

接口
接口是比抽象类更抽象的存在,也可以称接口为纯抽象类。

接口,可以理解为类与类之间,模块与模块之间的,数据交换方式。它可以减少模块之间的数据依赖程度,解耦合。比如,A、B两个模块。B的执行需要A中提供的方法和数据的支持。如果放任这种现象出现,会严重影响编码效率,分工合作效率。

接口的好处和作用还有好处不仅仅有完善多重继承,控制代码规范,以及解耦合这么简单,由于水平有限,难以深入。

Lambda表达式

当接口中只有一个方法时,此时的接口被称为 函数式接口,可以通过lambda表达式进行简化其实现类。

7.内部类

成员内部类

有时候,有的类仅供一个类使用。(比如,实现一个链表,链表中需要用到节点这个类,虽然可以在外部重新封装,但是同样的权限 意味着 同样提供给其他不相干的类使用,但是对于其他类,我们不希望这种节点类被使用。)
可以将这种类 其定义在需要使用它的类中,作为外部类中的一个成员,增强对它的保护。

  1. 成员内部类中不能存在任何static的变量和方法
  2. 成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类
局部内部类

嵌套在方法和作用域内的,对于这个类的使用主要是应用于解决比较复杂的问题,想创建一个类来辅助我们的解决方案,又不希望这个类是公共可用的。局部内部类只能在该方法和作用域中被使用,出了该方法和作用域就会失效。

匿名内部类

内部类仅需要构建一个单一的对象,那么这个类其实并不需要额外取一个特有的名字,对于不存在名字的内部类,我们称为匿名内部类。匿名内部类必须继承一个父类或实现一个接口。

  • 匿名内部类没有构造方法。
Lambda表达式

每一个lambda表达式都对应一个接口类型。“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为默认方法不算抽象方法,所以也可以给函数式接口添加默认方法。Lambda表达式中无法访问到默认方法。
JDK8以后 Lambda表达式不会被编译生成传统带$的匿名内部类。

静态内部类

使用static修饰的内部类我们称之为静态内部类。
静态内部类没有它的外部类的引用。
静态内部类创建不需要依赖于外部类的。
不能使用任何外部类的非static成员变量和方法。
和成员内部类不同,static内部类能够声明static的成员。

8.枚举

枚举(在Jave中简称为Enum)是一个特定类型的类。所有枚举都是Java中的新类java.lang.Enum的隐式子类。此类不能手工进行子类定义。

  • enum不能有public的构造函数
  • 所有enum值都是public , static , final
  • enum默认实现了java.lang.Comparable接口。
  • enum覆载了toString方法
  • enum提供了一个valueOf方法,此方法与toString方法相对应
  • enum提供了values方法,此方法便于遍历所有的枚举值
  • enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举
    值声明的顺序而定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值