面向对象
版权声明
- 本文原创作者:清风不渡
- 博客地址:https://blog.csdn.net/WXKKang
一、面向过程和面向对象
学习完之前的内容之后,现在我们来进行面向对象的学习,我们常常听人说——Java是一个面向对象编程的语言,它的最重要的一个特点就是面向对象,那么,到底什么是面向对象呢?我们引用一下面向过程这一编程思想,将它们两者进行比较,这样更有助于我们来了解面向对象,下面我们通过生活中一个小小的例子来引入我们的面向对象吧 ~ ~
生活中,我们每天都要做的事情是什么呢?——吃饭,现在我们就来用面向过程和面向对象这两种方式来吃饭,体会一下两者的区别:
面向过程:
通过上面的流程图我们可以看到,从开始做饭到做好饭开始吃,都是要我们一步一步去做的,从第一步开始系统的完成所有操作之后我们才能得出结果,这就是面向过程
面向对象:
当然,我们吃饭也不一定非要自己去做,我们可以去餐馆吃呀,将“做饭”的程序交给厨师处理,我们只需要等着他做好端上饭桌直接开吃就可以了,这样是不是我们做的工作就简单了许多呢?下面我们就来系统的区分一下它们的区别吧:
面向过程是把一项工程分解为一个个的功能模块,用函数来实现。函数是面向过程的核心。面向过程=数据+算法,面向过程的思想在于解决问题分第一步,第二步,第三步等
面向对象是把一项工程看成是一个个对象组成,这些对象之间的相互关系构成了一个项目,类和对象是构成面向对象的程序的主体。面向对象=对象+消息,面向对象的思想在于找出对象,让对象去做这第一步,第二步等
二、面向对象的特点与特征
面向对象的思想特点在于它是一种更符合我们思想习惯的思想,可以将复杂的思想简单化,将我们从执行者变成了指挥者,角色发生了转变,面向对象开发就是不断的去创建对象、使用对象、指挥对象去做事情
面向对象的三大基本特征:封装(encapsulation)、继承(inheritance)、多态(polymorphism)
三、对象和类
1、对象
既然Java语言是一种面向对象的语言,那么,到底什么是对象呢?答案就是:“万物皆对象”,对象(object)代表现实世界中可以明确标识的一个实体,大到整个宇宙,小到一只蚂蚁,只要是可以明确标识的实体,它们都是对象,并且,每个对象都有自己独特的状态标识和行为对象的属性(attribute,或者状态(state)),比如说每个人都拥有自己的姓名和身份证号,那么这两者就是这个人的属性
而对象的行为由方法(也称函数)定义,调用对象的一个方法,就像是在命令对象完成一个动作,比如我们可以定义教师进行讲课的行为,教师对象就可以调用“讲课”这一方法,执行“讲课”的动作
2、类
那么,我们怎样去创建一个对象呢?这就得用到类了,什么是类呢?这世间的东西有很多很多,我们可以通过将事物的公共特性进行归类后产生类,那么,这个类就描述了这个事物的共性,一个类就相当于一个模板,我们可以根据这个模板去做出具体的实际对象,即对象的抽象是类,类的具体化就是对象
例如: 现在有王某某、赵某某、徐某某、袁某某这四个学生,他们都有一个共同的特性——他们都是学生,这样我们就可以创建一个学生类,通过这个学生类我们可以创建(实例化)出某个对象:
3、抽象
抽象方法是面向对象中最基本的方法,也是最重要的方法之一
在面向对象过程中,知道对象是什么但总感觉缺乏一种方法来实现面向对象,要实现面向对象就是要用抽象的方法来归纳对象类型,对象的属性和行为以及对象协作关系
抽象是通过特定的实例抽取共同特征之后形成概念的过程,它强调主要特征、忽略次要特征。一个对象是现实世界中一个实体的抽象,一个类是一组对象的抽象
写了这么多概念化的东西,光靠脑袋想理解起来是挺难的,让我们来愉快的做一个例子,通过这个例子来理解它们吧 ~ ~
例: 汽车是我们生活中很常见的一个事物了,我们也知道它们有很多种类型,那么我们怎样去抽象出一个汽车概念来描述所有汽车呢?首先我们来看看它们的主要特征吧:
通过上图中的“汽车”我们了解到了汽车的一些共有的特性,现在就让我们使用抽象方法来提取所有汽车的共性,但是忽略某个汽车独有的特征(如有的汽车有四个轮胎,有的只有三个,这里抽取出轮胎数量即可,不需要关心它的具体数量),来抽象出一个类吧,如下:
public class Car{
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
private String trademark; //品牌:宝马、奔驰等
private String fuel; //燃料:汽油、柴油等
private int tyre; //轮胎数量:三个或四个等
}
这样,我们就通过抽象方法来抽象出了一个简单的汽车类
4、面向对象的常见术语
下面我们就来介绍一下面向对象中的常见术语以作了解吧 ~ ~
面向对象的常见术语有:OO(面向对象)、OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)、OOT(面向对象测试)
- OOA:面向对象分析。实现分析现实业务,抽象出业务流程和业务对象。通常和具体编码技术无关,只和业务有关
- OOD:面向对象设计。选择具体技术(如Java、.Net)实现业务流程和业务对象,通常和具体技术紧密相关,用于实现业务
- OOP:面向对象编程。例如Java、.Net等,它是一种程序开发的方法,它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性
- OOT:面向对象测试
- OOAD:即OOA和OOD的结合在一起的统称
四、汽车类实例
1、完整汽车类
上面我们通过分析汽车的共同特征创建出了一个简单的汽车类,但是对于一个完整的类来说,它是缺少一个东西的,一个事物不仅有它的属性,还有属于它的动作。那么对于一个类来说它不仅有属性,还有方法(动作),那么就让我们再来完善一下它的”跑”的动作吧,其实就是在类中创建函数,代码如下:
public class Car{
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
public String trademark;
public String fuel;
public int tyre;
public void run(){
System.out.println("一辆品牌为:--"+trademark+"--的车跑起来了 ~ ~");
}
}
那么现在这个汽车类就创建好了,我们现在就可以通过这个类去实例化出一个对象了,那么我们怎样去通过这个类创建对象呢?
2、通过汽车类创建对象并调用其方法
创建对象的注意事项:
- 使用new关键字,和我们动态创建数组一样
- 需要给对象起一个对象名,应遵从驼峰命名规范
- 声明对象的类型,即Car类型,叫做类类型
现在就来创建一个Car对象吧,代码如下:
//java中使用new关键字创建对象,在堆内存中开辟一个空间,产生一个实体
Car theCar = new Car();
创建出一个对象之后,我们就可以通过它来调用对象成员了,具体分为以下两种:
- 调用成员变量—— 对象名.成员变量名
- 调用成员方法——对象名.成员方法
话不多说,直接上代码:
public class Demo{
public static void main(String[] args){
//创建Car对象
Car theCar = new Car();
//调用成员变量并为其赋值
theCar.trademark = "奔驰";
//调用成员方法
theCar.run();
}
}
运行结果:
现在,我们就可以创建一个类,并且可以通过这个类实例化出一个对象,然后再通过这个对象去调用它的属性和方法了,这样的话,如果我们有需要,我们可以将很多东西封装成一个类,使用的时候直接调用就可以了,大大提高了代码的复用性
五、局部变量和成员变量
- 成员变量: 定义在类中的变量
- 局部变量:定义在方法中的变量
局部变量和成员变量的区别:
1、应用范围:
- 成员变量:在整个类中都有效
- 局部变量:只在其声明的方法内有效
2、生命周期:
- 成员变量:它属于对象,它随着对象的创建而创建,随着对象的消失而消失
- 局部变量:使用完马上释放空间
3、存储位置:
- 成员变量:储存在堆内,堆内的实体在没有引用指向其时才进行回收清理
- 局部变量:储存在栈中,当不再使用时马上就会被清理释放
4、初始值:
- 成员变量:如果没有赋初值时,它有默认值(如int类型的初始值为0)
- 局部变量:如果需要使用必须手动初始化
注: 在这里我们需要注意一个细节:
public class Car {
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
//成员变量
public String trademark;
public String fuel;
public int tyre;
public void run(){
//局部变量
String trademark = "宝马";
System.out.println("一辆品牌为:--"+trademark+"--的车跑起来了 ~ ~");
}
}
上方有两个名为trademark的变量,一个为成员变量一个为局部变量,当run();方法内的输出语句需要使用trademark变量时,它使用的是在同一个方法内的局部变量,即就近原则
六、匿名变量
1、概念
匿名对象:没有名字的实体,也就是该实体没有对应的变量名引用
2、用途
当对象对方法进行一次调用的时候,可以使用匿名对象对代码进行简化,如:
Car类代码:
public class Car {
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
public String trademark;
public String fuel;
public int tyre;
public void run(){
System.out.println("一辆车跑起来了 ~ ~");
}
}
测试类代码:
public class Demo {
public static void main(String[] args) {
new Car().run();
}
}
执行结果:
它对类中的方法进行一次性的调用 ~ ~
总结:
- 匿名对象设置的属性永远无法获取,因为没有引用变量指向那个对象
- 任何两个匿名对象使用==比较,永远返回false
- 匿名对象主要应用于实参
好啦,今天的对于面向对象基础的学习就到这里吧!记录学习,记录生活,我还是那个java界的小学生,一起努力吧!!
欢迎各位看官评论探讨哟 ~ ~ 小生在此谢过了 ~ ~