3.2 Java的类 3.2.1 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块 Java的类库大部分是由SUN公司提供的,叫基础类库(JFC)。根据功能不同,Java的类库被划分为若干个不同的包,每个包中都有若干个具有特定功能和相互关系的类和接口。 包是一种松散的类的集合。同一个包中的类在缺省情况下可以互相访问,为了便于编程和管理,常把需要在一起工作的类放在一个包里。
3.2.2 Java中常用的包 (1) java.lang 包 (2) java.io包 是Java语言的标准输入/输出类库,包含了实现Java程序与操作系统、用户界面以及其他Java程序做数据交换所使用的类。 (3) java.util包 包含了Java语言中的一些低级的实用工具,如处理时间的Date类、处理变长数组的Vector类,栈Stack类、散列表HashTable类等。
(4)java.awt包 是Java语言用来构建图形用户界面(GUI)的类库。 低级绘图操作——Graphics类等 java.awt 图形控件和布局——Container类、 Checkbox类、LayoutManager接口等 界面用户控制和事件响应——Event类 (5)java.applet包 是用来实现在Internet浏览器中运行Java Applet的工具类,其中包含一个非常有用的类java.applet. Applet。 (6) java.awt.event包 是对Event类的一个扩充,可以用不同方式来处理不同类型的事件,并使每个图形界面元素本身可以拥有处理它上面事件的能力。
3.2.3 使用系统类库的方式 (1)继承系统类,在用户程序里创建系统类的子类 3.2.3 使用系统类库的方式 (1)继承系统类,在用户程序里创建系统类的子类 如: public class SjApplet extends Applet (2)创建系统类的对象 如:TextField input= new TextField(6) (3) 直接使用系统类 如:System.out.println() 注意:使用系统类之前,用户程序需要用import语句引入所用到的系统类或系统类所在的包。 如:import java.awt.*; import java.awt.event.*; System:系统类 Out:静态属性 println:方法
3.2.4 创建Java自定义类的方法 定义类就是定义类的属性和服务。类的属性即静态属性,指类内的各项数据;类的服务即成员函数或方法。 语法结构: [修饰符] class 类名 [extends 父类] [implements 接口名] { 类成员变量声明 类方法声明 }
父类 接口名 修饰符 定义类属性,成员变量 定义类方法
(1) 声明类头:关键字class 父类名:跟在extends关键字后,用以说明当前类是已经存在的哪个类的子类。 通过定义继承关系,子类可以获得父类的所有属性和方法,并进一步定义它自己的特殊属性. 接口名:跟在implements关键字后,用以说明当前类中实现了哪个接口定义的功能和方法。 修饰符:说明类的特殊性质,分为访问控制符、抽象说明类和最终类说明符。
(2)声明类体: 定义类的具体内容,包括类的属性与方法 [类的属性]: 可以是简单变量,也可以是对象、数组等其他复杂数据结构。 [类的属性]: 可以是简单变量,也可以是对象、数组等其他复杂数据结构。 声明类属性为简单变量的语法: [修饰符] 变量类型 变量名[=变量初值]; 例:int password; 声明类属性为对象的语法: [修饰符] 类名 对象名[=new 类名(实际参数列表)]; 例: PhoneCard myCard=new PhoneCard ( ); 修饰符有访问控制符、静态修饰符static、 最终修饰符final、易失修饰符volatile和 过渡修饰符transient。
[类的方法]: 即成员函数,它规定类属性上的操作,实现类的内部功能的机制,是类与外部交互的窗口。 语法结构: [修饰符] 返回值类型 方法名(参数列表) throws 例外名1,例外名2,... { 方法体; 局部变量声明; 语句序列; }
类中的“变量”概念辨析: (1)成员变量: 在类体变量定义处定义的变量,在整个类内都有效; 成员变量包括实例变量和类变量,用static定义的变量是类变量,也叫静态变量; 所有对象独享实例变量,但共享类变量; 实例变量只能通过对象名访问,类变量既可以通过某个对象名也可以通过类名来访问。 (2)局部变量: 在类的方法中定义的变量,仅在定义它的方法内有效
类中的“方法”概念辨析: (1)实例方法: (2)类方法: 实例方法既可以操作实例变量,也可以操作类变量; 实例方法在创建类对象后才分配入口地址; 实例方法可以被类创建的任何对象访问,必须通过对象来调用;实例方法可以调用其它方法(包括类方法)。 (2)类方法: 用static修饰的方法是类方法,也叫静态方法; 类方法只能操作类变量; 类方法在类被加载到内存后就分配了入口地址; 类方法可以被类创建的任何对象调用,也可以通过类名来调用,类方法只能调用该类的类方法。
本类中方法与变量之间的访问关系 各类之间方法与属性的引用方法 实例方法 类方法 实例变量 类变量 局部变量 √ 各类之间方法与属性的引用方法 实例方法 类方法 实例变量 类变量 用 对象名 √ 用 类名
class PhoneCard //定义一个电话卡类 { long cardNumber; private int password; double balance; String connectNumber; boolean connected; boolean performConnection(long cn,int pw) //方法1,实现连接 if(cn == cardNumber && pw == password ) connected = true; return true; } else connected = false; return false; 类的属性
double getBalance() //方法2,返回余额 { if(connected) return balance; else return -1; } void performDial() //方法2,实现拨号 balance -= 0.5;
3.2.5 创建类的实例对象 创建对象的一般格式: 类名 新建对象名= new 构造函数( ); new是为新建对象开辟内存空间的算符。 3.2.5 创建类的实例对象 创建对象的一般格式: 类名 新建对象名= new 构造函数( ); new是为新建对象开辟内存空间的算符。 构造函数()用来完成对象的初始化。 如:TextField input= new TextField(6); 建立一个名为input、长度为6的文本框。 PhoneCard myCard=new PhoneCard( ); 建立一个名为myCard的电话卡对象。
3.2.6 Java中的构造函数 (1)基本概念 构造函数:用来初始化对象(为其所有静态属性赋初值)的一个特殊方法。 构造函数名与类名相同 构造函数可以有0个或多个参数 特点 构造函数始终和new关键字一起调用 构造函数没有返回值 构造函数一般不能由编程人员显示地直接调用 在创建一个类的新对象时,系统自动调用构造 函数对其进行初始化。
引入构造函数的原因: 1) 满足面向对象程序设计中对象初始化的需要; 2) 提高灵活度,使初始化工作除赋值外有更复杂的操作; 在不定义构造函数时,系统会自动为该类生成一个默认的构造函数。
(2)构造函数的定义 例如,可以为PhoneCard类定义如下的构造函数,初始化它的几个域。 PhoneCard(long cn, int pw, double b,String s) { cardNumber = cn; password = pw; balance = b; connectNumber = s; connected = false; } 可见,构造函数定义了几个形式参数,创建对象的语句在调用构造函数时,需要提供几个类型、顺序一致的实际参数,指明新建对象各域的初始值。 String 不是基本数据类型,而是一个系统定义的类名,每一个字符串变量实际上都是一个字符串对象。
构造函数的调用是在用new运算符创建类对象时由系统自动完成。 定义了构造函数之后,就可以用如下的语句创建并初始化PhoneCard对象: PhoneCard newCard = new PhoneCard (33006655, 6666, 100.0,″300″); 说明: newCard是新建对象名 关键字new通知系统开辟内存单元,创建运算符 第一个PhoneCard说明新对象属于哪个类 第二个PhoneCard用来隐含调用PhoneCard类的构造函数 这个对象的卡号是33006655,密码是6666,金额是100.0,电话卡的接入号码是字符串“300”。 如果用户自定义类时未定义类的构造函数,系统将为这个类缺省定义一个空构造函数,没有形式参数,也没有任何具体语句,不完成任何操作。
例 UsePhoneCard.java 1: public class UsePhoneCard 2: { 3: public static void main(String args[]) 4: { // 创建一个PhoneCard的对象myCard 5: PhoneCard myCard = new PhoneCard(12345678,1234,50.0,″300″); // 调用myCard的方法toString( ), // 把myCard中的各个域数据组合成一段信息在屏幕上输出。 6: System.out.println(myCard. toString( ) ); 7: } 8: }
9: class PhoneCard 10:{ 11: long cardNumber; 12: private int password; 13: double balance; 14: String connectNumber; 15: boolean connected; 16: //构造函数 17: PhoneCard(long cn, int pw, double b,String s) 18: { 19: cardNumber = cn; 20: password = pw; 21: if ( b > 0 ) 22: balance = b; 23: else 24: System.exit(1);
25: connectNumber = s; 26: connected = false; 27: } 28: boolean performConnection(long cn,int pw) 29: { //方法1,实现连接 30: if(cn == cardNumber && pw == password ) 31: { 32: connected = true; 33: return true; 34: } 35: else 36: { 37: connected = false; 38: return false; 39: } 40: }
41: double getBalance( ) //方法2,返回余额 42: { 43: if(connected) 44: return balance; 45: else 46: return -1; 47: } 48: void performDial( ) //方法3 ,拨号扣款 49: { 50: if(connected) 51: balance -= 0.5; 52: }
53: public String toString( ) //方法4,显示卡上的信息 54: { 55: String s = ″电话卡接入号码:″+connectNumber 56: +″\n电话卡卡号:″+cardNumber 57: +″\n电话卡密码:″+password 58: +″\n剩余金额:″+balance; 59: if(connected) 60: return (s + ″\n电话已接通。″); 61: else 62: return (s + ″\n电话未接通。″); 63: } 64: }