《Java》第三次作业
《Java》第三次作业
(一)学习总结
1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
- 面向对象具有三大特征:封装型、继承性、多态性。
- 封装就是将接口和实现细节分离开来的过程。一般来说,接口是不会轻易改变的,但是实现细节可能由于各种原因发生变化,封装就起到在变与不变之间划界限的作用。
- Java中封装也就是隐藏对象的属性和实现细节,仅对外提供公共访问方式。
例如将A类的属性修饰符设置为private,这是为了更好的封装数据。要想在B类里引用该属性,就可以在A类里定义修饰符为public的setter、getter方法以设置和获取private型的属性值。

2.阅读下面程序,分析是否能编译通过?如果不能,说明原因。
(1)

不能编译通过,因为属性secret被设置为私有的,如果想引用secret,则需要用到setter,getter方法。

(2)

不能编译通过,x为非静态变量,而y用static声明为静态变量,不能让一个静态变量引用非静态变量。

3.使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出了测试类代码和Book类的部分代码,将代码补充完整。
public class Test {
public static void main(String args[]){
Book[] books = {new Book("c语言程序设计",29.3),
new Book("数据库原理",30),
new Book("Java学习笔记",68)
};
System.out.println("图书总数为:"+ Book.totalBook());
for(Book book:books){
System.out.println(book.toString());
}
}
}
class Book{
int bookId;
String bookName;
double price;
static int booksum; // 声明静态变量
static{
booksum=1000; //定义静态代码块对静态变量初始化
}
public Book(String bookName,double price){
this.bookName=bookName;
this.price=price;
bookId=booksum;
booksum++;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public static int totalBook(){ //定义方法求总数
booksum=booksum-1000;
return booksum;
}
public String toString() { //定义toString方法返回
return "图书编号为:" + bookId + ", 图书书名为:" + bookName + ", 图书价格为:" + price;
}
}

4.什么是单例设计模式?它具有什么特点?用单例设计模式设计一个太阳类Sun。
单例设计模式就是要保证一个类在使用过程中,只有一个实例
特点:
- 1、单例类只能有一个实例。
- 2、单例类必须自己创建自己的唯一实例。
- 3、单例类必须给所有其他对象提供这一实例。
饿汉式
public class Sun {
//在类初始化时,已经自行实例化
private Sun(){
}
private static final Sun sun=new Sun();
//自行实例化,构造方法限定为private避免了类在外部被实例化
public static Sun getlnstance(){
return sun;
}
//静态工厂方法,唯一的实例只能通过getlnstance()方法访问。
}
懒汉式
public class Sun {
private Sun(){
}
private static Sun sun=null;
public static Sun getlnstance(){
if(sun==null){
Sun=new Sun();
}
return sun;
}
}
5.理解Java参数传递机制,阅读下面的程序,运行结果是什么?说明理由。

在change()方法中是对str和ch[]的引用,因为str用String声明,所以其内容不会改变。虽然change()方法中改变它的值,其实是堆内存中增加了“Hello”的内存地址,但是函数返回的时候仍指向原地址。其实参数传递就是方法调用过程中,调用者将参数传递给被调用者的过程。
6.其他总结
(1)Java中参数传递时,一般存在两种参数传递的规则
- 按值传递
按值传递指每次传递参数时,把参数的原始数值拷贝一份新的,把新拷贝出来的数值传递到方法内部,在方法内部修改时,则修改的是拷贝出来的值,而原始的值不发生改变。
- 按址传递
按址传递指每次传递参数时,把参数在内存中的存储地址传递到方法内部,在方法内部通过存储地址改变对应存储区域的内容。由于在内存中固定地址的值只有一个,所以当方法内部修改了参数的值以后,参数原始的值发生改变。
(2)单例类总结
- 1、构造函数需要标记为private,单例类不能在其他类中实例化,只能被其自身实例化;
- 2、拥有一个保存类的实例的静态成员变量
- 3、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)
(二)实验总结
一.部门职工系统
程序设计思路:
1.
(1)设计一个日期类,用于记录年、月、日,提供对日期处理的常用方法(日期输出格式xxxx-xx-xx)。
(2)设计一个职工类,该职工类至少具有下面的属性:职工号,姓名,性别,生日,工作部门,参加工作时间,设计相应的方法。
(3)设计一个部门类,包括下列属性:部门编号,部门名称,经理,设计相应方法。
(4)设计一个测试类,采用对象数组模拟一个拥有两个部门,10个职工的单位,实现对相关信息的查询功能。
2.
根据一个部门有一个或零个经理,一个部门有多名员工,以及一个员工属于一个部门关系把部门类,职工类,日期类联系到一起。实现整个系统。
3.
实例十个对象,两个部门,建立部门与员工对象及其生日的联系,打印输出。
-
问题一:开始不清楚具体类中应该定义哪几个变量为私有属性,以及封装的意义,
-
解决方法:认真看了PPT上的相关内容
-
问题二:在测试类Test中,没有深刻理解员工和部门之间的联系,以致打印总是出问题。
-
解决方法:参考讲义内容理解了
//产生独立对象 Dept dept=new Dept(01,"技术部"); Employee emp1=new Employee(1001,"王华",24); Employee emp2=new Employee(1002,"张明",45); Employee emp3=new Employee(1003,"李林",28); //设置部门和部门经理的关系 dept.setManager(emp2); //设置员工和部门的关系 emp1.setDept(dept); emp2.setDept(dept); emp3.setDept(dept); dept.setEmps(new Employee[]{emp1,emp2,emp3});
二.计算类
程序设计思路
1.
新建Figure类,引用Math.*数据包,定义相应的计算方法
2.
对数据处理
public static double round(double d,int len){
// 进行四舍五入
BigDecimal b1=new BigDecimal(d);
BigDecimal b2=new BigDecimal(1);
// 任何一个数字除以1都是原数字
// ROUND_HALF_UP是BigDecimal的一个常量,
return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue();
3.
在模拟考试Test1中,调用import java.util.Scanner;import java.util.Random;使系统产生随机数。
while()
{
switch()
{
case...
}
}
-
问题:程序不能按照提示信息退出循环
-
原因:对while循环理解不透
-
解决方法:
System.out.println("2-圆柱体的计算:"); System.out.println("3-圆锥的计算:"); System.out.println("4-退出程序:"); . . . case 4: flag=false; System.out.println("程序已退出"); break; default:System.out.println("输入错误,请重新输入:");}
三.评分系统
程序设计思路
1.
新建Person类,按照ppt使用接口函数class Person implements Comparable
2.
定义私有属性封装起来,按照之前写过的程序定义几个方法。
3.
定义一个数据处理方法对数据进行四舍五入。
4.
主方法中仍然是俩个for循环嵌套使用,最后循环输出结果。
-
问题一:对this.max与Max(score)分辨不清
-
原因:对程序执行过程以及this的用法理解不清楚
-
解决:通过实际操作,以及改错提示信息,二者得到的结果是一样的
-
问题二:在程序执行时最大值可以准确无误的输入,然而最小值为0。
-
原因:由于粗心,初始化score[]=0,忽略了Max()可以使max=score[0];而Min()却不能这样用, 如果这样用min==0。
-
解决:
public double Min(double[] score) { min=this.max; for(int i=0;i<score.length;i++){ if(score[i]<min){ this.min=score[i]; } } return min; }
