三、实验内容
(一)类的声明与使用
1.使用Eclipse创建名为“task3_1”的Java项目
在该项目中创建一个名为“Rectangle”的Java类,该类实现图3-1所示UML类图的功能(Rectangle类代码自行实现)。在“task3_1”项目中再创建一个名为“Task3_1”的Java主类,在该类的main方法中使用Rectangle类,参考代码如图3-2所示。
图3-1 Rectangle UML类图功能界面
图3-2 main方法中使用Rectangle类参考代码
2.使用Eclipse创建名为“task3_2”的Java项目
在该项目中创建一个名为“Sector”的Java类,该类实现图3-3所示UML类图的功能。在“task3_2”项目中再创建一个名为“Task3_2”的Java主类,在该类的main方法中使用Sector类,参考代码如图3-4所示。
图3-3 Sector UML类图功能界面
图3-4 main方法中使用Sector类参考代码
(二)方法的重载
使用Eclipse创建名为“task3_3”的Java项目,在该项目中创建一个名为“Maths”的Java类,先定义一个max方法,用于实现求两个整数中的最大值。再定义一个max重载方法,它实现求三个整数中的最大值。在“task3_3”项目中再创建一个名为“Task3_3”的Java主类,在该类的main方法中使用Maths类,参考代码如图3-5所示。
图3-5 main方法中使用Maths类参考代码
(三)类的构造方法
使用Eclipse创建名为“task3_4”的Java项目,在该项目中创建一个名为“Rectangle”的Java类,再实现图3-6所示UML类图。其中包含两个构造方法:一个是无参数的构造方法,将成员变量width和height都设置为1;另一个是带参数w和h的构造方法,将成员变量width和height分别设置为参数w和h。在“task3_4”项目中再创建一个名为“Task3_4”的Java主类,在该类的main方法中使用Rectangle类的两个构造方法,参考代码如图3-7所示。
图3-6 Rectangle UML类图(含两个构造方法)
图3-7 main方法中使用Rectangle类的两个构造方法的参考代码
(四)对象的引用和实体
1.实验内容1:阅读程序,理解对象的引用和实体,写出程序运行输出结果
已知Rectangle类(定义在文件Rectangle.java中)的代码如图3-8所示,主类Task3_5的main方法(定义在文件Task3_5.java中)的代码如图3-9所示。
图3-8 Rectangle.java文件代码
图3-9 Task3_5.java文件代码
2.实验内容2:在Eclipse中编写上述代码,验证阅读程序所得到结果
使用Eclipse创建名为“task3_5”的Java项目,在该项目中创建一个名为“Rectangle”的Java类,代码如图3-8所示。在“task3_5”项目中再创建一个名为“Task3_5”的Java主类,该类的main方法代码如图3-9所示。
(五)参数传递
1.实验内容1:阅读程序,理解参数的传递规则,写出其运行输出结果
已知Battery类、Radio类和MyMath类(这三个类都定义在文件Battery.java中)的代码如图3-10所示,主类Task3_6的main方法(定义在文件Task3_6.java中)的代码如图3-11所示。
图3-10 Battery.java文件代码
图3-11 Task3_6.java文件代码
2.实验内容2:在Eclipse中编写上述代码,验证阅读程序所得到结果
使用Eclipse创建名为“task3_6”的Java项目,在该项目中创建三个名称分别为“Battery”“Radio”和“MyMath”的Java类,代码如图3-10所示(这三个类都定义在文件Battery.java中)。在“task3_6”项目中再创建一个名为“Task3_6”的Java主类,该类的main方法代码如图3-11所示。
3.实验内容3:编写一个传值调用的程序文件task3_7.java
(1)程序功能:首先给整型变量x和y赋一个初值10,然后使用传值调用方式调用方法ff1对x和y做乘方及输出x和y的乘方值,最后再输出x和y的乘方值。
(2)程序源代码如下。
class task3_7 { public static void main(String[]args){ int x=10, y=10; ff1(x, y); System.out.println("x="+x+", y="+y); } static void ff1(int passX, int passY){ passX=passX∗passX; passY=passY∗passY; System.out.println("passX="+passX+", passY="+passY); } }
(3)编译task3_7.java。
(4)分析其运行结果。
4.实验内容4:编写一个调用对象方法的程序文件task3_8.java
(1)程序功能:通过调用对象的方法在方法调用后修改成员变量的值。
(2)task3_8.java程序源代码如下。
class task3_8 { public static void main(String[]args){ Power p=new Power();
p.ff2(10,10); System.out.println("方法调用后x="+p.x+", y="+p.y); } } class Power{ int x=10, y=10; void ff2(int passX, int passY){ System.out.println("初始时x="+x+", y="+y); x=passX∗passX; y=passY∗passY; System.out.println("方法调用中x="+x+", y="+y); } }
(3)编译task3_8.java。
以上实验例子仅仅是为了说明Java编程中参数传递时要注意的问题,在实际编程中是不可取的,因为完全可以采用其他更好的方法来实现参数的传递。例如,前面还使用过传递对象的方式。
【请思考】
方法的参数传递有哪些方式?区别是什么?
(六)对象的组合
1.实验内容1:掌握在Eclipse中实验对象的组合方法,理解和掌握对象的关联关系和依赖关系
图3-12 task3_9 UML类图
使用Eclipse创建名为“task3_9”的Java项目,在该项目中创建一个名称为“Circle”的Java类(表示圆),其成员变量和方法如图3-12右侧所示。在“task3_9”项目中再创建一个名称为“Cylinder”的Java类(表示圆柱体),其成员变量和方法如图3-12左侧所示,其中,成员变量bottom为Circle类的对象。在“task3_9”项目中再创建一个名为“Task3_9”的Java主类,该类的main方法代码如图3-13所示。
图3-13 Task3_9中的Java代码
2.实验内容2:判断下面两个UML类图中类与类之间的关系
图3-14 判断类与类的关系
【问题1】在图3-14的UML类图中,Cylinder类与Circle类是什么关系?
回答:( )类(关联或依赖)( )类。
【问题2】在图3-14的UML类图中,Radio类与Battery类是什么关系?
回答:( )类(关联或依赖)( )类。
(七)实例成员与类成员
1.实验内容1:阅读程序,理解实例成员和类成员之间的区别,写出程序运行输出结果
已知Account类(定义在文件Account.java中)的代码如图3-15所示,主类Task3_10的main方法(定义在文件Task3_10.java中)的代码如图3-16所示。
图3-15 Account.java文件代码
图3-16 Task3_10.java文件代码
2.实验内容2:在Eclipse中编写上述代码,验证阅读程序所得到结果
使用Eclipse创建名为“task3_10”的Java项目,在该项目中创建“Account”的Java类,代码如图3-15所示(定义在文件Account.java中)。在“task3_10”项目中再创建一个名为“Task3_10”的Java主类,该类的main方法代码如图3-16所示。
(八)实例方法与类方法
1.实验内容1:阅读程序,理解实例方法和类方法之间的区别,写出程序运行输出结果
已知Account类(定义在文件Account.java中)的代码如图3-17所示,主类Task3_11的main方法(定义在文件Task3_11.java中)的代码如图3-18所示。
图3-17 Account.java文件代码
图3-18 Task3_11.java文件代码
2.实验内容2:回答下面9个判断题
(1)用关键字static只能修饰成员变量,不能修饰成员方法。( )
(2)静态(类)方法和静态(类)成员只能通过类名进行访问。( )
(3)实例方法和实例成员变量可以通过类名进行访问。( )
(4)静态(类)方法只能访问静态(类)成员变量和其他静态(类)方法。( )
(5)实例方法可以访问静态(类)方法和静态(类)成员。( )
(6)同一类的不同对象的实例成员变量相互独立。( )
(7)同一类的不同对象共享其类成员变量。( )
(8)必须创建该类的一个对象后,才可以访问该类的静态成员变量。( )
(9)在静态(类)方法中可以使用关键字this。( )
3.实验内容3:在Eclipse中编写上述代码,验证阅读程序所得到结果
使用Eclipse创建名为“task3_11”的Java项目,在该项目中创建“Account”的Java类,代码如图3-17所示(定义在文件Account.java中)。在“task3_11”项目中再创建一个名为“Task3_11”的Java主类,该类的main方法代码如图3-18所示。
(九)在JDK中使用包
1.实验内容1:理解包的含义,掌握在JDK中使用包的方法
(1)步骤1:采用记事本编辑Circle类,代码如图3-19所示。
图3-19 Circle类代码
(2)步骤2:保存指定包名的类。首先在D盘的根目录中新建文件夹“D:\task3_12”,并在D:\task3_12文件夹下创建“aaa”文件夹,再在“aaa”文件夹下创建“bbb”文件夹,再将上面编辑的Circle类保存到文件“D:\task4_10\aaa\bbb\Circle.java”。
注意:指定包名的类的存放路径必须与包名相一致,即如果某个类指定的包名为xxx.yyy.zzz,则该类必须保存在“<应用程序根目录>\xxx\yyy\zzz”文件夹中。
(3)步骤3:编译指定了包名的Circle类。打开MS-DOS环境,通过cd命令把当前目录切换到“D:\task3_12”,再通过如图3-20所示命令对文件D:\task3_12\aaa\bbb\Circle.java进行编译。
图3-20 编译指定了包名的Circle类命令
(4)步骤4:采用记事本编辑Task3_12类,采用第1种方法使用aaa.bbb包中的Circle类,代码如图3-21所示。将Task3_12类保存到文件“D:\task3_12\Task3_12.java”。
图3-21 记事本编辑Task3_12类
(5)步骤5:编译Task3_12类。打开MS-DOS环境,通过cd命令把当前目录切换到“D:\task3_12”,再通过如图3-22所示命令对文件D:\task3_12\Task3_12.java进行编译。
图3-22 编译Task3_12类命令
(6)步骤6:采用记事本编辑Task 4_10A类,采用第2种方法使用aaa.bbb包中的Circle类,代码如图3-23所示。将Task 3_12A类保存到文件“D:\task3_12\Task 3_12A.java”。
图3-23 记事本编辑Task3_12A类
(7)步骤7:编译Task 3_12A类。打开MS-DOS环境,通过cd命令把当前目录切换到“D:\task3_12”,再通过如图3-24所示命令对文件D:\task3_12\Task 3_12A.java进行编译。
图3-24 编译Task3_12A类命令
(8)步骤8:执行Task3_12.class和Task3_12A.class。打开MS-DOS环境,通过cd命令把当前目录切换到“D:\task3_12”,再通过如图3-25和图3-26所示命令分别执行Task3_12.class和Task3_12A.class。
图3-25 Task3_12.class命令
图3-26 Task3_12A.class命令
(十)在Eclipse中使用包
1.实验内容1:在Eclipse中使用包
使用Eclipse创建Java项目“task3_13”,在该项目中创建一个名为“MyCircle”的Java类,在“New Java Class”对话框中指定MyCircle类的包名,效果如图3-27所示。MyCircle类的代码如图3-28所示。
图3-27 在“New Java Class”对话框中指定MyCircle类包名的界面
图3-28 MyCircle类代码
在项目task3_13中创建一个名为“Task3_13”的Java类,在“New Java Class”对话框中不指定Task3_13类的包名,效果如图3-29所示。Task3_13.java文件中的代码如图3-30所示(包含了MyCircle类和Task3_13类的代码)。
图3-29 “New Java Class”对话框中不指定Task3_13类包名的界面
图3-30 Task3_13.java文件代码
(十一)类成员的访问权限
1.实验内容1:通过实验理解类成员的各种访问权限
使用Eclipse创建Java项目“task3 _ 14”,在该项目中创建一个名为“AccessControl”的Java类,在“New Java Class”对话框中指定AccessControl类的包名为“task3_14.package1”,效果如图3-31所示。AccessControl类的代码如图3-32所示。
图3-31 指定包名为task3_14.package1对话框
图3-32 AccessControl类代码
在项目task3_14中创建一个名为“Task 3_14”的Java类,在“New Java Class”对话框中指定Task 3_14类的包名为“task3_14”,效果如图3-33所示。Task 3_14.java文件中的代码如图3-34所示(包含了Task 3_14类和另一个AccessControl类的代码)。
图3-33 在“New Java Class”对话框中指定Task3_14类的包名界面
图3-34 Task3_14.java文件代码
回答Task3_14类中main方法中的9个问题,答案直接写在图3-34实验作业提交界面中。
(十二)类的访问权限
实验内容:通过实验理解类的访问权限
使用Eclipse创建Java项目“task3_15”,在该项目中创建一个名为“PublicClass”的Java类,在“New Java Class”对话框中指定AccessControl类的包名为“task3_15. package1”,效果如图3-35所示。PublicClass类的代码如图3-36所示(还包括名为FriendClass的友好类)。
图3-35 指定AccessControl类的包名为task3_15.package1的界面
图3-36 Task3_15.package1文件代码
在项目task3_15中创建一个名为“Task3_15”的Java类,在“New Java Class”对话框中指定Task3_15类的包名为“task3_15”,效果如图3-37所示。Task3_15.java文件中的代码如图3-38所示(还包括名为FriendClass2的友好类)。
图3-37 在“New Java Class”对话框中指定Task3_15类的包名界面
图3-38 Task3_15.java文件代码
回答Task3_15类中main方法中的3个问题,答案直接写在图3-38实验作业提交界面中。
(十三)使用修饰符
有时需要公开一些变量和方法,有时需要禁止其他对象使用一些变量和方法,这时可以使用修饰符来实现这个目的。常用的修饰符有public, private, protected, package, static, final, transient, volatile等。
1.程序功能
通过两个类StaticDemo、Task3_16说明静态变量/方法与实例变量/方法的区别。
2.编写类文件Task3_16.java
程序源代码如下。
class StaticDemo { static int x; int y; public static int getX(){ return x; } public static void setX(int newX){ x = newX; } publ ic int getY(){ return y; } public void setY(int newY){ y = newY; } } public classTask3_16{ public static void main(String[]args){ System.out.println("静态变量x="+StaticDemo.getX()); System.out.println("实例变量y="+StaticDemo.getY()); //非法,编译时将出错 StaticDemo a= new StaticDemo(); StaticDemo b= new StaticDemo(); a.setX(1); a.setY(2); b.setX(3); b.setY(4); 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()); } }
3.编译并运行
对上面的源程序进行编译,排错并运行。