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。