“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想,简称 OP。“面向过程” 也可称之为“面向记录”编程思想,就是分析出解决问题所需要的步骤,然后用函数把这些步 骤一步一步实现,使用的时候一个一个依次调用就可以了。所以面向过程的编程方式关注点不 在“事物”上,而是做这件事分几步,先做什么,后做什么。例如:早晨起来:起床、穿衣、 洗漱、上班,只要按照这个步骤来,就能实现“一天”的功能,整个这个过程中关注的是一步 一步怎么做,并没有关注“人”这个事物。再例如:开门、调整座椅、系好安全带、踩离合、 启动、挂档、给油,只要按照这个步骤来,车就走了,显然关注点还是在步骤上,只要实现每 一步就行,整个过程并没有关注“汽车”这个事物。
“面向对象”(Object Oriented)是一种以对象为中心的编程思想,简称 OO。随着计算机技 术的不断提高,计算机被用于解决越来越复杂的问题。一切事物皆对象,通过面向对象的方式, 将现实世界的事物抽象成对象。通过面向对象的方法,更利于用人理解的方式对复杂系统进行 分析、设计与编程。同时,面向对象能有效提高编程的效率,通过封装技术,可以像搭积木的 一样快速开发出一个全新的系统。面向对象将对象作为程序的基本单元,将程序和数据封装其 中,以提高软件的重用性、灵活性和扩展性。Java语言是一种面向对象的程序设计语言,而面向对象思想(OOP)是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。使用面向对象编程思想开发系统,在现代开发中会将面向对象贯穿整个过程,一般包括: OOA/OOD/OOP:
面向过程和面向对象有什么关系呢?面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可以说面向过程是一种基础的方法。它考虑的是实际地实现。一般的面向过程是从上往下步步求精。面向对象主要是把事物给对象化,对象包括属性与行为。当程序规模不是很大时,面向过程的方法还会体现出一种优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。但对于复杂而庞大的系统来说,面向过程显得就很无力了。
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的 是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对 象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。
面向对象的思想概述:程序员从面向过程的执行者转化成了面向对象的指挥者。面向对象分析方法分析问题的思路和步骤:
软件存在的意义就是为了解决现实世界当中的问题,它必然模拟现实世界,也就是说现实 世界中有什么,软件中就对应有什么。 面向对象编程思想中关注点是“对象”或者“事物”,那么在编程语言当中要想创建对象则必须先有类,那么类和对象分别是什么,它们的区别和联系是什么呢?
类:是一类具有相同特性的事物的抽象描述,是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。 可以理解为:类 = 抽象概念的人,比如黄种人;对象 = 实实在在的某个人,比如诸葛亮。
对象:是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为。类:我们叫做class。 对象:我们叫做Object,instance(实例)。以后我们说某个类的对象,某个类的实例。是一样的意思。 通过类可以创建对象,对象又被称为实例(instance),这个过程也可以称为实例化。对象具有共同特征,进行抽象形成了类,所以从对象到类称为抽象。
通过以上的描述,我们得知常见的类的成员有 属性和方法,而属性描述的是状态,方法描述的是行为动作。
代码示例
public class Person { //属性name,age,isMale // 成员变量 String name; int age = 1; boolean isMale; //成员方法 public void eat() { System.out.println("人可以吃饭"); } public void sleep() { System.out.println("人可以睡觉"); } public void talk(String language) { System.out.println("人可以说话,使用的是:" + language); } }
类定义之后,就可以使用类这个“模板”来创造“对象”了,一个类是可以创建多个对象 的哦!怎么创建呢,语法是什么?其实语法格式很简单:new 类名(),这样就可以完成对象的创建了。俗话说,你想要什么 java 都可以给你,想要啥你就 new啥。
创建自定义Person类的对象
public class PersonTest { public static void main(String[] args) { //2. 创建Person类的对象 Person p1 = new Person(); //Scanner scanner = new Scanner(System.in); //调用对象的结构:属性、方法 //调用属性:“对象.属性” p1.name = "Tom"; p1.isMale = true; System.out.println(p1.name); //调用方法:“对象.方法” p1.eat(); p1.sleep(); p1.talk("Chinese"); //******************************* Person p2 = new Person(); System.out.println(p2.name);//null System.out.println(p2.isMale); //******************************* //将p1变量保存的对象地址值赋给p3,导致p1和p3指向了堆空间中的同一个对象实体。 Person p3 = p1; System.out.println(p3.name);//Tom //给age属性赋值 p3.age = 10; System.out.println(p1.age);//10 } }
针对于目前来说,大家必须要知道 java 虚拟机有三块主要的内存空间,分别是“虚拟机栈(后面简称栈)”、“方 区”、“堆区”,方法区存储类的信息,栈中存储方法执行时的栈帧以及局部变量,堆区中主 要存储 new 出来的对象,以及对象内部的实例变量。其中垃圾回收器主要针对的是堆内存, 方法区中最先有数据,因为程序执行之前会先进行类加载。栈内存活动最频繁,因为方法不断 的执行并结束,不断的进行压栈弹栈操作。
属性的类型可以是Java的任意类型,包括基本数据类型、引用数据类型(类、接口、数组等)。如果是class类作为属性,赋值的时候是赋值其new出来的对象。
成员变量(属性)和局部变量的区别
在 java 语言当中,当实例变量 没有手动赋值,在创建对象的时候,也就是说在 new 的时候,系统会对实例变量默认赋值, 它们的默认值请参考下表:
代码示例
/* * 类中属性的使用 * * 属性(成员变量) vs 局部变量 * 1.相同点: * 1.1 定义变量的格式:数据类型 变量名 = 变量值 * 1.2 先声明,后使用 * 1.3 变量都有其对应的作用域 * * * 2.不同点: * 2.1 在类中声明的位置的不同 * 属性:直接定义在类的一对{}内 * 局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量 * * 2.2 关于权限修饰符的不同 * 属性:可以在声明属性时,指明其权限,使用权限修饰符。 * 常用的权限修饰符:private、public、缺省、protected --->封装性 * 目前,大家声明属性时,都使用缺省就可以了。 * 局部变量:不可以使用权限修饰符。 * * 2.3 默认初始化值的情况: * 属性:类的属性,根据其类型,都有默认初始化值。 * 整型(byte、short、int、long):0 * 浮点型(float、double):0.0 * 字符型(char):0 (或'\u0000') * 布尔型(boolean):false * * 引用数据类型(类、数组、接口):null * * 局部变量:没有默认初始化值。 * 意味着,我们在调用局部变量之前,一定要显式赋值。 * 特别地:形参在调用时,我们赋值即可。 * * 2.4 在内存中加载的位置: * 属性:加载到堆空间中 (非static) * 局部变量:加载到栈空间 * */ public class UserTest { public static void main(String[] args) { User u1 = new User(); System.out.println(u1.name); System.out.println(u1.age); System.out.println(u1.isMale); u1.talk("韩语"); u1.eat(); } } class User{ //属性(或成员变量) String name; public int age; boolean isMale; public void talk(String language){//language:形参,也是局部变量 System.out.println("我们使用" + language + "进行交流"); } public void eat(){ String food = "烙饼";//局部变量 System.out.println("北方人喜欢吃:" + food); } }
类变量有2种访问方式,如下所示:
- 类名.静态成员变量 //推荐
- 对象名.静态成员变量 //不推荐
- 对象名.静态成员变量
在Java中,一共就三种变量,他们分别是静态变量 丶成员变量丶局部变量 。我们可以从代码声明位置丶所在内存位置丶生命周期丶是否有默认值丶作用域(有效范围)大小几个方面去区分他们。