第四章、Java面向对象(一)
本人也是刚入门Java语言,可能会有一些地方出现错误,描述的不对。如果发现不对的地方请及时指出,好对其进行修改。这样不仅可以让我学到东西,也可以让其他刚入门的朋友学习更正确的内容。
所有内容仅供参考。不具有完全的准确性!
注:关于Java的所有内容都会参考到尚硅谷在网上公开的学习视频及其提供的PPT
前言
- 面向过程(POP) 与 面向对象(OOP)
- 面向过程的代表语言:c 语言
- 面向对象的代表语言:Java语言
- 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
- 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
- 面向对象的三大特征
- 封装
- 继承
- 多态
也有称为四大特征的,除了以上三种再加一个抽象
- 万物皆对象
一、什么是面向对象
OOP:面向对象
OOD(面向对象的设计)
OOA(面向对象的分析)
面向对象是一种思想,是将一个程序的各种功能等抽象出来通过对象来实现,将这些功能封装进对象之中,让对象去实现具体的细节;
当碰到问题的时候,先考虑这个问题有哪些对象,对象与对象之间有什么关系抽象出来。
举个例子(来源于网络):
有一天你想吃鱼香肉丝了,怎么办呢?你有两个选择
1、去超时买需要用到的各种食材,然后洗菜、切菜,开炒,盛到盘子里。
2、去饭店,来一声:老板!来一份鱼香肉丝!
看出来区别了吗?这就是1是面向过程,2是面向对象。
面向对象有什么优势呢?首先你不需要知道鱼香肉丝是怎么做的,降低了耦合性。如果你突然不想吃鱼香肉丝了,想吃开封菜,对于1你可能不太容易了,还需要重新买菜,买调料什么的。对于2,太容易了,大喊:老板!那个鱼香肉丝换成开封菜吧,提高了可维护性。总的来说就是降低耦合,提高维护性!
- 可以理解为:类 = 抽象概念的菜,对象 = 实实在在具体的某个菜
- 面向对象程序设计的重点是类的设计
- 类的设计,其实就是类的成员的设计
二、为什么要面向对象
-
面向对象比较符合人们的思维习惯 而且也更安全。
-
通过使用面向对象思想进行编程可以提升系统的易维护、易复用、易扩展。通过面向对象的三大特征,可以降低系统的耦合度,变的更加灵活。
-
面向对象产生的历史原因有下面两点:
- 计算机是帮助人们解决问题的,然而计算机终究是个机器,他只会按照人所写的代码,一步一步的执行下去,最终得到了结果,因此无论程序多么的复杂,计算机总是能轻松应付,结构化编程,就是按照计算机的思维写出的代码,但是人看到这么复杂的逻辑,就无法维护和扩展了。
- 结构化设计是以功能为目标来设计构造应用系统,这种做法导致我们设计程序时,不得不将客体所构成的现实世界映射到由功能模块组成的解空间中,这种转换过程,背离了人们观察和解决问题的基本思路。
-
可维护性,可扩展性,可重用性是怎么在面向对象中体现出来的?
首先看看面向对象的三大特征:
封装:找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用,只有明确的IS-A关系才能使用,同时继承在在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发者滥用继承,结果造成后期的代码解决不了需求的变化了。因此优先使用组合,而不是继承,是面向对象开发中一个重要的经验。
多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。
三、如何使用面向对象编程
面向对象的编程实现三个大的步骤:
1、首先是分析需求,先不要思考怎么用程序实现它,先分析需求中稳定不变的客体都是些什么,这些客体之间的关系是什么。
2、把第一步分析出来的需求,通过进一步扩充模型,变成可实现的、符合成本的、模块化的、低耦合高内聚的模型。
3、使用面向对象的实现模型
四、类和对象
类 = 抽象概念的菜
对象 = 实实在在具体的某个菜
每个类或对象都有属于自己的属性(如姓名、年龄、性别等)和行为(如吃饭、睡觉等)。
属性:对应类中的成员变量
行为:对应类中的成员方法
Field = 属性 = 成员变量,Method = (成员)方法 = 函数
例:
public class Person{
//属性
String name;
int age = 15;
//方法\行为
public void eat(){
System.out.println("人可以吃饭");
}
public void sleep(){
System.out.println("人可以睡觉");
}
}
五、对象的创建和使用
语法格式:类名 对象名 = new 类名();
使用格式:“对象名.对象成员”,根据具体需要的对象成员选择合适的对象成员(属性或方法)
例:
Person p = new Person();
p.name = "Bos";
p.eat();
System.out.println(p.name);
输出结果:
人可以吃饭
Bos
注意:
如果一个类创建了多个对象,那么每个对象都有属于自己的一套属性和方法(互不干扰)。
例:
Person p = new Person();
p.name = "Bos";
Person p1 = new Person();
p1.name = "James";
System.out.println(p.name );
System.out.println(p1.name );
输出结果:
Bos
James
六、类的访问机制
- 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。(例外:static方法访问非static,编译不通过。)
- 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
参考:
https://blog.csdn.net/czscyb/article/details/45194599