• 201771010108 -韩腊梅-第四周学习总结


                                                                                                                    201771010108 -韩腊梅-第四周学习总结

    一、知识总结

    1. 对象的三个主要特性:
    - 对象的行为:可以对对象施加的操作,方法?
    - 对象的状态:当施加那些方法时,对象如何响应?
    - 对象的标识:如何辨别具有相同行为与状态的不同对象?

    2. 类之间的关系:
    - 依赖(use-a):一个类访问或操作其他类的对象
    - 聚合(has-a):类A的对象包含类B的对象
    - 继承(is-a):继承关系

    3.   用户自定类:

          在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类。

          Java 对象都是在堆中构造的。

           public void raiseSalary(double byPercent) 

          方法有两个参数。第一个参数称为隐式参数,是出现在方法名前的类对象。第二个参数位于方法名后面括号中的数值,这是一个显式参数。

          在每一个方法中,关键字this标识隐式参数。

           在C++中,如果在类内定义方法,这个方法将自动成为内联方法。但在Java 中,将某个方法设置为内联方法是Java虚拟机的任务。即时编译器会监视调用那些简洁、经常被调用、没哟被重载以及可优化的方法。

          如果需返回一个可变数据域的拷贝,就应该使用clone().

          final 关键字只是表示存储在变量中的对象引用不会再指示其他对象,但是对象的内容是可以修改的

    4.静态域与静态方法:

          静态域被称为类域,属于类,不属于任何独立的对象。

          静态方法:
                    - 静态方法时一种不能面向对象实施操作的方法。
                    - 没有隐式参数。

          main方法: 

                    - 在启动程序时还没有任何一个对象。静态的main方法将执行并创建程序所需要的对象。

    5. 对象构造:

    方法签名:方法名 + 参数类型 【不包括返回类型】

    重载:

    • 不允许两个方法签名相同,但是返回类型不同的重载方法

    • 如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供构造参数就会被视为不合法。仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器。

    • 域分为两种:实例域 类域

    如果构造器的第一个语句形如this(…) 这个构造器将调用同一个类的另一个构造器。(在C++中则不允许)

    初始化快
    形如{…}首先运行初始化块,然后才运行构造器的主题部分。

    小结:具体处理步骤

    • 所以数据域被初始化为默认值(0,false,null)
    • 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。
    • 执行构造函数。

    关于析构和回收:

    • Java 有自动的垃圾回收器,不需要人工回收内存,所以Java 不支持析构器。

    • finalize 方法将在垃圾回收器清除对象之前调用。在实际应用中,不要依赖使用finalize 方法回收任何短缺的资源,这是因为很难知道这个方式什么时候才能够调用。

    6. 包

    • 在Java 中,package 与 import 语句类似于C++ 中的namespace 和 using 指令。

    • 如果没有在源文件中放置package 语句,这个源文件中的包

    二、实验目的与要求

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

    (2) 掌握对象的声明;

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

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

    (5) 掌握package和import语句的用途。

    三、实验内容步骤及实验结果

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

    实验代码:

     

    /**
     * @author Han lamei
     */
    package four;
    
    import java.io.*;
    import java.util.*;
    public class Four {
        public static void main(String[] args) throws IOException{
            //写入文件演示
            PrintWriter out = new PrintWriter("myfile.txt");
            out.println("姓名 高数 Java 数据结构 平均成绩 总成绩");
            out.println("张三 20 30 40 0 0");
            out.println("李四 50 60 70 0 0");
            out.close();//输出完毕,需要close
            //读入文件演示
            Scanner in = new Scanner(new File("myfile.txt"));//为myfile.txt这个File创建一个扫描器in
            int number = 1;//行号
            System.out.println(in.nextLine());
            while(in.hasNextLine()){//判断扫描器是否还有下一行未读取,该循环把文件的每一行都读出
                String line = in.nextLine();//读出myfile.txt的下一行
                System.out.print(""+(++number)+"行的内容: ");            
                Scanner linescanner = new Scanner(line);//行内容建立扫描器
                linescanner.useDelimiter(" ");//使用空格作为分隔符
                String name = linescanner.next();
                String math = linescanner.next();
                String java = linescanner.next();
                String ds = linescanner.next();
                String avg = linescanner.next();
                String total = linescanner.next();
                System.out.println("name="+name+"  math="+math+"  java="+java+"  ds="+ds+"  avg"+avg+"  total="+total);
            }
            in.close();//读入完毕,最后需要对其进行close。
        }    
    }

     

    实验结果:

     

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

    测试程序1:

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

    实验代码:

    import java.util.*;
    
    /**
     * This program demonstrates object construction.
     * @version 1.01 2004-02-19
     * @author Cay Horstmann
     */
    public class EmployeeTest
    {
       public static void main(String[] args)
       {
          // fill the staff array with three Employee objects
          Employee[] staff = new Employee[3];
    
          staff[0] = new Employee("Harry", 40000);
          staff[1] = new Employee(60000);
          staff[2] = new Employee();
    
          // print out information about all Employee objects
          for (Employee e : staff)
             System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
                   + e.getSalary());
       }
    }
    
    class Employee
    {
       private static int nextId;
    
       private int id;
       private String name = ""; // instance field initialization
       private double salary;
      
       // static initialization block
       static
       {
          Random generator = new Random();
          // set nextId to a random number between 0 and 9999
          nextId = generator.nextInt(10000);
       }
    
       // object initialization block
       {
          id = nextId;
          nextId++;
       }
    
       // three overloaded constructors
       public Employee(String n, double s)
       {
          name = n;
          salary = s;
       }
    
       public Employee(double s)
       {
          // calls the Employee(String, double) constructor
          this("Employee #" + nextId, s);
       }
    
       // the default constructor
       public Employee()
       {
          // name initialized to ""--see above
          // salary not explicitly set--initialized to 0
          // id initialized in initialization block
       }
    
       public String getName()
       {
          return name;
       }
    
       public double getSalary()
       {
          return salary;
       }
    
       public int getId()
       {
          return id;
       }
    }

    实验结果:

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

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

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

      姓名      性别     java成绩

    实验代码:

    package f;
    
    import java.util.*;
    public class StudentTest
    {
    public static void main(String[] args)
       {
        Employee[] student = new Employee[3];
          System.out.println("请输入学生");
         
          @SuppressWarnings("resource")
        Scanner in = new Scanner(System.in); 
          for(int i=0;i<student.length;i++) {
              student[i]=new Employee(in.next(),in.next(),in.nextInt());
          }
          System.out.println("name"+" "+"sex"+" "+"javascore");
    
          for (Employee e : student)
             System.out.println(e.getName() +"    "+e.getSex()+"          "+e.getJavaScore());
       }
    }
    
    class Employee
    {
       private String name;
       private String sex;
       private int javascore;
    
       public Employee(String n, String s, int m)
       {
          name = n;
          sex = s;
          javascore =m;
       }
    
       public String getName()
       {
          return name;
       }
    
       public String getSex()
       {
          return sex;
       }
    
       public int getJavaScore()
       {
          return javascore;
       }
    }

    实验结果:

    测试程序2:

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

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

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

    实验代码:

    package e;
    
    /**
     * This program demonstrates static methods.
     * @version 1.01 2004-02-19
     * @author Cay Horstmann
     */
    public class StaticTest
    {
       public static void main(String[] args)
       {
          // fill the staff array with three Employee objects
          Employee[] staff = new Employee[3];
    
          staff[0] = new Employee("Tom", 40000);
          staff[1] = new Employee("Dick", 60000);
          staff[2] = new Employee("Harry", 65000);
    
          // print out information about all Employee objects
          for (Employee e : staff)
          {
             e.setId();
             System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
                   + e.getSalary());
          }
    
          int n = Employee.getNextId(); // calls static method
          System.out.println("Next available id=" + n);
       }
    }
    
    class Employee
    {
       private static int nextId = 1;
    
       private String name;
       private double salary;
       private int id;
    
       public Employee(String n, double s)
       {
          name = n;
          salary = s;
          id = 0;
       }
    
       public String getName()
       {
          return name;
       }
    
       public double getSalary()
       {
          return salary;
       }
    
       public int getId()
       {
          return id;
       }
    
       public void setId()
       {
          id = nextId; // set id to next available id
          nextId++;
       }
    
       public static int getNextId()
       {
          return nextId; // returns static field
       }
    
       public static void main(String[] args) // unit test
       {
          Employee e = new Employee("Harry", 50000);
          System.out.println(e.getName() + " " + e.getSalary());
       }
    }

    实验结果:

    测试程序3:

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

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

    实验代码:

    /**
     * This program demonstrates parameter passing in Java.
     * @version 1.00 2000-01-27
     * @author Cay Horstmann
     */
    public class ParamTest
    {
       public static void main(String[] args)
       {
          /*
           * Test 1: Methods can't modify numeric parameters
           */
          System.out.println("Testing tripleValue:");
          double percent = 10;
          System.out.println("Before: percent=" + percent);
          tripleValue(percent);
          System.out.println("After: percent=" + percent);
    
          /*
           * Test 2: Methods can change the state of object parameters
           */
          System.out.println("
    Testing tripleSalary:");
          Employee harry = new Employee("Harry", 50000);
          System.out.println("Before: salary=" + harry.getSalary());
          tripleSalary(harry);
          System.out.println("After: salary=" + harry.getSalary());
    
          /*
           * Test 3: Methods can't attach new objects to object parameters
           */
          System.out.println("
    Testing swap:");
          Employee a = new Employee("Alice", 70000);
          Employee b = new Employee("Bob", 60000);
          System.out.println("Before: a=" + a.getName());
          System.out.println("Before: b=" + b.getName());
          swap(a, b);
          System.out.println("After: a=" + a.getName());
          System.out.println("After: b=" + b.getName());
       }
    
       public static void tripleValue(double x) // doesn't work
       {
          x = 3 * x;
          System.out.println("End of method: x=" + x);
       }
    
       public static void tripleSalary(Employee x) // works
       {
          x.raiseSalary(200);
          System.out.println("End of method: salary=" + x.getSalary());
       }
    
       public static void swap(Employee x, Employee y)
       {
          Employee temp = x;
          x = y;
          y = temp;
          System.out.println("End of method: x=" + x.getName());
          System.out.println("End of method: y=" + y.getName());
       }
    }
    
    class Employee // simplified Employee class
    {
       private String name;
       private double salary;
    
       public Employee(String n, double s)
       {
          name = n;
          salary = s;
       }
    
       public String getName()
       {
          return name;
       }
    
       public double getSalary()
       {
          return salary;
       }
    
       public void raiseSalary(double byPercent)
       {
          double raise = salary * byPercent / 100;
          salary += raise;
       }
    }

    实验结果:

    测试程序4:

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

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

    实验代码:

    package e;
    import java.util.*;
    
    /**
     * This program demonstrates object construction.
     * @version 1.01 2004-02-19
     * @author Cay Horstmann
     */
    public class ConstructorTest
    {
       public static void main(String[] args)
       {
          // fill the staff array with three Employee objects
          Employee[] staff = new Employee[3];
    
          staff[0] = new Employee("Harry", 40000);
          staff[1] = new Employee(60000);
          staff[2] = new Employee();
    
          // print out information about all Employee objects
          for (Employee e : staff)
             System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
                   + e.getSalary());
       }
    }
    
    class Employee
    {
       private static int nextId;
    
       private int id;
       private String name = ""; // instance field initialization
       private double salary;
      
       // static initialization block
       static
       {
          Random generator = new Random();
          // set nextId to a random number between 0 and 9999
          nextId = generator.nextInt(10000);
       }
    
       // object initialization block
       {
          id = nextId;
          nextId++;
       }
    
       // three overloaded constructors
       public Employee(String n, double s)
       {
          name = n;
          salary = s;
       }
    
       public Employee(double s)
       {
          // calls the Employee(String, double) constructor
          this("Employee #" + nextId, s);
       }
    
       // the default constructor
       public Employee()
       {
          // name initialized to ""--see above
          // salary not explicitly set--initialized to 0
          // id initialized in initialization block
       }
    
       public String getName()
       {
          return name;
       }
    
       public double getSalary()
       {
          return salary;
       }
    
       public int getId()
       {
          return id;
       }
    }

    实验代码:

    测试程序5:

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

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

    实验代码:

    package e;
    import static java.lang.System.*;
    
    /**
     * This program demonstrates the use of packages.
     * @version 1.11 2004-02-19
     * @author Cay Horstmann
     */
    public class PackageTest
    {
       public static void main(String[] args)
       {
          // because of the import statement, we don't have to use 
          // com.horstmann.corejava.Employee here
          Employee harry = new Employee("Harry Hacker", 50000, 1989, 10, 1);
    
          harry.raiseSalary(5);
    
          // because of the static import statement, we don't have to use System.out here
          out.println("name=" + harry.getName() + ",salary=" + harry.getSalary());
       }
    }

    实验结果:

    实验3  编写长方形类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)  将两个对象的周长加总输出,将两个对象的面积加总输出。

    实验代码:

     

    package e;
    
    import java.util.Scanner;
    
    public class H {
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            System.out.println("请输入长方形的长与宽:");
            int length = in.nextInt();
            int width = in.nextInt();
            Rectangle a = new Rectangle(length, width);
            System.out.println("长方形周长:" + a.getPerimeter());
            System.out.println("长方形面积:" + a.getArea());
            System.out.println("输入圆半径:");
            int r = in.nextInt();
            Circle b = new Circle(r);
            System.out.println("圆的周长为:" + b.getPerimeter());
            System.out.println("圆的面积为:" + b.getArea());
            System.out.println("长方形和圆的周长之和=" + (a.getPerimeter() + b.getPerimeter()));
            System.out.println("长方形和圆的面积和=" + (a.getArea() + b.getArea()));
        }
    }
    
    class Rectangle {
        private int length;
        private int width;
    
        public Rectangle(int l, int w) {
            length = l;
            width = w;
        }
    
        public int getPerimeter() {
            int Perimeter = (length + width) * 2;
            return Perimeter;
        }
    
        public int getArea() {
            int Area = length * width;
            return Area;
        }
    }
    
    class Circle {
        private int radius;
        double Pi = 3.14;
    
        public Circle(int r) {
            radius = r;
        }
    
        public double getPerimeter() {
            double Perimeter = 2 * Pi * radius;
            return Perimeter;
        }
    
        public double getArea() {
            double Area = Pi * radius * radius;
            return Area;
        }
    }

     

    实验结果:

     

     四、实验总结

             本次实验有好几个书上的例子,通过学习代码,理解用户自定义类的定义;掌握对象的声明; 学会使用构造函数初始化对象;使用类属性与方法的使用掌握使用;稍微掌握package和import语句的用途。

    写代码的过程中有很多问题,有的代码可以看懂,但自己写的时候问题依旧很多,希望在今后的学习中可以提高这方面的能力。

  • 相关阅读:
    EOJ 2743 Stock Exchange
    POJ-3468 A Simple Problem with Integers
    EOJ-1104 bitmap
    【转】旋转卡壳——凸多边形间对踵点对(定义)
    Ring 3层枚举进程的四种方法
    XX-Net项目,免费浏览谷歌的伟大项目
    浅析Java中的内存机制
    Ubuntu下eclipse中安装Scala插件
    注入(5)---导入表注入(HookINT)
    Linux下MySQL导入文件出错ERROR 1290 (HY000)
  • 原文地址:https://www.cnblogs.com/hanlamei/p/9704041.html
Copyright © 2020-2023  润新知