201871010108-高文利《面向对象程序设计(java)》第四周学习总结

项目

内容

这个作业属于哪个课程

<任课教师博客主页链接>

https://www.cnblogs.com/nwnu-daizh/

这个作业的要求在哪里

<作业链接地址>

https://www.cnblogs.com/nwnu-daizh/p/11552848.html

作业学习目标

 

  1. 掌握类与对象的基础概念,理解类与对象的关系;
  2. 掌握对象与对象变量的关系;
  3. 掌握预定义类DateLocalDate类的常用API
  4. 掌握用户自定义类的语法规则,包括实例域、静态域、构造器方法、更改器方法、访问器方法、静态方法、main方法、方法参数的定义要求;(重点、难点)
  5. 掌握对象的构造方法、定义方法及使用要求;(重点);
  6. 理解重载概念及用法;
  7. 掌握包的概念及用法;

 

第一部分:总结第四章理论知识

一.1.类:类是构造对象的模板。类定义了一组对象所能拥有的数据和能完成的操作。

每个类由一组结构化的数据(实例域:对象中的数据)和在其上的一组操作构成(方法)。

类是构造程序的基本单元。

2.对象:三个主要特性:行为(可以对对象施加的操作和方法)、状态(施加方法时,对象的响应)、标识(辨别具有相同行为和状态的不同对象)。

3.识别类:过程化程序设计,必须要从顶部的main函数开始编写程序。

Oop:首先从设计类开始,然后往每一类中添加方法。

识别类的简单方法:分析问题的过程中寻找名词,而方法对应着动词。

4.类与对象的关系:

 5.类之间的关系:依赖(如果一个类的方法操纵另一个类的对象,就说一个类依赖另一个类)、聚合(类A的对象包含类B的对象)、继承(一个一般类和一个特殊类之间的关系。若类A继承类B,那么类A不仅继承类B的方法和状态,还有属于自己的方法和状态)。

二.预定义类:使用预定义需要在程序开始时使用import命令导入该类所在的包路径。

1.00P中,要想使用对象,需先构造对象,并初始化对象状态,然后通过对像调用类中的方法。Java中,用构造器构造并初始化对象。构造器是类中一个特殊方法,该方法名与类名相同。

构造并初始化对象的格式:new  构造器名(参数)

2.对象初始化示例(Date类:定义在Java标准类库的java.util包内)

初始化Date类对象:

new Date();
System.out.println(new Date());

可以将类中一个方法用于新创健的对象:
String S new Date().toString();

3.对象变量:若想多次使用初始化的对象,可将初始化后的对象存放在一个对象变量中。Data birthday=new Data();

对象变量保存了对象后,可用对象变量引用对象,例如:

System.out.println (birthday.toStrine());

可将一个对象变量设置为null。

4.LocalDate类:(最新的日历类,位于Java.time包)。

5.更改器方法和访问器方法:

更改器方法:一个类中对实例域进行修改的方法,通常更改器方法名前缀为set。( Gregorian Calendar类的setTime方法,用来设日历对象所表示的时间点)

访问器方法: -个类中对实例域进行访问的法,通常访问器方法名前缀为get。(LocalDate类的getYear ( )方法,用来返回实例对象的年份)

三:用户自定义类:类的定义包含:声明和类体(实例域定义(成员变量),方法定义)。

1.域的定义:

实例域(整个类内都有效):类定义时实例域部分所定义的变量。

局部变量(只在定义它的方法内有效):方法体中定义的变量和方法的参数。

局部变量和实例域名字相同时,则实例域被隐藏,即在这个方法内暂时失效。

2.私有实例域的访问器和更改器:

获得或设置私有实例域的值:一个私有的数据域;一个公有的域访问器方法;一个公有的域更改器方法。(改变该类的内部实现后,除了该类的方法外,不会影响其他代码;更改器方法可以执行错误检查,然后对域直接赋值)

3.Final实例域:此类域构建对象时必须初始化。该域无更改器。

Final修饰符多用于不可变类的域(类中的每个方法都不会改变其对象,例如String类)。

4.方法的定义:方法声明(名字、类型、参数等属性的说明)和方法体(局部变量定义和java语句)。

方法的类型描述的是返回值类型,无返回值时类型为void

重载:一个类中可以有多个方法具有相同的名字,不同的类型,不同的参数(参数的不同体现在类型和个体的不同)

5.构造器(构造方法):用于构造并初始化对象

构造器的名字必给与它在的类名字相

每个类可以有一个以 上的构造器

构造器可以有0、11个以上的参数

构造器没有返回

构造器总是被new算符调用.

6.基于类的访问权限:类中方法可以访问所属该类对象的私有数据。

