实验六 高级类设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六高级类设计
一、实验目的
通过实验验证类的高级特性的相关语法,掌握类的静态域、静态方法,包,掌握接口的定义和实现方法,掌握异常的使用方法。
二、实验要求
1. 了解Java 系统包的结构。
2. 掌握创建自定义包的方法。
3. 掌握使用系统接口的技术和创建自定义接口的方法。
4. 理解系统异常处理的机制和创建自定义异常的方法。
三、实验设备
计算机、JCreator 、JDK
四、实验内容
Ⅰ基本指导
(-)静态方法和静态变量
static 声明的成员变量、方法称为静态方法和静态成员,静态方法和静态成员被视为类的成员变量、类的成员方法,而不把它当作实例对象的成员变量和方法。换句话说,静态变量、静态方法是类固有的,可以直接引用,其它成员变量、成员方法仅仅被声明,生成实例对象后才存在,才可以被引用。基于这样的事实,也把静态变量、静态方法称为类变量、方法,非静态变量称为实例变量、实例方法。
下面给出类StaticDemo和对应测试类StaticDemoTest,分别存放在文件
StaticDemo.java和StaticDemoTest.java中,仔细阅读程序,观察程序的运行结果,理解static 方法和变量的使用方法。
1.类StaticDemo
//该程序验证静态方法和静态变量的特点
//StaticDemo.java文件
public class StaticDemo {
private static int x; //静态变量
private int y;
public static int getX( )//静态方法
{
return x;
}
public static void setX(int newX) {//静态方法
x = newX;
}
public int getY() {//实例方法
return y;
}
public void setY(int newY) {//实例方法
y = newY;
}
}
阅读该程序,总结下列问题:
1)如何定义一个静态的方法和静态的常量,我们使用的关键字是什么?与实例常量和方法的定义有何区别?
2.输入StaticDemo类的测试类文件StaticDemoTest.java,仔细阅读程序,观察运行结果,体会静态方法和静态变量的用法和特征。
//StaticDemoTest.java
public class StaticDemoTest {
public static void main(String[] args) {
//注意静态方法getX()访问的方式:类名.方法名();
System.out.println("静态变量x="+StaticDemo.getX());
//访问实例方法
// System.out.println("实例变量y="+StaticDemo.getY()); // 非法,编译时将出错
StaticDemo a= new StaticDemo();
StaticDemo b= new StaticDemo();
//再次访问静态方法,通过对象名.方法名();
a.setX(1);
System.out.println("a. setX(1)后,a和b对x的取值是:");
System.out.println("静态变量a.x="+a.getX());
System.out.println("静态变量b.x="+b.getX());
b.setX(3);
System.out.println("b. setX(3)后,a和b对x的取值是:");
System.out.println("静态变量a.x="+a.getX());
System.out.println("静态变量b.x="+b.getX());
a.setY(2); //访问实例方法
b.setY(4);
//输出对象a、b 的属性:x,y的值
System.out.println("a,b的最后的值为”);
System.out.println("静态变量a.x="+a.getX());
System.out.println("实例变量a.y="+a.getY());
System.out.println("静态变量b.x="+b.getX());
System.out.println("实例变量b.y="+b.getY());
}
}
阅读并运行类StaticDemoTest,思考下列问题:
1)对于类StaticDemo中定义的静态方法getX();我们分别使用了类名.静态方法名()和对象名. 静态方法名()两种方式进行调用,编译该类,查看是否有错误,如果没有错误则说明两种方式都可以调用静态方法。
2)在程序中我们将“System.out.println("实例变量y="+StaticDemo.getY());”进行了注释,删去注释符号,重新编译该类,观察是否有编译错误,如果有说明什么问题?(提示:我们通过类名.实例方法名()调用了实例方法)。
3) 删去“System.out.println("实例变量y="+StaticDemo.getY());”或者为此语句添加注释,重新编译运行此类,仔细查看输出结果,对象a的x、y的值是多少?对象b的x、y的值是多少?
a、b两个对象的静态变量x的值一直保持相同,而y是分别不同的,这表示静态变量是所有对象共享的,而实例变量是各个对象自有的。
4)将类StaticDemo中的Static方法:setX,按照下列语句进行修改:
public static void setX(int newX) {//静态方法
x = newX + y;
}
重新保存并编译类StaticDemo,有没有编译错误,如果有,说明其无法访问类的实例变量y,但是可以访问静态变量x;这表示什么含义?
5)撤销对类StaticDemo中的Static方法setX的修改,修改方法setY。
public void setY(int newY) {//实例方法
y = newY+x;
}
重新保存并编译类StaticDemo,有没有编译错误,如果有,说明实例方法setY无法访问类的静态变量x,如果没有,表示其可以访问类的静态变量。
6)将类StaticDemo中的变量x、y的访问权限设置为public,并修改StaticDemoTest使其在StaticDemoTest对两个变量直接进行访问,总结对静态变量的访问方式。
Static小结:
·类的静态变量可以直接引用,而非静态变量则不行。类的静态变量相当于某些程序语言的全局变量。
·静态方法只能使用静态变量,不能使用实例变量。因为对象实例化之前,实例变量不可用。
·类的静态变量只有一个版本,所有实例对象引用的都是同一个版本。
·对象实例化后,每个实例变量都被制作了一个副本,它们之间互不影响。