创建与使用类北京理工大学计算机系 金旭亮第五讲从 String类开始第一部分
2009-7-29 北京理工大学计算机系 3
本讲内容
String,StringBuilder,Character,StringTokeni
zer类的使用
Java面向对象理论,对象变量
2009-7-29 北京理工大学计算机系 4
关于字串
String数据类型,Java中它是一个真正的对象,
与 C不一样。
一个 String数据类型一旦经过初始化,就不能再被改变
StringBuffer类型可以更改字串内容。
用好 String类的关键在于了解它的几个方法的含义。
2009-7-29 北京理工大学计算机系 5
Java中的字串类
Class java.lang.String
Class java.lang.StringBuffer
Class java.lang.Character
Class java.util.StringTokenizer
2009-7-29 北京理工大学计算机系 6
字符与字串
字符,’ Z’,’ \n’等
其值为 UNICODE
字串
,Hello”,”(201)13423422”等
Java中把内容相同的字串常量只保存一份以节约内存。
2009-7-29 北京理工大学计算机系 7
String 构造函数
String提供了 9种构造方法
示例,StringConstructors.java
什么叫构造方法?
即在创建 String变量时自动执行的函数。
多个构造函数构成函数重载关系。
讲解不同类型的构造函数。
2009-7-29 北京理工大学计算机系 8
String类的常用方法
Length:获取字串长度
charAt:获取指定位置的字符
getChars:获取从指定位置起的子串复制到字符数组中(它有四个参数,在示例中有介绍)
示例,StringMisc.java
2009-7-29 北京理工大学计算机系 9
字串比较
Method equals
Method equalsIgnoreCase
Method compareTo:使用字典法进行比较,返回 0表两字串相等,小于返回负值,大于返回正值
Method regionMatches,比较两字串中的某一部分是否相等
示例,StringCompare.Java
注意,Equals与 ==的区别(分析代码)
2009-7-29 北京理工大学计算机系 10
字串比较
字串是否以某字串开头和结尾
startsWith
endWith
自学示例,StringStartEnd.java
2009-7-29 北京理工大学计算机系 11
字串的哈希定位
数据结构中的 Hash查找
String类已内置了生成 Hash码的方法,
阅读示例 StringHashCode.java并思索如何应用
Hash码来加快信息检索的速度。
2009-7-29 北京理工大学计算机系 12
字串查找
Method indexOf
Method lastIndexOf
自学示例,
StringIndexMethods.java
2009-7-29 北京理工大学计算机系 13
提取子串与字串连接
subString方法示例,SubString.java
concat方法示例,StringConcat.java
+运算符
2009-7-29 北京理工大学计算机系 14
String类的其他方法
Replace
toUpperCase
toLowerCase
Trim
toString
toCharArray
自学示例,
StringMisc2.java
2009-7-29 北京理工大学计算机系 15
将其它类型的数据转为字串
使用 ValueOf,注意,这是一个静态方法
示例,
StringValueOf.java
2009-7-29 北京理工大学计算机系 16
StringBuffer类
当 String对象创建后,它的内容是不可改的
StringBuffer可以修改其内容
能自动增长
使用 +和 += 实现字串连接
2009-7-29 北京理工大学计算机系 17
StringBuffer类的使用
构造函数,StringBufferConstructors.java(自学 )
Length,capacity,setLength,ensureCapacity方法,StringBufferCapLen.java
charAt,setCharAt,getChars,reverse方法,StringBufferChars.java(自学 )
Append方法,StringBufferAppend.java(自学 )
Insert,delete方法,StringBufferInsert.java(自学 )
2009-7-29 北京理工大学计算机系 18
Character 类
这是字符数据类型 char的包装类
示例,StaticCharMethods.java,
提前介绍:图形界面的生成方法注意,
这个示例程序中说明了 Java GUI(图形界面)的基本设计原理,需要学完整个学期的知识之后才能比较清楚地了解。目前先不求甚解。
2009-7-29 北京理工大学计算机系 19
Character 类
构造函数,charValue,toString,hashCode,equals
方法,OtherCharMethods.java(自学 )
2009-7-29 北京理工大学计算机系 20
StringTokenizer类
语言符号 (token),语法分析的基本单位
以定界符 delimiter区分
Java提供一个类用于解决拆分字串为 token的功能,java.util.StringTokenizer
示例,TokenTest.java
注意:
StringTokenizer类的使用方法。
2009-7-29 北京理工大学计算机系 21
课后作业
利用 StringTokenizer类编写一个简单的 Java
语句的词法分析器,给它一个合法的 Java语句,它能将语句中的各种成份 (如标识符,数字 )分离出来,
第二部分
Java创建类类的使用开发自己的类
2009-7-29 北京理工大学计算机系 25
自定义一个类
类的定义模板
public/private class 类名
{
public/private 数据类型 变量名 ;
public/private 数据类型 方法名 (参数列表 )
{
}
}
2009-7-29 北京理工大学计算机系 26
成员的存取权限
public:外界可存取
private:外界不能存取
2009-7-29 北京理工大学计算机系 27
示例
自定义一个 student类,其中包含几个属性和至少一个方法,
2009-7-29 北京理工大学计算机系 28
类的使用
定义对象变量
New一个对象
通过对象变量使用对象
( 1)直接调用类的方法
( 2)设置类的属性
2009-7-29 北京理工大学计算机系 29
对象变量
当声明一个类类型的变量时,实际上并没有创建一个对象,此变量 =null.
定义一个基本数据类型的变量时,会马上给其分配内存,而类类型的变量不会这样,
2009-7-29 北京理工大学计算机系 30
引用变量与数值变量的比较
引用代表地址,所以,==”实际上相当于比较变量中的地址是否区配,意味着确定这两个变量是否指向同一个对象。
要比对两个对象的内容,请使用 equals方法
2009-7-29 北京理工大学计算机系 31
“=“的含义
Fruit apple=new Fruit()
Fruit myFruit;
myFruit=apple;
请解释此句的含义
2009-7-29 北京理工大学计算机系 32
区分 null与 void
null代表一个对象变量不引用任何对象
Window MyWindow;
MyWindow=new Window();
if(MyWindow==null) …
void表示某个函数不返回任何值
void someMethod(… )
2009-7-29 北京理工大学计算机系 33
对象变量的构造函数
当创建一个对象时,会自动调用它的构造函数,
构造函数与类名相同,没有返回值
2009-7-29 北京理工大学计算机系 34
多构造函数
同一个类可以有多个构造函数,多个构造函数之间通过参数来区分,这是函数重载的一个实例。
构造函数之间可以相互调用,
2009-7-29 北京理工大学计算机系 35
构造函数的调用示例
class Fruit
{
int grams;
int calsPerGram;
Fruit()
{
this(55,10);
}
Fruit(int g,int c)
{
grams=g;
calsPerGram=c;
}
}
2009-7-29 北京理工大学计算机系 36
独特的对象引用,this
对象中的所有数据字段都是通过 this指针间接引用的,
同一类中的方法可以相互调用,其中隐含了一个 this调用。
2009-7-29 北京理工大学计算机系 37
关于类构造函数相互调用
当一个构造函数显式地调用另一个构造函数时,这个调用必须是发出调用的构造函数中的第一个语句,这是因为,
(1)不能针对一个己经分配了内存的元素调用构造函数
(2)当系统开始执行构造函数时,内存已经分配了,
注意:这一部分我也没弄明白,请有好奇心的同学去钻研,弄清楚其中的道理。
2009-7-29 北京理工大学计算机系 38
类的静态数据成员
class Employee
{
String name;
long salary;
short employee_id;
static int total_employee_id;
,..
}
2009-7-29 北京理工大学计算机系 39
类的静态数据成员
可以用对象名或类名作为前缀访问静态数据
1,Employee newhire=new Employee();
2,newhire.total_employees=1;
3,Employee.total_employees=1;
2009-7-29 北京理工大学计算机系 40
类的静态数据成员
类的静态数据成员大多用于跟踪对象创建的数目
静态变量又称为类变量,
2009-7-29 北京理工大学计算机系 41
类的静态方法
class Employee
{
String name;
long salary;
short employee_id;
static int total_employees;
static void clear(){
total_employees=0;
}
}
...
newhire.clear();
Employee.clear();
2009-7-29 北京理工大学计算机系 42
使用静态方法的问题
静态方法中只允许访问静态数据,那么,如何在静态方法中访问动态数据?
main()方法为何是静态的?
2009-7-29 北京理工大学计算机系 43
再谈 Java应用程序的入口
方法签名,
public static void main(String args[])
(1)public:在任何地方都是可访问的
(2)static:不需要创建类的实例就可以直接访问
(3)void:不返回任何值,与 C不一样,Java不需要从返回值判断是否出错,而是直接抛出异常给 JVM处理,
2009-7-29 北京理工大学计算机系 44
Java应用程序的入口
main()方法的参数是一个字串数组,其大小没有限制,数组的元素包括了应用程序执行时的命令行参数,
使用 args.length可以得到参数的个数,第 0个参数是命令行的第一个参数,
对比 C的 main函数,
int main(int argc,char* args[])
2009-7-29 北京理工大学计算机系 45
final限定符
用 final可以定义一个常量
final static int myTotal=100;
final Fruit banana = new Fruit(200,35);
常量对象变量不能指向另一个对象,但可以修改对象变量所代表对象的数据成员值,
2009-7-29 北京理工大学计算机系 46
课后练习
编写一个类,其中带有多个构造函数,演示如何在一个构造函数中调用另一个构造函数,
打印出它们的执行顺序小结
2009-7-29 北京理工大学计算机系 48
类设计的一些原则
类变量私有化
显式初始化变量
标识符望名知义
基于职责的设计包与类路径设置
2009-7-29 北京理工大学计算机系 50
包( Packages)
Java中的可复用软件资源以包的形式提供
每个包都针对某个领域:如网络,GUI(图形用户界面)等。
包中存放了彼此在功能上互补的多个类。
使用 import语句在 Java程序中使用包
import javax.swing.JApplet;
包相当于 C++中的名字空间( name space)
2009-7-29 北京理工大学计算机系 51
静态导入包
import static java.lang.Math.*;
即可直接使用数学函数了。
2009-7-29 北京理工大学计算机系 52
Java编译器对包的处理
将 import语句引入的包字符串拼接到标识符前。
2009-7-29 北京理工大学计算机系 53
将类放入包中
Package语句。
2009-7-29 北京理工大学计算机系 54
路径问题的复杂性
java公有类必须放入同名的源文件编译生成,class
文件
如果代码中使用了另外包中的类,必须保证此类的,class文件可以在与包名匹配的路径中
可以使用 CLASSPATH环境变量指明,class文件的查找变量。
为降低复杂程度,可以使用 Jar将所有相关文件都打包到同一个压缩包中。
Java程序文档的自动生成
2009-7-29 北京理工大学计算机系 56
给类添加注释
通过给类添加特定格式的注释,就可以使用 javadoc工具自动为程序生成文档
实例,Test.java
2009-7-29 北京理工大学计算机系 57
Javadoc工具
使用 javadoc直接生成 HTML格式的网页
2009-7-29 北京理工大学计算机系 58
自动生成的文档
2009-7-29 北京理工大学计算机系 59
下一讲
介绍面向对象理论中的核心部分:
继承与多态