四.静态域和静态方法:

1.静态域:用static修饰的域。对于静态域,每个类中只有一个这样的域,类的私有对象都公用该域。2.

静态常量:在Math类中定义一个静态常量Math.PI

Public class Math{

 Public static final double PI=3.14159265;

}

System.out:

Public class System{

 Public static final PrintStream out=.....;

}

3.静态方法:用static修饰的方法。可通过类名或对象来调用,而其他方法只能通过对象来调用。静态方法不能操作对象,不能在静态方法中访问实例域。但可以访问自身类中的静态域。静态方法没有this参数的方法。

使用静态方法:

一个方法不访问对象状态.其所需参数都是数提供Math.pow();

一个方法只需要访问类的静态域(Employee.getNextId;

4.main方法(静态方法):启动程序后,静态main方法将执行并创建程序所需对象。

每个类只能有一个main方法。

5。方法参数:

传递:值调用:表示函数接受的时调用着提供的值。

引用调用:函数接收的时调用者提供的地址。

方法可以修改传递引用所对应的变量值,而不能修改彻底的值调用所对应的变量值。

Java中方法参数共有两种类型:基本数据类型(数值、布尔值)、对象。

对象作为参数,可以修改对象的具体状态。

Java方法参数的使用情况:

个方法不能修收一 个基本数据类型的参数(即数值和布尔型):

个方法可以改变一一个对象参数的状态:

一个方法不能实现让对象参效引用一个新的对象。

五. 对象构造:

1.对象的定义:只有通过对象才可以访问该类的公有实例域、调用类中公有的方法。

定义对象包括对象的声明和创建对象。

对象的声明:类的名字   对象名字;

创建对象:为声明的对象分配内存,用new运算符和构造方法为对象分配内存。

2.类定义的变量中含有静态变量时,该类所有对象的静态变量都共用同一个存储单元。

如果在构造方法中没有明确地给某个字段赋值,那么此字段会被自动赋值一个默认值。(数值型:0,布尔型:false,对象引用:null

3.无参数的构造器:当对象由无参数构造器创建时,其状态会被设置为是的的默认值。

 如果编写了一个没有构造器的类。则系统会自动为谈类提供个无参数的构造器。其名字为奖名。无参,方法体为空。该构造器将对象的实例城设量为默认值。

如果类中提供了至少一个构造器。但没有提供无参数的构造器。则在构造对象如果没有提供构造参数就会被视为不合法.

4。显示域初始化:由于类的构造器的重载,可以使用多种形式设置类的实例域的初始状态不管怎样调用构造器,每个实例域都可以被设置为一个有意义的初值。

在类定义中,可直接将一个常数赋给一个域。

5.初始化块:实例域初始化:在构造器中设置值;声明的同时赋值;用初始化块。

6.不管哪个构造器初始化对象,初始化块首先被运行,然后构造器的主体部分被执行。

7.可以为任何一个类添加finallize方法,该方法将在垃圾回收器清除对象之前调用。

8.包:Java通常把多个类放在一起,形成一个包。使用包的主要原因是确保类名的唯一性。

类的导入:一个类可以直接使用它所在包中的所有类,也可以用来自其他包中的所有public类。

访问其他包中的类的方法:类名前加上完整的包名。

利用import语句导入特定的类(常用)。

9.静态导入:import语句不仅可以导入类,还可以导入静态方法和静态域的功能。

10.把类放入包中:首先用package语句指明包的名字,且为程序的第一条语句,然后才是定义类的语句。如果源文件中不使用package语句指明包名,源文件的类将属于默认包。

个源文件中使用了package语句时,那么这个包中所有的类文件都必须放在与包名相匹配的子录中。

11.包作用域:类中标记为public的部分可以被任意类使用

类中标记为private的部分只能在类内使用

  如果没有为类、方法或实例域指定访问控制修饰符publicprivate.这部分可以被同包中的所有方法访问.

如果实例城不标记为pivate,将默认为包可见,但这样做会破坏类的封装性

12.类路径:类存储在文件系统的子目录中,类的路径必须与包名匹配。

Java中类路径包括:

基目录: /hoe/user/c1assdir或c:\c1asses;

JAR文件: /home/user/archi ves/archive. jarc:\archives .archive. jar.

在命令行方式下,设置类路径,使用- classpath<-cp>选项指定类路径。

 第二部分:实验部分

实验名称:实验三 类与对象的定义及使用

1.  实验目的:

(1) 熟悉PTA平台线上测试环境;

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

(3) 掌握对象的声明;

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

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

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

3. 实验步骤与内容:

实验任务110分)

 

import java.util.Scanner;

public class shengfenzheng {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("Input shengfenzheng:");
	    String shengfenzheng = in.nextLine();
	    String year=shengfenzheng.substring(6,10);
	    String month=shengfenzheng.substring(11,12);
	    String day=shengfenzheng.substring(13,14);
	    System.out.print(year+"-"+month+"-"+day);
	}

}

 

  

 

 

 

