第四章.类与对象
主要内容:1.面向对象的基本概念 2.类定义 3.对象的创建 4.类成员和实例成员 5.访问控制符 6.对象的数组和组合 7基本类型的封装类
4.1——面向对象程序设计
一、面向对象的概念:面向对象程序设计方法把软件系统分解为对象,对象就是软件系统的基本元素,这更接近与人类的思维方式。面向对象方法将数据和数据的处理封装在一起形成对象,并采用对数据抽象和隐藏而形成类。需求的变动往往是功能的变动,而功能的执行者——对象常常不会有大的变化,这使得按照对象设计的软件系统结构比较稳定,因而非常适合大型应用程序与系统程序的设计与开发。
二、面向对象程序设计的特点
1.信息隐藏和封装性
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
2.继承性
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.组合性
组合用于表示类的“整体/部分”关系。例如主机、显示器、键盘、鼠标组合成一台计算机。
4.抽象
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
5.多态性
多态性是指允许不同类的对象对同一消息做出不同响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序方法同名问题。
三、过程与对象
面向对象的一个重要思想就是通过抽象得到类,即将数据和操作这些数据的方法封装在一个类中。抽象的内容有两个:一是成员变量,即数据;二是方法,即数据上的操作。
四、Java程序的基本结构
一个Java应用程序至少有一个主类,每个Java源文件中都可以有一个主类。
Java应用程序总是从主类的main方法开始执行。
Java程序的基本单位是类,即一个Java程序就是由若干个类构成。一个Java程序可以将它使用的各个类分别存放在不同的源文件中,也可以将它使用的类放在一个源文件中。一个源文件中的类可以被多个Java程序所重复使用,从软件设计角度看,Java语言的类是可复用代码
4.2——定义类
一、类中包含两部分:成员变量和成员方法。
二、成员变量是类的属性,反映了对象的静态特性。
三、成员方法是类的行为,反映了类的动态特性。
4.3——构造方法与对象的创建
一、创建对象的语法格式:
格式一:
类名 对象名[=null];
对象名=new 类名();
格式二:
类名 对象名=new 类名();
二、Java中堆与栈的区别
1.Java把内存划分成两种:一种是栈内存,一种是堆内存。
2.在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配。
3.当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
4.堆内存用来存放由new创建的对象和数组。
5.在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
三、成员变量的默认值
四、构造方法
1.构造方法是一种特殊方法。
2.构造方法的名字必须与它所在的类的名称完全相同。
3.构造方法没有返回类型。
例如
class Employee{
private int eno;
String ename;
Employee(){ }
Employee(int eno,String ename){
this.eno=eno;
this.ename=ename;
}
}
4.4——类变量和实例变量
一、 成员变量用来描述对象的属性,即静态特征。
成员变量分两种:类变量和实例变量,用关键字static修饰的成员变量是类变量,不用static修饰的成员变量是实例变量。
类变量与实例变量的区别:
1.关联性:类变量是与类相关联的数据变量,类变量属于整个类的对象集合,不属于某个具体的对象;而实例变量仅仅是与相应的对象关联的变量,也就是说,不同对象的实例变量互不相同,即分配不同的空间,改变其中一个对象的实例变量的值不会影响其他对象的相应实例变量。
2.访问权限:类变量可以通过类名和对象名访问;而实例变量只能通过对象名来访问。
3.空间分配:当创建多个不同的对象时,这些对象将分配不同的内存空间,更准确的说,不同的对象的实例变量将分配不同的内存空间;而类变量,不管创建多少个对象,类变量只有一个存储的内存空间,所有类对象都共享类变量。
4.生存周期:当Java程序执行时,类的字节码文件被加载到内存时,类变量就分配了相应的内存空间;而实例变量只有在创建时,才被分配内存空间。
4.5——类方法和实例方法
一、方法包含方法声明和方法体两部分,它的语法格式如下:
访问控制符 [修饰符] 方法返回值的数据类型 方法名称(参数1,参数2,…){
方法中的语句;
[return 返回值;]
}
二、方法名称:方法的名称必须符合标识符规定。
三、局部变量和形参变量:方法中定义的变量仅仅在方法内有效,方法的参数在整个方法内有效,方法内定义的局部变量从它定义的位置之后开始有效。
用关键字static修饰的方法称为类方法,又称为静态方法。
不用static修饰的方法称为实例方法,又称为对象方法。
参数传值
4.6——包
一、包的概念:包(package)是用来组织一组相关类和接口的名称空间。
二、包的特点和功能
1.通过类似目录树的形式组成Java程序,管理和查找类比较方便、有序。
2.包可以减少类重名带来的问题。
3.包可以保护包中的类、方法和变量。
4.包可以标识类和接口的功能。
例子
import java.util.Calendar;
import java.util.Date;
public class EXA4_9 {
public static void main(String[] args) {
Calendar cal=Calendar.getInstance();
cal.set(1995,3,9);
long timeStart=cal.getTimeInMillis();
cal.setTime(new Date());
long timeEnd=cal.getTimeInMillis();
long 出生天数=(timeEnd-timeStart)/(1000*60*60*24);
System.out.println("出生天数:"+出生天数);
}
}
4.7—— 封装性与访问控制符
一、封装主要是隐藏类的实现细节。把对象的属性和操作细节隐藏,不允许外界直接访问,必须要通过接口来访问或操作隐藏的属性和方法。如果类外部的代码可以随意访问类中的成员,这无疑就降低了类中数据的安全性。所以,要对类中的成员设置合适的访问权限,进行合理的访问控制。
访问控制符的作用域
4.8 ——对象数组
一、数组的概念:对象数组,顾名思义,数组里的每个元素都是一个类的对象。
二、数组是引用数据类型,其元素的默认初始值为null,在使用数组元素时必须分别对每一个元素进行实例化。
4.9—— 基本类型的封装类