三、实验内容

(一)类的声明与使用

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.编译并运行

对上面的源程序进行编译,排错并运行。