实验任务225分)

 

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class pai {
	private static Student students[];
	public static void main(String[] args) {
		students=new Student[50];
		Scanner in = new Scanner(System.in);
		try {
			readFile("studentfile.txt");
			System.out.println("请选择操作,1按姓名,2按学号,3退出");
			int i;
			while ((i = in.nextInt()) != 3) {
				switch (i) {
				case 1:
					System.out.println("请输入姓名");
					String name = in.next();
					Student student = findStudentByName(name);
					if (student == null) {
						System.out.println("没找到");
					} else {
						System.out.println(student.toString());
					}
					System.out.println("请选择操作,1按姓名,2按学号,3退出");
					break;
				case 2:
					System.out.println("请输入学号");
					String id = in.next();
					Student student1 = findStudentById(id);
					if (student1 == null) {
						System.out.println("没找到");
					} else {
						System.out.println(student1.toString());

					}
					System.out.println("请选择操作,1按姓名,2按学号,3退出");
					break;

				default:
					System.out.println("输入有误");
					System.out.println("请选择操作,1按姓名,2按学号,3退出");
					break;
				}

			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}finally {
			in.close();
		}

	}

	public static void readFile(String path) throws IOException {
		FileReader reader = new FileReader(path);
		BufferedReader br = new BufferedReader(reader);
		String result;
		int i=0;
		while ((result = br.readLine()) != null) {
			Student student = new Student();
			student.setName(result.substring(13));
			student.setID(result.substring(0,12));
			students[i]=student;
			i++;
		}
		br.close();
	}

	public static Student findStudentByName(String name) {
		for (Student student : students) {
			if (student.getName().equals(name)) {
				return student;
			}
		}
		return null;

	}

	public static Student findStudentById(String Id) {
		for (Student student : students) {
			if (student.getID().equals(Id)) {
				return student;
			}
		}
		return null;

	}
}

class Student {
	private String name;
	private String ID;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getID() {
		return ID;
	}

	public void setID(String iD) {
		ID = iD;
	}

	@Override
	public String toString() {
		// TODO 自动生成的方法存根
		return "姓名是:" + name + "学号是:" + ID;
	}
}

 

  

 

 

 

实验2  测试程序110分)

 

import java.time.*;
/**
 * This program tests the Employee class.
 * @version 1.13 2018-04-10
 * @author Cay Horstmann
 */
public class EmployeeTest
{
   public static void main(String[] args)
   {
      // 用Employee对象填充数组
      Employee[] staff = new Employee[3];

      staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15);
      staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
      staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15);

      // 给每个人的薪水增加5%
      for (Employee e : staff)//for each 循环
         e.raiseSalary(5);

      // 输出每个员工的基本信息
      for (Employee e : staff)
         System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay=" 
            + e.getHireDay());
   }
}

class Employee//定义Employee类
{
   private String name;//私有实例域的定义
   private double salary;
   private LocalDate hireDay;

   public Employee(String n, double s, int year, int month, int day)
   {
      name = n;
      salary = s;
      hireDay = LocalDate.of(year, month, day);
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public LocalDate getHireDay()
   {
      return hireDay;
   }

   public void raiseSalary(double byPercent)
   {
      double raise = salary * byPercent / 100;
      salary += raise;
   }
}

 

  

 

 

package json;
 
import java.util.Scanner;
 
public class Student
{
    public static void main(String[] args)
    {
        Employee[] staff = new Employee[3];
        System.out.println("请输入学生:");
        Scanner in = new Scanner(System.in);
        for(int i=0;i<staff.length;i++) {
            staff[i]=new Employee(in.next(),in.next(),in.nextInt());
        }
        System.out.println("name"+" "+"sex"+" "+" "+"javascore");
        for (Employee e : staff)
            e.raiseSalary(5);
     
        for (Employee e : staff)
            System.out.println(e.getName() +"   "+e.getSex()+"        "+e.getJavascore());
        
    }
}
 
class Employee
{
   private String name;
   private String sex;
   private int javascore;
   public Employee(String a, String b, int c)
   {
       name = a;
       sex = b;
       javascore = c;
   }
   public void raiseSalary(int i) {

   }
   public String getName()
   {
       return name;
   }
   public String getSex()
   {
       return sex;
   }
   public int getJavascore()
   {
       return javascore;
   }
}

  

 

实验2  测试程序25分)

 

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

 

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

 

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

 

 

