第5章 类、数组和字符串操作 Flashcards
类、数组和字符串操作概述
Java是面向对象语言,面向对象的思想是将客观事物都作为实体,而对象通过实体抽象得到。程序是通过定义一个类,对类进行实例化(也称为创建对象)来实现。
类是变量和方法的集合体。类可以嵌套定义。类是Java程序中基本的结构单位。
数组是最简单的复合数据类型,是有序数据的集合。数组的元素可以是值(基本数据类型)、对象或其他数组。一个数组中的所有值都必须是相同的数据类型。
文本字符串是一种参考数据类型,它一身是由java、lang、String定义的对象。
1、类定义
Java语言编写程序通过新的对象类型机制,就是允许自定义对象类型——类,它是程序的基本要素,由成员变量和成员方法组成。实例化一个类,就能得到一个对象。类的成员变量可以是基本类型数据、数组、或类的实例。成员方法只在类中定义,用来处理该类数据。类提供外界访问其成员方法的权限,通常,类成员数据都是私有的,而方法是公有的,外界只可能访问成员方法。
(1)类声明
格式:[修饰符]class类名[extends父类名][implements类实现的接口列表]
[…]
其中用[ ]括起来的内容为可选项。关键字class是定义的开始,类名应符合标识符命名规则,第一个字母大写并具有类功能特征。修饰符指明类的访问控制符和类型说明符。关键字wxtends指明该类是子类,它的父类名紧跟在后,子类与父类之间有继承关系。关键字implements指明该类实现的接口。后跟接口名列表。修饰符包括:
①public访问控制符指明该类为公共类,可被其他类访问或引用其成员变量和成员方法。
②默认(也称friendly)即没有访问控制符,表示该类只能被同一个包的类访问和引用,也不能用import语句引入。
③abstract抽象类,指明不能实例化的类。
④final是最终类,指明该类不能有子类。
(2)类体
格式:
class类名
{
成员变量声明
成员方法声明
}
成员变量和成员方法都可用public、protected、private和default来限定访问权。许多细节将在后面讨论。
(3)成员变量
成员变量声明格式:
修饰符【public,protected,private,static,final,transient,volatile】
type变量名:其中type 可以是java语句中任意数据类型。而修饰符的含义:
①public指明变量为公有。由于面向对象技术的封装要求,应尽量少用公共变量,而是通过公共方法类间接访问类的成员变量,从而提高程序的稳定性。
②protected指明变量为保护访问。可被同一个包中其中他类、不同包中该类的了类以及该类自己访问和引用 。保证所有子类都可访问父类,不管这些子类被封装在哪里。
③private指明变量为私有访问。只能被该类自己访问或调用,是对成员变量的最高级保护。
④static指明变量为静态变量,否则为实例变量。静态变量不需要类的实例化就可被类直接调用。
⑤final指明变量为常量。注意用大写字母。
⑥transient指明变量为暂时性变量,用实现不同对象存档功能。
⑦volatile指明多个线程共享的变量,保证各线程对该变量访问的一致性。
(4)成员方法定义和调用
所谓成员方法,是指作为类的成员的方法。方法的定义由方法声明和方法体组成。方法定义的形式如下:
return Type methodName(paramlist)[throws excetions]
它表明了在一个方法调用前要知道的一些信息:
①方法的名称。
②参数的类型和名称。
③方法返回值的类型。
④方法的抛出的异常类型。
方法声明格式:
修饰符【public,protected,private,static,final,abstract,native,synchronized】
returnType methodName([paramlist])[throws exceptions]
{…}
其中修饰符public 、protected、private、static、final与成员变量声明意义相同,都是定义方法访问权限。abstract指明方法是否可以重写,native指明代码是由各种语言集成,synchronized指明多线程可并发共享访问。
方法体是对方法的实现,包括局部变量声明、java合法指令。
注意:Java中的方法的参数传递是传值调用,而不是地址调用。方法不能改变参数值,但中以改变变量值,两个对象之间的参数字段,不能相互交换。
(5)方法重载
方法的重载是指多个方法可以享用相同的名字,但参数的数量或类型必须不完全相同,邓方法有所不同,它实现了Java编译时的多态(即静态多态性)性。
(6)构造方法
构造方法是为对象初始化操作编写的方法,用它来定义对象的初始状态。在Java语言中的每个类都有构造方法,它也是由方法名、参数和方法体组成的。构造方法名必须与类名相同,它没有返回值,用户不能直接调用它,只能通过new自动调用。
构造方法有下列特点:
①因为构造方法名与类名必须相同,所以方法首字母小写规则对它不适用。
②构造方法是给对象赋初值,没有返回值,但不用void来声明。
③构造方法不能被程序调用。
④构造方法可由编程人员在类中定义,默认时由Java语言自动生成。
⑤构造方法可以重载实现不同的初始化方法,调用时按参数决定调用哪个方法。
2、对象、接口与色
对类实例化,可以生成多个对象,通过这些对象之间的消息传递进行交互,可完成很复杂的功能。一个对象的生命周期分为3个阶段:生成、使用和清除。
(1)对象的生成
对象是一组相关变量和相关方法的封装体,是类的一个实例。对象的特征是对象的行为、状态和身份。对象生成包括声明、实例化和初始化三方面内容。一般格式是
type objectName=new type(【参数】);
其中:type objectName声明是定义对象的类型,它包括类和接口的复合类型。new关键字是实例化一个对象,给对象分配内存,它调用对象的构造方法,返回该对象的引用(存储对象所在堆地址和有关信息,并非内存直接地址)。new可以实例化类的多个不同的对象,分配不同的内存。
(2)对象的使用
对象的使用原则是先定义后使用。
①通过“·”运算符实现对成员变量的访问和方法调用。其格式为:
对象名·调用的方法名或变量名
②将一个对象声明为类的成员时要注意在使用前必须对该对象分配内存,也可以用private修饰符保证数据安全。
③在方法中使用对象作为参数时,采用引用调用。
(3)对象的清除
对象的清除指挥释放对象所占用的内存。归纳起来对象清除的途径为:
①依靠Java的垃圾回收机制回收内存。
②调用Systtem.gc(),请求垃圾回收。
③Java系统开始运行时,自动调用java.lang.Object.finalize()释放内存。
④在程序中调用重写的finalize()释放系统资源,其格式为:
protected void finalize() throws throwable{ ┋
super.finalize();
}
(4)接口
接口是一种只含有抽象方法或常量的一种特殊的抽象类。在Java语言中,用abstract修饰符定义的类称为抽象类,在其中 的方法称为抽象方法。abstract类的格式为:
abstract class abstractClass{
┋
}
接口是不包含成员变量和方法实现的抽象类,它只包含常量和方法的定义。接口的主要功能是:
①不管类的层次,可实现互不相关的类具有相同的行为。
②通过接口说明多个类所需实现的方法。
③通过接口可以了解对象的交互界面,无需了解对象所对应的类。
接口定义由接口声明和接口体组成。
(5)包
为解决同名类会发生冲突矛盾,Java采用包来管理类名空间。
定义一个包要用package关键字。用package语句说明一个包时,该包的层次结构必须与文件目录的层次相同。否则,在编译时可能出现查找不到的问题。
使用一个包中的类时,首先要用关键字import导入这些类所在的的包。Java语言的java.lang包是编译器自动导入的。因此,编程时使用该包中的类,可省支import导入。但使用其他包中的类,必须用import导入。
类成员修饰符、继承、内部类、类库
(1)类及类成员修饰符
常用的类成员修饰符如下:
修 饰 符 可修饰对象 含 义
publie 类
接口
成员变量,成员方法 可跨包访问。
private 成员变量,成员方法 类内可访问
protected 成员变量,成员方法 包内可访问。
static 类
类变量
类方法 静态内部类不能有对外调用,成员独立于该类的任何实例对
象。类变量是全局变量。
类方法是全局方法。在其中不能使用this,super。不能创建
内部类的实例。
synchronized 成员方法 用于保持线程同步。
final 类
成员变量
成员方法 没有子类的类。
不能改变值的变量的变量不能被覆盖的方法。
不能被覆盖的方法。
不能改变值字段。
abstract 类
接口
成员方法 类中含没有实现的方法 ,该类不能实例化。
所有接口都是抽象的,是接口缺省修饰符。
没有实现的方法。
修饰符可分为访问限定符和非访问限定两类。
(2)继承
继承性是面向对象方法的一个重要基本特征,它使代码可重用,可降低程序复杂性。Java语言中,所有的类都是通过直接或间接地继承java,lang,Objecter而得到的。Java不支持多重继承。通过在类声明中加入extends子句 来创建子类,其格式为:
class SubClass extends SuperClass{
┋
}
重写方法必须遵循两个原则是编译器为了实现面向对象方法的多态性,保证程序健壮,避免程序招待时出现访问权限的冲突,并不会漏了异常的捕获。super的使用有3种情况:
①用于访问被隐藏的父类成员变量,其格式为:
super,变量名;
②用于调用被重写的父类方法,其格式为:
super,方法名;
③用于调用父类的构造方法,其格式为;
super([参数列表])
(3)内部类
在一个类的内部嵌套定义的类称为内部类(Inner Class)。特点是:①内部类的类名只能在定义它的类或程序段中或在表达式内部匿名使用,外部使用它时必须给出类的全名。
②内部类可以使用它所在类的静态成员变量和实例成员变量,也可使用它所在类的方法中的局部变量。
③内部类可用abstract修饰定义为抽象类,也可用private或protected定义。
④内部类可作为其他类的成员,而且可访问它所在类的成员。
⑤除static内部类外,不能在类内声明static成员。
(4)类库
类库以包的形式组织,是包的集合。早在J2SE的1.3.1版,类库已有76个包,目前已发展到J2SE1.4.2版,类库的包已过百。
java.lang包。该包中所有类都在运行时,由java解释器自动引入,程序不用import语句都可使用其中任何一个类。该包有接口、类、异常等组成。它是Java语言的最底层的类。它包括的最主要的类有:
①Object类是Java所有类的根类,其他类都由它扩展而来。它定义的方法包括:
●preorected Objet clone()throws CloneNotSupporteedException,该方法生成当前对象的拷贝,并返回该拷贝对象。凡调用该方法的类都应该的类都应该实现cloneable接口,否则运行时会抛出异常。
●public final Class getClass(),该方法返回一个当前对象运行时的Class类对象。
●public int hashCode(),该方法返回一个hash值。
●public Boolean equals(Object obj ),该方法比较当前对象与形参对象相同否,相同返回true,否则返回false。
●public String toString(),该方法返回一个当前对象住处的字符串。
●public final void notify(),该方法唤醒一个等待线程。
●public final void notifyAll(),该方法唤醒所有等待线程。
●public final void wait(long timeout)throws InterruptedException,该方法让当前线程进入等待行列。
●public final void wait(long timeout,int nanos)throws InterruptedException,该方法让线程等待时间是两个形参之和。
●public final void wait()throws InterruptedException,该方法等同wait(0)。
●public void finalize()throws Throwable,该方法把对象从内存中清除。
②Class类是用于类操作规程的类,Class对象由Java编译器自动生成,隐藏在.class文件中,它在运行时为用户提供信息。另多此一举这提供运行时动态装入环境的操作类ClassLoader。这两类常用方法包括:
●static Class Forname(String className),该方法返回指定类的对象。
●String getName(),该方法获得Class对象的类名。
●ClassLoader gerClassLoader(),该方法返回ClassLoaer对象。
●bool isInterfae(),该方法返回判断是否接口的布尔值。
●Class getSuperclass(),该方法返回当前对象父类的Class对象。
●String toString(),该方法返回当前类或接口的名字。
●abstract Class loadClass(String name,Boolean resolve),该方法把类名分解成对象,分解成功返回Class对象,否则返回null。
●final Class defineClass(String name,byte data[ ],int length),该方法把一个字节数组转换成一个类的对象,对象以data数组的offset为起点,length为字节长度构成。
●final void resolveClass(Class c),该方法分解一个类。
●final Class findSystemClass(String name),该方法用来查找和装入系统类。
③System类是一个final类,即不能被实例化的类,它主要提供标准输入、输出和系统环境信息。它有3个很有用的成员变量:in、out和err,分别表示标准输入流对象、标准输出流对象和出错流对象。主要方法有:
●static long currentTimeMillis(),该方法返回系统时间,以毫秒为单位。
●static String gerProperties(),该方法获得系统环境信息。
●static String gerProperties(String key,String def)该方法获得系统变量值。
●static void setPtoperties(Properties P),该方法设置系统特征。
●static void gc(),该方法运行垃圾收集器。
●static void loadLibrary(String libname),该方法装入一个动态链接库
④Thread类是提供线程操作和管理的类。
其次,看看实作工具Java.uitl包。它包括许多常用功能的类的和接口。主要包括:
①GrggorianCalendar日历类提供日期和时间的表示,它以格里历(即阳历)来计算。主要方法有:
●int get(int field),获得一个特定字段的值,参数field是其父类Calendar定义的许多参数之一(如Calendar.YEAR、Calendar.MONTH、Calendar.DATE等)。
●void set(int yeat,int month,int date),设置日期字段值。
●void set(int year,int mouth,int date,int hour,int minute,int second),设置日期和时间字段值。
●void add(int fideld,int amount),在字段上加指定值。
②Vector类实现了动态分配对象列表,适用于可变对象数组的类,它的内存容量可按照需要自动增加。主要方法有:
●ensureCapacity(),保证指定元素的最小容量。
●trimToSze(),将当前元素的容量高速到最小。●addElement(),可加新元素。
●get(),可获得Vector中的元素。
●set(),可修改Vector中的元素。
●temove(),可删除Vector中的元素。
●elemnetAt(),可直接访问元素。
●indexOf(),可确定元素的位置。●size(),返回Vector的容量大小。
③Stack类是实现先进后出的对象栈,它是Vector的子类,它不能直接被访问,中能从栈顶压入或弹出。它的主要方法有:
●empty(),判断栈是否为空是空返回true。
●peek(),返回栈顶对象。
●pop(),弹出栈顶的一个元素。
●push(Object),从栈顶压入一个元素 。
●search(Object),查找栈内一个元素。
④Dictionary类是抽象类,不能实例化去创建一个对象,它是关键字和值的数据对存储的集合。它的抽象方法有:
●elements(),返回一个枚举元素。
●ger(Object),返回关键字所对应的值。
●isEmpty(),判断字典是否为空,如为空返回true。
●keys(),返回关键字的一个枚举元素。
●put(Object,object),存入一对关键字和值到字典中。
●remove(Object),按照关键字从字典中删去一个元素。
●size(),返回存储元素的数量。
4、内部类的应用实例
本程序是银行出纳的一种业务,其功能是对10000元人民币按照2%的年利率存入银行,计算每年的存款数,每10秒显示一行,用键盘对话框退出。内部类用于计算递增的存款数额并显示。内部类所实现的Timer监听器接口,完成了定时器的事件处理。
一维数组
数组是一种复合数据类型,在Java中,数组是作为对象来处理的。数组有限元素的有序集合,数组中的元素具有相同的数据类型,并可用统一的数组名和下标来惟一确定其元素,元素是数组中不可分的最小单位。 1、定义数组、创建数组 在Java中定义一维数线格式为:type attayName[ ];或type[ ]arrayName; 创建一个数组的格式为:arrayName=new type[arraySize] 在Java中定义并创建一个数组对象:type[ ]arrayName=new type[arraySize]; 2、初始化数组 所谓数组初始化即对已经定义好的数组元素赋值。 (1)静态初始化 静态初始化适用数组元素的个数较少,而且是初始元素可以枚举的情况。 (2)动态初始化 用new动态初始化时,数组元素的默认值如下: 序 号 元 素 类 型 默认初绐值 1 boolean False 2 char ' u0000' 3 整数 0 4 浮点数 0.0 5 对象 null 对复杂类型的数组初始化,需要两步完成。首先,为每个数组元素分配引用空间。其次,为每个数组元素分配空间并赋初值。
多维数组
(1)二维数组定义 二维数组定义的格式为:type attayName[ ][ ];或type[ ][ ]arrayName; (2)初始化二维数组 ①静态初化:即在定义数组的同时分配内存空间。 ②动态初始化:可直接对每一维分配空间或从最高维开始对每维分配空间。
字符串操作
1、字符串的表示
(1)字符串的表示
字符串常量用”“括起来的字符序列。字符串常量可以用来直接初始化一个String对象。
(2)用String类表示字符串
在Java中,String类提供构造方法可生成一个空串,也可通过字符数组或字节数组来生成一个字符串对象,其中,char[ ]、byte[ ]用来生成字符串的数组,startIndex、offset指定字符串在数组中的起始下标,numClass、length表示字符个数。
(3)用StringBuffer表示字符串
StringBuffer类提供长度可变字符串对象的表示,它提供下列构造方法对可变字符串对象初始化:
StringBuffer();
StringBuffer(int length);StringBuffer(String str)
2、字符串的访问
String类包括的方法有:Length()、charAt()、indexOf()、getChars()、getBytes()、toCharArray()等。
(1)提取字符串长度
String greeting =”Helle”;
int n = greeting.length();// 返回字符串的字符个数n=5
(2)提取字符串中指定字符
char last = greeting.charAt(4);//从字符串0数到4的字符是’O’。
(3)提取字符串中多个字符
public void getCharsw(int srcbegin,int end,char buf[ ],int dstbegin);
其中,srcbegin指定要提取的第1个字符在该字答串的位置,end指定要提取的最后字符在该字符串的位置,buf[ ]是目的字符吕存储的数组,dstbegin指定提取字符插入目的字符串的位置。
StringBuffer类包括方法有:lengty()、charAt()、getChars()、capacity()。
(4)查询字符
在字符串中查询指定字符或子串时,可用indexOf()和lastIndexOf()方法。如查询成功,返回所查字符的位置。如不成功,返回-1。
3、字符串的修改
(1)对string的修改
因为它是固定长度字符串,修改必须通过实例。String提供concat()、teplace()、substring()、toLowerCase()、toUpperCase()等方法。
Public String concat(String str),将当前字符串对象与指定str字符串相连。
public String replace(char oldChar,char newChar),用新字符替换老字符。
public String substring(int beginIndex),按指定的起始位置获得子符串。
public String substring(int beginIndex,int endIndex),按指定范围去获得字符串中的子字符串。
public String toLowerCase(),将字符串中所有字符变为小写。public String toUpperCase(),将字符串中所有字符变为大写。
①两个字符串的连接。
String str1 = “abc”;
String str2 = str1.concat(“cde”);// “abccde”
②替换掉一个字符串中的所有与指定字符相匹配的字符。
str.replace(‘‘,’#’); // 将字符串str中的所有的空格替代为#。
③Java允许将字符串用+号连接起来。
String expletive = “expltive”;
String PG13 = “deleted”;
String message = expletive + PG13;
④提取子字符串。
String greeting = “Hello”
String s = “greeting.substring(0,3)”;
取字符串greeting的第0个到第3个字符组成新串:”Hell”。
(2)对StringBuffer的修改
因为StringBuffer类是表示可变长度字符串,它可以在字符中插入字符和在字符串尾加字符。缓存不必管理,Java解释器自动分配。它的方法包括:append() 、insert()、SetCharAr()。
4、字符串的比较
测试字符串是否相等,可用equals()方法。
5、其他操作
(1)键盘读取字符串的对话框
javax.swing.JOptionPane用于从控制台键盘读科字符串。
(2)将字符串对象转换为基本数据类型
int age = Integer.parseInt(input); // 进行从字符串到整数的类型转换。
6、程序实例
本程序的功能是进行键盘对话框测试。意图在于学会JOptionPane类的用法。同时对于串输入、串定义、串类型转换有所了解。