zoukankan      html  css  js  c++  java
  • 《面向对象程序设计(Java)》第四周学习总结

    《面向对象程序设计(Java)》第四周学习总结

    实验四 类与对象的定义及使用

    实验时间 2018-9-20

    1、实验目的与要求

    (1) 理解用户自定义类的定义;

    (2) 掌握对象的声明;

    (3) 学会使用构造函数初始化对象;

    (4) 使用类属性与方法的使用掌握使用;

    (5) 掌握packageimport语句的用途。

    2、实验内容和步骤

    实验1 测试以下程序,掌握文件输入输出程序设计技术(文件输入输出,教材61-62.

     

    插入程序显示的代码测试结果如下:

     

    txt的形式输出保存:

     

    改变文件的保存地址,输出结果如下所示:

     

    实验2 导入第4章示例程序并测试。

    测试程序1

       编辑、编译、调试运行程序4-2(教材104页);

        结合程序运行结果,掌握类的定义与类对象的用法,并在程序代码中添加类与对象知识应用的注释;

       尝试在项目中编辑两个类文件(Employee.java EmployeeTest.java ),编译并运行程序。

       参考教材104EmployeeTest.java,设计StudentTest.java,定义Student类,包含name(姓名)、sex(性别)、javascorejava成绩)三个字段,编写程序,从键盘输入学生人数,输入学生信息,并按以下表头输出学生信息表:

      姓名      性别 java成绩

    测试这个程序,所显示的结果如下所示:

     

    对程序改编的设计结果如下所示:

    原实例代码:

    import java.util.Scanner;

     

    public class Student implements Compare

    {

        private String no;

        private String name;

        private double score;

     

        public Student ( String no, String name, double score )

        {

            this.no = no;

            this.name = name;

            this.score = score;

        }

        public String displays ()

        {

            StringBuilder builder = new StringBuilder ();

            builder.append ("Student [no=");

            builder.append (no);

            builder.append (", name=");

            builder.append (name);

            builder.append (", score=");

            builder.append (score);

            builder.append ("]");

            return builder.toString ();

        }

     

        public void setScore ( double score )

        {

            this.score = score;

        }

     

        public double getScore ()

        {

            return score;

        }

     

        @Override

        public boolean compare ( Object o )

        {

            return ( this == o || null != o && o.getClass ().equals (this.getClass ()) )

                    && ( (Student) o ).score > this.score;

        }

     

        public static void sort ( Student[] students )

        {

            for ( int i = 0; i < students.length; i++ )

            {

                for ( int j = i + 1; j < students.length; j++ )

                {

                    if (students[i].compare (students[j]))

                    {

                        Student temp = students[i];

                        students[i] = students[j];

                        students[j] = temp;

                    }

                }

            }

        }

     

        public static void main ( String[] args )

        {

            System.out.print ("建立一个含有n个学生的数组, 从键盘输入n: ");

            Scanner scanner = new Scanner (System.in);

            int count = 0;

            double scores = 0;

            int n = scanner.nextInt ();

            Student[] students = new Student[n];

            System.out.println ("从键盘输入每个学生的信息: 学号、姓名、java成绩 用英文逗号分隔.");

            String line = null;

            try

            {

                while (count < n && null != ( line = scanner.next () ))

                {

                    if (line.matches ("^\w+\,\w+\,\d+(\.\d*)?$"))

                    {

                        String no = line.split ("\,")[0].trim ();

                        String name = line.split ("\,")[1].trim ();

                        double score = Double.parseDouble (line.split ("\,")[2].trim ());

                        students[count] = new Student (no, name, score);

                        scores += score;

                        count++;

                    }

                }

            }

            catch (ScoreException e)

            {

                e.printStackTrace ();

            }

            System.out.println ("排序:");

            sort (students);

            for ( int i = 0; i < students.length; i++ )

            {

                System.out.println (students[i].displays ());

            }

            System.out.println ("学生的java成绩的平均分: " + ( scores / n ));

            scanner.close ();

            Student collegeStudent = new CollegeStudent ("001", "yugi111", 120, "1999-01-01", "man");

            System.out.println (collegeStudent.displays ());

        }

    }

     

    class CollegeStudent extends Student

    {

        private String Date;

        private String sex;

     

        public CollegeStudent ( String no, String name, double score, String Date, String sex )

        {

            super (no, name, score);

            this.Date = Date;

            this.sex = sex;

        }

     

        @Override

        public String displays ()

        {

            StringBuilder builder = new StringBuilder ();

            builder.append ("CollegeStudent [Date=").append (Date).append (", sex=").append (sex).append ("]");

            return builder.toString ();

        }

    }

     

    interface Compare

    {

        boolean compare ( Object o );

    }

     

    class ScoreException extends IllegalArgumentException

    {

        private static final long serialVersionUID = 1L;

     

        public ScoreException ()

        {

            super ();

        }

     

        public ScoreException ( String s )

        {

            super (s);

        }

     

        static ScoreException forInputString ( String s )

        {

            return new ScoreException ("For input string: "" + s + """);

        }

    }

    改编后运行的结果如下图所示:

     

    测试程序2

        编辑、编译、调试运行程序4-3(教材116);

       结合程序运行结果,理解程序代码,掌握静态域(netxtId)与静态方法(getNextId)的用法,在相关代码后添加注释;

       理解Java单元(类)测试的技巧。

     程序测试运行结果如下所示:

     

    静态域的使用方法:

        如果将域定义为static,每个类中只有这样的一个域。而每一个对象对于所有的实例域却都有自己的一个拷贝。每个雇员都有一个自己的id域,但这个类的所有实例将共享一个nextId域。但是,只有一个静态域nextid,即使没有一个雇员对象,静态域nextId也存在。它属于类,而不属于任何独立的对象。

    静态方法的用法:

         静态方法是一种不能想对象实施操作的方法。在下面两种情况下可以使用静态方法:

       1)一个方法不予要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow

       2)一个方法只需要访问类的静态域(例如:Employee.getNextId

    测试程序3

        编辑、编译、调试运行程序4-4(教材121);

       结合程序运行结果,理解程序代码,掌握掌握Java方法参数的用法,在相关代码后添加注释;

    测试的结果如下所示:

     

         理解程序代码:

        在这个程序测试当中,首先试图将一个值参数的值提高两倍,但是并没有成功,随后成功地将一个雇员的薪金提高了两倍。在这个方法结束之后,harry应用对象状态发生了变化。这是因为这个方法可以通过对象引用的拷贝修改所引用的对象状态。最后程序演示拉我swap失败的结果,可以明显的看出,最后变量xy交换了,但是变量ab没有收到影响。

    测试程序4

        编辑、编译、调试运行程序4-5(教材129);

       结合程序运行结果,理解程序代码,掌握Java用户自定义类的用法,掌握对象构造方法及对象使用方法,在相关代码后添加注释。

       测试程序结果如下图所示:

     

    对程序的理解:

         在这个程序当中,用了Java的第三种初始化数据域的方法,称为初始化块。在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。在这个程序的25行开始,无论使用哪个构造器类对象,Id域都在对象初始化块中被初始化。首先运行初始化块,然后才运行构造器的主题部分。

       在这个程序清单中展示了很多特性:重载构造器、用this(...)调用另一个构造器、无参数构造器、对象初始化块、静态初始化块、实例域初始化等。

    测试程序5

          编辑、编译、调试运行程序4-64-7(教材135);

         结合程序运行结果,理解程序代码,掌握Java包的定义及用法,在相关代码后添加注释;

     

    程序测试结果如下: 

     

     

     

     程序分析:

         在这个程序当中介绍我们介绍了怎么使用类的导入,可以使用import语句导入一个特定的类火整个包,Import语句是一种应用包含在保重的类的简明描述,一旦使用了import语句,在使用类时,就不必写出包的全名了。而且在实验当中也有将类放入包中,就必须将包的名字放在源文件的开头,包中定义类的代码之前。如果没有在源文件中放置package语句,这个源文件中的类就被放置在一个默认包中。默认包是一个没有名字的包。再次之前,我们定义的所有类都在默认包中。

    实验 

    编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

    求周长的方法public int getPerimeter()

    求面积的方法public int getArea()

    在main方法中完成以下任务:

    1 输入1行长与宽,创建一个Rectangle对象;

    2 输入1行半径,创建一个Circle对象;

    3 将两个对象的周长加总输出,将两个对象的面积加总输出。

     程序的源代码如下:

    test.java代码:

    package graph;

     

    import java.math.BigDecimal;

    import java.util.Scanner;

    class test {public static void main(String[] args) {

     

    Scanner sc = new Scanner(System.in);

    System.out.println("请输入长方形的长:");int length = sc.nextInt();

    System.out.println("请输入长方形的宽:");int width = sc.nextInt();

    System.out.print("请输入圆的半径-->");float radius=sc.nextFloat();

     

    graph x = new graph();

     

    x.setLength(length);

    x.setWidth(width);

    x.setRadius(radius);

    System.out.println("周长是:"+x.getPerimeter());

    System.out.println("面积是:"+x.getArea());

    System.out.println("圆的周长为-->"+x.getPerimeter(radius)+" "+"圆的面积为-->"+x.getArea(radius));

    BigDecimal bd1 = new BigDecimal(x.getPerimeter(radius));

    BigDecimal bd2 = new BigDecimal(x.getArea(radius));

    BigDecimal bd3 = new BigDecimal(x.getPerimeter());

    BigDecimal bd4 = new BigDecimal(x.getArea());

    BigDecimal bd5 = bd1.add(bd3);

    BigDecimal bd6 = bd2.add(bd4);

    bd5= bd5.setScale(2, BigDecimal.ROUND_HALF_UP);

    bd6= bd6.setScale(2, BigDecimal.ROUND_HALF_UP);

    System.out.println("周长和:"+bd5+" "+"面积和"+bd6);

    }

    }

    graph.java代码:

    package graph;

     

    import java.util.Scanner;

    import java.math.BigDecimal;

    class graph{private int length;private int width;float radius;

    public graph(){}

    public void setLength(int length) {this.length = length;

    }

    public void setWidth(int width) {this.width = width;

    }

    public int getPerimeter() {return (length + width) * 2;

    }

    public int getArea() {return length * width;

    }

    public void setRadius(float radius) {

        BigDecimal bd = new BigDecimal(radius);

        radius = bd.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();this.radius = radius;

    }

    public float getPerimeter(float radius){

        BigDecimal bd = new BigDecimal(radius);

        radius = bd.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();return (float) (radius*2*3.14);

    }

    public float getArea(float radius){

        BigDecimal bd = new BigDecimal(radius);

        radius = bd.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();return (float) (radius*radius*3.14);

    }

    }

    程序输出的结果如下图所示:

     

    实验总结:

     

    通过这周的学习,再结合前三周的学习,基本上掌握类的定义和使用,编写构造方法并且实现创建类的实例,掌握对象的声明和不同访问属性的成员访问方式以及定义接口、实现接口,通过此次实验让我发现了我对类的定义及其运用都不够熟练,对课本的熟悉度还远远不够,在课后应该及时的复习和上机操作是我们的必修课,这样才能让我们进一步的掌握类与对象。这次的实验我总的感觉还是有点吃力的,实验越来越来就越来越有挑战,在之后的学习中我会更加认真,争取在不借鉴资料的情况下就能独立完成作业。

     

     

     

     

  • 相关阅读:
    处处留心皆学问,世事如棋局局新…
    【转载】2017 软件测试行业现状调查报告_From_51testing_On_20180625
    Hello World In Go ...
    C# 易错题整理
    C# 函数
    C# 哈希表,队列,栈
    C# 数组,集合,泛型集合
    C# 如何生成验证码
    C# 年月日时间题+Timespan
    闰年的一个BUG
  • 原文地址:https://www.cnblogs.com/xuezhiqian/p/9708007.html
Copyright © 2011-2022 走看看