/**
 * This program demonstrates static methods.
 * @version 1.02 2008-04-10
 * @author Cay Horstmann
 */
public class StaticTest
{
   public static void main(String[] args)
   {
      // 用Employee对象填充数组 
      var staff = new Employee[3];

      staff[0] = new Employee("Tom", 40000);
      staff[1] = new Employee("Dick", 60000);
      staff[2] = new Employee("Harry", 65000);

      // 使用for each循环输出每个成员信息
      for (Employee e : staff)
      {
         e.setId();
         System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
            + e.getSalary());
      }

      int n = Employee.getNextId(); //调用静态方法
      System.out.println("Next available id=" + n);
   }
}

class Employee //定义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; // 将id设置为下一个可用id
      nextId++;
   }

   public static int getNextId()
   {
      return nextId; //返回静态域
   }

   public static void main(String[] args) // unit test
   {
      var e = new Employee("Harry", 50000);
      System.out.println(e.getName() + " " + e.getSalary());
   }
}

 

  

 

 

实验2  测试程序35分)

 

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

 

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

 

 

/**
 * This program demonstrates parameter passing in Java.
 * @version 1.01 2018-04-10
 * @author Cay Horstmann
 */
public class ParamTest
{
   public static void main(String[] args)
   {
      //该方法无法修改数值参数
      System.out.println("Testing tripleValue:");
      double percent = 10;
      System.out.println("Before: percent=" + percent);
      tripleValue(percent);
      System.out.println("After: percent=" + percent);

      //该方法可以改变对象参数的状态
      System.out.println("\nTesting tripleSalary:");
      var harry = new Employee("Harry", 50000);
      System.out.println("Before: salary=" + harry.getSalary());
      tripleSalary(harry);
      System.out.println("After: salary=" + harry.getSalary());

      //该方法可以将新对象附加到对象参数
      System.out.println("\nTesting swap:");
      var a = new Employee("Alice", 70000);
      var 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) //无法工作
   {
      x = 3 * x;
      System.out.println("End of method: x=" + x);
   }

   public static void tripleSalary(Employee x) // 工作
   {
      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 // 定义Employee类
{
   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;
   }
}

 

  

 

 

实验2  测试程序45分)

 

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

 

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

 

 

import java.util.*;

/**
 * This program demonstrates object construction.
 * @version 1.02 2018-04-10
 * @author Cay Horstmann
 */
public class ConstructorTest
{
   public static void main(String[] args)
   {
      //用Employee对象填充数组
      var staff = new Employee[3];

      staff[0] = new Employee("Harry", 40000);
      staff[1] = new Employee(60000);
      staff[2] = new Employee();

      // 使用for each循环输出每个成员信息
      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 = ""; // 实例域初始化
   private double salary;
  //静态域初始化
   
   static
   {
      var generator = new Random();
      // 通过随机数产生nextId的值
      nextId = generator.nextInt(10000);
   }

   // 对象域的初始化
   {
      id = nextId;
      nextId++;
   }

   //三个重载构造函数
   public Employee(String n, double s)
   {
      name = n;
      salary = s;
   }

   public Employee(double s)
   {
      // calls the Employee(String, double) constructor
      this("Employee #" + nextId, s);
   }

   // 默认构造函数
   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;
   }
}

 

  

 

实验2  测试程序45分)

 

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

 

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

import com.horstmann.corejava.*;
// 把Employee类定义在包内

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
      var 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());
   }
}

  

  

 

package com.horstmann.corejava;

//这个文件中的类是是这个包的一部分

import java.time.*;

// import语句位于package语句之后

/**
 * @version 1.11 2015-05-08
 * @author Cay Horstmann
 */
public class Employee
{
   private String name;
   private double salary;
   private LocalDate hireDay;

   public Employee(String name, double salary, int year, int month, int day)
   {
      this.name = name;
      this.salary = salary;
      hireDay = LocalDate.of(year, month, day);
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public LocalDate getHireDay()
   {
      return hireDay;
   }

   public void raiseSalary(double byPercent)
   {
      double raise = salary * byPercent / 100;
      salary += raise;
   }
}

  

 

4. 实验总结:

实验一的第二个实验有些难,写不出来,但通过助教的讲解,还是懂了好多。通过后面的几个实验,学会了类,对象,访问器等知识。通过查书本,看ppt,以及网上资源,由刚开始的不懂,最后还是慢慢理解了。有些程序是通过借鉴以及查阅书籍等工具写出来的,希望以后可以自己写出这些程序。

猜你喜欢

转载自www.cnblogs.com/gwlg/p/11563333.html