java4章

  • 格式:doc
  • 大小:157.00 KB
  • 文档页数:20

第 1 页 共 20 页 第4章 类和对象

本章主要介绍Java语言中类的定义及类的访问控制、成员的定义及成员的访问控制、对象的创建、数组的创建及使用。

第4章 类和对象

4.1 OO(Object-oriented)基本概念

4.2 类的定义

4.3 域(成员变量/字段)声明

4.4 方法的定义

4.5 类变量的初始化形式

4.6 类对象的初始化形式

4.7 数组

4.7.1 数组的创建形式

4.7.2 (一组)数组的应用

4.7.3 多维数组

4.8 对象的撤消(清除)

4.9 小结

第 2 页 共 20 页 4.1 OO(Object-oriented)基本概念

1. 对象(Object)

 现实世界的对象:

 有自己的状态,如一台空调有自己编号、摆

放位置、颜色、尺寸、重量、工作状态 „

 有自己的行为(功能),如空调的开机、关机、制冷、制热、摆风 „

 机器世界的对象:

 对象的状态用属性来维护(变量、字段)

 对象的行为用方法来实现(代码)

对象是一组数据(属性)及对这组数据属性的一组操作(行为)构成的有标识的独立实体。

2. 类(Class)

类是一组具有共同的属性特征和行为(服务)特征的对象的抽象。

(1)属性(Attribute)

是描述对象静态特征的一个数据项。

(2)行为(Service)

是描述对象动态特征的一个操作序列。

类与对象的关系:抽象与具体的关系。类是产生对象的模板,而对象是类的一个实例。

3. 封装(encapsulation)

是指通过类机制把对象的数据和对数据的操作(行为)封装在一起成为一个独立的系统单位。

4.2 类的定义

4.1.1 类的定义形式

Java程序由类构成,类由类头和类体组成,其一般形式为:

[] class

{

}//类定义结束

其中类的修饰符有2种:

(1)访问控制符

public、private或缺省来指定类的访问权限。如:

第 3 页 共 20 页 public class Object {....}

(2)非访问控制符

abstract、final分别用来声明抽象类和最终类。如:

public final class System {....}

下面我们定义一个平面上的点类Point,如下:

//文件名:Point.java

public class Point

{ private int x,y;//坐标

public void setPoint(int a,int b)

{ x=a;y=b;}

public void move(int dx,int dy)

{ x+=dx;y+=dy;}

public int getX(){ return x;}

public int getY(){ return y;}

public String toString()

{ return “(“+x+”,”+y+”)”;}

}

4.1.2 类的访问控制修饰符及访问权限

和C++不同,访问权限有二层,外层为类的访问权限,由类访问控制符来指定。内层是成员的访问权限,由成员访问控制符指定。类的访问控制符有:

(1)public及公有访问权限

如: public class A { ...}

class C

{ A obj=new A( );...}

公有类可被任何程序包中的所有类引用。

引用是指在类中或者在它们的方法体内,都可以创建该类的对象、访问这个类内可见的成员变量和调用它的方法。

(2) 缺省及包访问权限

如:class B{ ... }//B是友类

class D

{ B obj=new B( );...}

缺省时声明的类称友类,友类具有包访问权限。

第 4 页 共 20 页 友类只可被同一个程序包内的所有类引用。

一般将相关的类放到同一个程序包内,在包内它们能自由访问,对外隐藏,可实现“内外有别”的封装机制。

说明1点:同一个编译单元(Java源文件)的类属于同一个程序包。

(3)private及私有访问权限(后续介绍)

私有类具有私有访问权限。

私有类只能被外部类访问。因此,只有内部类才允许声明为私有类,而普通类或包含内部类的外部类是不允许声明为私有类。

class Outer

{ Inner obj=new Inner( );//合法

private class Inner//私有的内部类

{.....}

}

class X

{ Outer.Inner obj;...}//非法

4.3 域/成员变量/字段(field)

4.3.1 字段(field)的声明

一般来说,类体包括一个或几个字段的声明。字段的声明形式:

[] [] ;

其中[]中的项可以省略。

4.3.2 域的访问控制符及访问权限

(1)public

公有域可被任何类访问。即在其它类体内或者是方法体内,可以对该成员变量进行读或写。

(2)protected

保护域可被本类访问,也可被同一包内的其它类访问,还可被其它包内的该类的子类访问。

备注:包及包的使用方法在下一章介绍。

(3)缺省

缺省域可被本类及同一包内的其它类访问。

第 5 页 共 20 页 (4)private

私有域只能被本类访问。它常用来描述那些需要隐藏起来的数据信息,其他类只有通过调用该类的公有方法才能访问到它们,这就是所谓的面向对象的“数据封装和信息隐藏”的基本思想。

下面定义的是时间类Time。

class Time

{ private int hour,minute,second;

public Time(){ hour=minute=second=0;}

public Time(int h,int m,int s)

{ setTime(h,m,s);}

public void setHour(int h) //设置小时

{ hour= h>=0 && h<24? h:0 ;}

public void setMinute(int m) //设置分

{ minute= m>=0 && m<60? m:0 ;}

public void setSecond(int s) //设置秒

{ second= s>=0 && s<60? s:0 ;}

public void setTime(int h,int m,int s)

{ setHour(h); setMinute(m); setSecond(s);}

public int getHour(){ return hour;}

public int getMinute(){ return minute;}

public int getSecond(){ return second;}

}//Time定义结束

4.3.3 字段的类型

2种:静态字段(类变量)和非静态字段(实例变量)

用static声明的字段称类变量,未用static声明的字段称实例变量。

注意:不同的对象关于类变量只有一个副本,在类加载时系统就为它分配内存了;而不同的对象关于实例变量有不同的副本,在对象创建时才生成。

下面是圆类Circle的定义:

public class Circle

{ public final static double PI=Math.PI;//类变量

第 6 页 共 20 页 private int radius;//实例变量

public static double getPI(){ return PI;}

public void setRadius(int r){ radius=r;}

public int getRadius( ){ return radius;}

public double getArea( )

{ return PI*radius*radius;}

}

关于成员变量说明2点:

(1)有两种访问类变量的方法:

类名.类变量名

对象名.类变量名

下面是访问实例变量的唯一方式:

对象名.实例变量名

(2)两种成员变量都可以在声明的同时赋初值。当没有赋初值时,系统将用缺省值对其初始化,见教材P.67。

成员变量的默认初值

类型 默认初值

boolean false

char '\u0000'

byte、short (byte)0、 (short)0

int、long 0、 0L

float、double +0.0f、 +0.0

引用型变量 null

4.3.4 最终字段

最终字段就是指用final声明的成员变量。最终域初始化后不能被修改。如:

public class Circle

{ public static final double PI=Math.PI;...

//该方法体内不能有setPI( )

}

用final声明字段时,要注意以下2点:

(1)同时需要指出字段的初始值,否则使用缺省值;

(2)为了节省空间,最终字段通常声明为static。