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("\nTesting 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("\nTesting 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语句的用途。

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

猜你喜欢

转载自www.cnblogs.com/hanlamei/p/9704041.html