面向对象
一、面向对象的思想概述
面向对象的基本思想:
面向对象是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称作该软件的问题域。其应用领域不仅仅是软件,还有计算机体系结构和人工智能等。
1、对象的基本概念
对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。
主动对象是一组属性和一组服务的封装体,其中至少有一个服务不需要接收消息就能主动执行(称作主动服务)。
2、类的基本概念
类是具有相同属性和服务的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。
3、消息
消息就是向对象发出的服务请求,它应该包含下述信息:提供服务的对象标识、服务标识、输入信息和回答信息。服务通常被称为方法或函数。
二、面向对象的基本特征
1.封装性
封装定义:为实现各式各样的数据传送,将被传送的数据结构映射进另一种数据结构的处理方式。
封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:
a.把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。
b.信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外部发生联系。
封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的"交叉感染",使软件错误能够局部化,大大减少查错和排错的难度。
java语言中,对象就是对一组变量和相关方法的封装,其中变量表明了对象的状态,方法表明了对象具有的行为。通过对象的封装,实现了模块化和信息隐藏。通过对类的成员施以一定的访问权限,实现了类中成员的信息隐藏。
java类中的限定词:
java语言中有四种不同的限定词,提供了四种不同的访问权限。
1)private
类中限定为private的成员,只能被这个类本身访问。
如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
2) default
类中不加任何访问权限限定的成员属于缺省的(default)访问状态:friend,可以被这个类本身和同一个包中的类所访问。
3) protected
类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
4) public
类中限定为public的成员,可以被所有的类访问。
java中类的限定词的作用范围比较:
访问修饰符 |
访问权限 |
继承 |
private |
本类内部 |
不能继承 |
default |
本类+同包 |
同包子类可以继承 |
protected |
本类+同包+不同子包 |
可以继承 |
public |
公开 |
可以继承 |
2.继承性
特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。
一个类可以是多个一般类的特殊类,它从多个一般类中继承了属性与服务,这称为多继承。
在java语言中,通常我们称一般类为父类(superclass,超类),特殊类为子类(subclass)。
继承最大的作用就是代码的重用,子类可以使用父类中public和protected修饰的方法和属性。Java是不支持多继承的,单继承使Java的继承关系很简单,便于管理程序,接口刚好弥补了继承的缺点。如果没有继承的话,那么我们写代码只能用最原始的方法,复制粘贴,这无疑是增加了代码的冗余,更加的不便于管理。
继承所表达的就是一种对象类之间的相交关系,它使得某类对象可以继承另外一类对象的数据成员和成员方法。若类B继承类A,则属于B的对象便具有类A的全部或部分性质(数据属性)和功能(操作),我们称被继承的类A为基类、父类或超类,而称继承类B为A的派生类或子类。
通过继承实现代码复用。Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。继承而得到的类称为子类,被继承的类称为父类。子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。但Java不支持多重继承,即一个类从多个超类派生的能力。
成员变量的隐藏和方法的重写:
子类通过隐藏父类的成员变量和重写父类的方法,可以把父类的状态和行为改变为自身的状态和行为。
例如:
classSuperClass{
int x;…
voidsetX( ){ x=0; }…
}
classSubClass extends SuperClass{
int x; //隐藏了父类的变量x
…
voidsetX( ) { //重写了父类的方法 setX()
x=5; }….
}
注意:子类中重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型,只是函数体不同。
Super:
java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。Super的使用有三种情况:
1)访问父类被隐藏的成员变量,如:
super.variable;
2)调用父类中被重写的方法,如:
super.Method([paramlist]);
3)调用父类的构造函数,如:
super([paramlist]);
举例:
importjava.io.*;
classSuperClass{
int x;
SuperClass() {
x=3;
System.out.println("inSuperClass : x=" +x);
}
voiddoSomething( ) {
System.out.println("inSuperClass.doSomething()");
}
}
classSubClass extends SuperClass {
int x;
SubClass() {
super(); //调用父类的构造方法
x=5; //super()要放在方法中的第一句
System.out.println("inSubClass :x="+x);
}
voiddoSomething( ) {
super.doSomething(); //调用父类的方法
System.out.println("inSubClass.doSomething()");
System.out.println("super.x="+super.x+"sub.x="+x);
}
}
publicclass Inheritance {
publicstatic void main(String args[]) {
SubClasssubC=new SubClass();
subC.doSomething();
}
}
3.多态性
多态就是多种形态。在面向对象语言中,接口的多种不同实现方式即为多态。
对象的多态性是指在一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或服务在一般类及其各个特殊类中具有不同的语义。例如:"几何图形"的"绘图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"绘图"方法功能不同。
多态是基于继承实现的,其实通俗的讲,多态就是一个方法,多种实现的方式。多态和重载有些许的相似之处,重载是方法名必须相同,但是参数不一样包括参数顺序的不同。而多态则是重写父类的方法,参数也是用的对象,参数的个数不允许改变。
多态的特点:
(1)可替换性,多态对已存在的代码具有可替换性。我们只需要改变其中的对象就可以替换掉不用的对象,相对于开发来说,更加的方便。
(2)可扩充性,多态对代码具有可扩充性,增加新的子类不影响已存在类的多态性、继承性,以及其他特征的运行和操作。实际上新加子类更容易获得多态功能。
(3)接口性,多态是超类通过方法签名,向子类提供了一个共同的接口,由子类来完善或者覆盖它而实现的。
(4)灵活性,它在应用中体现了灵活多样的操作,提高了使用效率。
(5)多态贱货对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。