理解面向对象程序设计(oop)
面向对象程序设计简介
面向对象的思想主要基于抽象数据类型。在结构化编程中,人们发现,把某种数据结构和专用于他的各种操作,以某种模块化方式绑定到一起会十分方便,使用这种方式进行编程时数据的接口都是固定的。
面向对象方法直接把所有的食物都当成独立的对象,处理问题过程中所思考的,不再是怎样用数据结构来描述问题,而是直接考虑重现问题中各个对象之间的关系。
把生活映射到计算机程序中,属性表示对象的数据,行为表示对象的方法。现实世界中的任何实体都可归属于某类事物,任何对象都是某一类事物的实例。所以,在面向对象的程序设计中一个类可以实例化多个相同类型的对象。
面向对象编程达到了软件工程的三个主要目标:重要性,灵活性和拓展性。
面向对象程序设计的基本特征
封装,继承,多态
- 封装性
封装是一种信息隐蔽技术,体现于类的说明,是对象的重要特性。封装将数据和加工该数据的方法打包成一个整体,以实现独立性很强的模块。目的在于把对象的设计者和对象的使用者分开,使用者不需要知道其行为实现的细节,只需要设计者提供的消息来访问该对象。 - 继承性
继承是子类共享其父类数据和方法的体制。他由类的派生功能体现。一个类可以直接继承其他类的全部描述,同时可修改和扩充。继承分为单继承(一个子类只有一个父类)和多继承(一个子类可以有多个父类,但是这个特性在Java中不支持)。[类的对象是各自封闭的,如果没有继承机制,则类中的属性,方法就会出现大量重复];
继承不但支持系统的可重用性,而且还促进系统的可扩充性。 - 多态性
对象通常根据所接收的消息作出动作。当同一消息被不同的对象接受而产生完全不同的行动,这种现象称为多态性。利用多态性,用户可以发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定,于是同一消息即可调用不同的方法。
多态的实现受到继承的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方(父类,上层),而将实现这一功能的不同方法置于较低的层次(子类)。这样低层次的对象就能给通用消息回复不同的响应。
面向对象的基本概念
类
具有共同性质的事物的集合称之为类。
面向对象程序设计中,类是一个独立的单位,他有一个类名,内部包括成员变量,用于描述对象的属性;还包括类的成员方法,用于描述对象的行为。
在Java程序中,类被认为是一种抽象的数据类型,这种数据类型不但包括数据,还包括方法,这大大扩充了数据类型的概念。
类是一个抽象的概念,要利用类来解决问题,必须使用类来实例化一个对象,然后通过对象去访问类的成员变量,去调用类的成员方法来实现程序的功能。
一个类可以创建多个对象,他们具有相同的属性模式,但是可以有不同的属性值。Java程序为每一个对象开辟了内存空间,以便保存各自的属性值。
对象
对象是类的实例化后的产物。对象的特征分为静态特征和动态特征两种。静态特征指的是对象的外观,性质,属性等;动态特征的指的是对象具有的功能,行为等。
人们将对象的静态特征抽象为属性,用数据来描述,在Java语言中称为类成员变量,而将类的动态特征抽象为行为,用一组代码表示,完成对数据的操作,在Java语言中称为方法。
一个对象,是由一组属性和一系列对属性进行的操作(方法)构成的。
类和对象的关系
类是对某一类事物的描述,是抽象的,概念上的定义;对象是实际存在的该类事物的个体,因而也成为实例。
对象是类的实例,是一个实实在在的个体,一个类可以对应多个对象。所以面向对象编程,重要的是类的设计,而不是对象的设计。
一个类按同种方法产生多个对象,其初始状态都是一样的,但是修改其中一个的属性时,其他对象不会受到影响。
类的声明与定义
类的声明
在使用类之前,必须先声明类,然后才可以声明变量,创建对象。
类的声明语法
[ 标识符 ] class 类名{
//类的成员变量
//类的方法
}
由上可看出,声明类用的是class关键字。声明类时,在class后加上类的名称,就创建了一个类,然后在类里定义他的成员变量和方法。
标识符没有要求也可以不用标识符;类名建议由一个或者多个有意义的单词连缀组成,形成自我注释,每个单词首字母大写,单词间不要使用其他分隔符。
Java提供了一系列的访问控制符,来设置类,变量,方法及构造方法等不同等级的访问权限。主要有以下四类:
- default (默认模式),默认模式下,不许需要为某个类,方法等添加修饰符。这种方式声明的方法和类,只允许在同一个包(package)内访问。
- private (私有),这是Java语言中对访问权限控制较严格的修饰符。被他修饰的类和方法,只能在当前声明他的类内部进行访问。需要说明的是,类和接口(interface)是不能被private修饰的。
- public (公有),这是Java语言中访问权限较为宽松的修饰符。被public修饰的方法,类等,不仅可以跨类访问,还可以跨包访问。如果需要访问其他包里的公有成员,则需要事先导入(import)包含所需公有类,变量等的那个包。
- protected (保护),介于public和private之间的一种访问修饰符。如果被protected修饰,只能被类本身的方法和及子类访问,即使子类在不同的包中也可以访问。类和接口是不能被protected修饰的。
- final (最终),一旦被final声明,这个类将不能被继承,该类中的方法无法被覆盖。[ 在设计类时,如果这个类不需要有子类,他的细节不允许改变,确信这个类不会再次拓展,就可以使用final修饰]
类的定义
当一个类被声明之后,如果要使用则还需要对其进行定义。
class 类名{
数据类型 属性; //0到多个属性
类名称 ( 参数... ){ //0到多个构造方法
}
返回值的数据类型 方法名称 ( 参数1, 参数2...){ //0到多个构造方法
程序语句;
return 表达式;
}
}
对一个类而言,构造方法(构造器/构造函数),属性和方法,是其常见的3中成员,他们都可以定义成一个或者多个。如果都是0个,那就是相当于定义了一个空类,也就失去了定义类的意义。
类中各个成员之间,定义的先后顺序没有任何影响。各成员可相互调用,但是有一个例外,static修饰的成员不能被非static修饰的成员访问。
- 属性,用于定义该类该类实例所能访问的各种数据
- 方法,蒂尼类中的行为特征或者功能实现(对数据的各种操作)
- 构造方法,一种特殊的方法,专用于构造该类的实例(如实例的初始化,分配实例的内存空间等)
定义类之后,就可以创建类的实例了。创建类实例,是通过关键字new完成的。
类的属性
类的属性也被称为字段或成员变量。
属性的定义
类的属性是变量。
[修饰符] 属性类型 属性名 [=默认值];
属性语法格式的详细说明
- 修饰符可省略,默认的访问权限是default,也可是显式的访问控制符public,protected,private,static,final,其中public,protected,private只能使用一个,static和final是可以组合组合起来的修饰属性。
- 属性类型:属性类型可以使Java允许的任何数据类型,包括基本类型和引用类型
- 属性名:只要是一个合法的标识符就可以;但是从程序可读性角度来考虑属性名应该由一个或多个有意义的单词连缀而成,首字母用大写,其余小写。
- 属性值,这是一个可选项,可以在定义时设置一个可选的默认值。
属性的使用
Java类属性和对象属性初始化顺序
- 类属性(静态变量)定义时的初始化
- static块中的初始化代码
- 对象属性(非静态变量)定义时的初始化
- 构造方法(函数)中的初始化代码
实际应用中,并不建议在类中定义属性时进行初始化。
static修饰的变量称为类变量,被类的实例所共享(只要有一个实例该改变了这个静态值,其他的实例也会跟着改变)。没有被static修饰的变量为成员变量,是实例所私有的,每个实例都不相同。
被static修饰的方法同样是这个类共有的,也被称为类方法。
对象的声明与使用
在实际应用中,仅有类是完全不够的,类提供的只是一个模板,必须依照他创建出对象之后才能使用。
对象的声明
类名 对象名 = new 类名 ();
创建某类的对象
- 声明“由类所创建的对象”的变量
- 利用new创建新的对象,并指派给先前所创建的变量
对象只有在实例化之后才能被使用,实例化的关键字就是new。
对象的使用
对象名称.属性名; //访问属性
对象名称.方法名(); //访问方法
匿名对象
匿名对象就是没有名字的对象。
- 匿名对象没有被其他对象所引用,没有栈内存指向
- 只能使用一次,之后就编程无法找寻的垃圾对象