《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{ ...},导入import java.math.BigDecimal;import java.util.Arrays;俩个数据包。

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;
      	}
    

(三)代码托管

(链接:https://git.oschina.net/hebau_cs15/Java-CS01lxz)

posted @ 2017-04-06 14:01  刘晓昭  阅读(785)  评论(2)    收藏  举报