一、面向对象编程思想
1、面向面向过程编程与对象编程
面向过程编程:
– 传统的C语言属于面向过程编程。面向过程解决问题的思路:通常是分析出解决问题所需要的步骤,然后用方法把这些步骤一步一步实现,最后一个一个依次调用方法来解决。
• 案例:ATM提款机终端系统(面向过程编程)
– 步骤1:输入密码,系统判断是否正确,如正确,进入取款界面,如错误,提示重新输入。
– 步骤2:进入取款界面,输入取款金额,系统判断余额是否足够,如不足,提示;如足够,点钞。
– 步骤3:吐出钞票,打印票据。
面向过程变成思想:
系统以过程/方法为中心来组织
过程间相互发送数据
过程的执行动作与数据被明显的分离
关注的焦点在于数据结构、算法和执行步骤
过程通常难以被复用。
注*• 面向过程编程考虑的问题是程序运行的流程,主要是程序的算法,而数据只是在必要的时候插入到算法中间。
面向对象编程(OOP:Object-OrientedProgramming )
– 从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位。面向对象解决问题的思路:通常是把构成问题域的事务分解成各个对象,给对象赋予相应的属性和行为,通过多个对象的相互协调来解决问题。建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为 。支持面向对象编程是Java 语言的重要特点。
案例:ATM提款机终端系统(面向对象编程)
– 根据要解决的问题,可以抽象出如下对象:
• 客户
• 银行卡
• 现金
• 票据
• 这些对象没有先后顺序,共同作用才构成了整个系统。我们只要用代码设计出这几个类型的对象,然后让他们互相通信、传递消息就可以完成系统功能
面向对象编程思想
系统以对象为中心来组织
对象相互间发送消息
相关的属性和行为被统一到对象上
关注的焦点是对象及对象的职责
使得系统构建更容易,易维护,易扩展,易复用
解决问题的方式更接近人的思维方式,使人更容易理解
注*面向对象编程思想实际上就是一种运用对象、类、继承、封装、聚合、关联、消息、多态性等概念来构造系统的软件开发方法。
2、面向对象基本概念
抽象:
从事物中舍弃个别的非本质特征,抽取共同的本质特征
只考虑与问题域相关的信息,而忽略与问题域不相关的部分
对象:
是系统中用来描述客观事物的一个实体。
可以是有形的,也可以是无形的(如一个客户,一张银行卡,窗体中的一个按钮等等)
对象是构成世界的一个独立单位
具有自己的静态结构(属性)和动态行为(方法)
每个对象有自己的唯一标识
类(class):
类是一组具有相同属性和行为的对象的抽象,类的作用是用来创建对象,对象是类的一个实例
类和对象的关系
抽象和具体的关系。
每一个类在某一时刻都有零个或更多的实例, 类是生成对象的模板
一个类定义了使用哪些数据来描述属性,每一个对象都有相应的属性值数据,一个类通过一系列方法来定义行为,这些方法能在每个对象中被激活
3、面向对象的主要特征
封装(encapsulation):
所谓封装是把对象的属性和行为结合在一个独立的系统单位内部
尽可能隐蔽对象的内部细节,只向外部提供接口
降低对象间的耦合度
封装的重要意义:
使对象能够集中而完整地描述并对应一个具体事物
体现了事物的相对独立性,使对象外部不能随意存取对象的内部数据
继承(inheritance):
也称泛化,继承性是子类自动共享父类属性和方法的机制,在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入自己若干新的内容
继承简化了人们对事物的认识和描述,有益于软件复用,是OO技术提高软件开发效率的重要原因之一
是类之间的一种关系,一般类与特殊类之间的关系
继承关系的语义:“is a kind of”
多态(polymorphism):
指同一个命名可具有不同的语义
OO方法中,常指在一般类中定义的属性或方法被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为,对于子类,可用不同的方法替代实现父类的服务的方法
4、类的定义
什么是类
把相似的对象划归成一个类。
在软件设计中,类,就是一个模板,它定义了通用于一个特定种类的所有对象的属性(变量)和行为(方法)。
5、类的格式
[类修饰符] class 类名{
类的成员
}
修饰符一般为public,也可以没有修饰符。
注意类名的命名规范。类名一般大写
类的成员:
成员变量(属性)
成员方法(方法)
嵌套类
通过“.”调用属性和方法
6、类的成员
成员变量
[修饰符] 类型 属性名 = [默认值];
方法
[修饰符] 返回值类型 方法名(参数列表){
方法体
}
二、对象的创建和使用
1、什么事对象
类(class) — 是对某一类事物的描述
对象(object) — 是实际存在的某类事物的个体,也称为实例(instance)
类是创建对象的模板,对象是类的实例。
2、创建对象
类名 对象名 = new 构造器;
3、构造器
1. 具有与类相同的名称
2. 不含返回值类型
3. 不能在方法中用return语句返回一个值
4. 一般访问权限为public
在一个类中,具有上述特征的方法就是构造器。
4、构造器的作用
1. 完成对象的创建,即完成对象的实例化
2. 一般使用构造器来完成对成员变量的初始化
3. 没有明确的写出构造方法,在编译时编译器会发现该类没有构造器,这时编译器会自动的给这个类增加一个构造器,该构造器没有任何参数,我们称之为“默认的空构造器”
4. 在Java中,每个类都至少要有一个构造器,如果程序员没有在类里定义构造器,系统会自动为这个类产生一个默认的访问权限为public且参数列表为空的构造器
5. 一旦编程者为该类定义了构造器,系统就不再提供默认的构造器
5、对象创建的内存模型
在java中所有的变量、数组、对象都是分配在内存中的,根据变量类型的不同分配的内存也有所不同。Java中主要有3种类型的变量:
局部变量:定义在方法体中的变量;或是方法的形参。
实例变量:即类的属性,也是全局变量。
静态变量:在类中声明为static 的属性。
内存的类别
栈stack:栈的存取速度比堆快,效率高。在栈内保存基本数据类型的局部变量和对象的引用值。
堆heap :堆可以保存那些对空间要求较大的变量。如对象的属性和数组的元素。在堆内存中开辟空间,只能通过内存分配操作符号new,凡是出现关键字new的地方必定分配了一个堆内存。
我们在实例化一个对象时,同时操作了栈内存和堆内存。在栈内保存对象的首地址,即 引用;在堆内存中保存了对象的属性。对对象的所有操作只能通过引用完成,一旦引用出栈释放没有任何引用指向该对象,对象就变成垃圾失效。
7、匿名对象
定义
创建完对象,在调用该对象的方法时,也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫匿名对象
使用匿名对象的情况
如果对一个对象只需要进行一次方法调用
8、垃圾回收机制
垃圾回收机制关键字:finalize()
Java的垃圾回收机制是自动的,它保证程序健壮的主要手段,避免了由于程序员忘记回收内存而引起的内存泄漏,同时也避免了回收内存带来的代码繁琐。
垃圾回收机制实际上是JVM内部运行的一个优先级比较低的后台线程,这种多线程的模式使得java 具有更好的性能,完全不用程序员参与。
垃圾回收机制仅仅作用于堆内存,于栈内存无关。
对于程序员来说,对象何时变成垃圾呢?
对象的引用被赋值为null; Person p = new Person( ); p = null;
一次性使用的匿名对象; new Person( ).sayHello( );
超出生命周期的;如:
for( int I = 0; i< 100; i++){
Person p = new Person( );
}
这里,变量p 被实例化100次,每结束一次循环,变量p就超出生命周期,对象变为垃圾。
9、变量的作用域
类变量
用static修饰的成员变量,它们在类被载入时创建,只要类存在,static变量就存在
实例变量
类体中声明的成员变量,即非static的属性
局部变量
方法体中声明的变量,方法中的参数,或代码块中声明的变量,都是局部变量
局部变量只在方法调用的过程中有效,方法调用结束后失效
10、变量初始化的顺序
1. 隐式赋予变量默认值
成员变量
3. 显式赋予初始值
4. 通过构造器体赋予新值
三、this关键字
1、this 关键字
代表对象自身的引用
一个引用
指向调用该方法的当前对象
通常在类的方法定义中使用
2、用this 关键字的情况
方法中的变量与成员变量重名
在一个构造器中,调用其它重载的构造器
返回当前对象的引用