java 第三次作业

《Java技术》第三次作业

(一)学习总结

1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
封装性是面向对象的第一大特性,所谓的封装性就是指对外部不可见,也就是说把代码封装到大括号中,只能访问自己内部的数据,外边的东西访问不了.
实现封装性的方法
属性封装:private 属性类型 属性名;
方法封装:private 方法返回值 方法名称(参数){}
例如

class Data {
	private String year;
	private String month;
	private String day;
}

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

class A{
	private int secret = 5;
}
public class Test{
	public static void main(String args[]){
		A a = new A();
		System.out.println(a.secret++);
	}
}

不能编译通过,secret被封装,不能被类外访问。
(2)

public class Test{
	int x = 50;
	static int y = 200;
	public static void method(){
		System.out.println(x+y);
	}
	public static void main(String args[]){
		Test.method();
	}
}

不能通过编译,static声明的方法不能调用非static类型声明的属性
3 . 使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出了测试类代码和Book类的部分代码,将代码补充完整。

class Book{
	private static int bookId;
	private String bookName;
	private double price;
	// 声明静态变量
	static int totalBook;
	//定义静态代码块对静态变量初始化
    static {
	    totalBook=0;
	    bookId=1000;
    }
	//构造方法
	public Book(String bookName,double price){
		this.bookName=bookName;
		this.price=price;
		totalBook++;
	}
	
 	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() {
		return totalBook;
	}

	//重写toString方法
	public String toString(){
		return "编号:"+Book.bookId+++"  书名:"+this.bookName+"  价钱"+this.price ;
	}
}
public class Test2{
	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());
		}
	}   
}

4.什么是单例设计模式?它具有什么特点?用单例设计模式设计一个太阳类Sun。
单例设计模式师确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例
2,自己创建这个实例
3,整个系统都要使用这个实例
太阳类

public class Sun {
	private Sun() {
	}
	private static final Sun single = new Sun();
	// 静态工厂方法
	public static Sun getInstance() {
		return single;
	}
}

5.理解Java参数传递机制,阅读下面的程序,运行结果是什么?说明理由。

public class Test {
	String str = new String("你好  ");
	char[] ch = { 'w','o','l','l','d' };
	public static void main(String args[]) {
		Test test = new Test();
		test.change(test.str, test.ch);
		System.out.print(test.str);
		System.out.print(test.ch);
	}
	public void change(String str, char ch[]) {
		str = "hello";
		ch[0] = 'W';
	}
}

运行结果:你好 Wolld
理由:字符串的内容一旦声明是不可改变的,改变的只是其内存地址的指向,只是在栈内存中多了一个指针,改变的是堆内存的指向。而字符数组的内容可以改变。

(二)实验总结

1.日期类

  • 程序设计思路:定义一个日期类,把year、month、day封装,用setter和getter得到。编写toString方法,输出格式为xxxx-xx-xx。定义一个职工类,把职工号、姓名、性别进行封装,用setter和getter得到,生日和参加工作时间调用日期类的toString方法,编写toString方法,输出以上信息。一个员工属于一个部门,在员工类中保存部门信息。定义一个部门类,把部门编号、部门名称进行封装,用setter和getter得到。一个人部门有一个经理,所以应在部门中保存经理信息。一个部门有多名员工,在部门中用对象数组保存多名员工的信息。编写测试类,产生独立对象并实例化,可以用对象数组,设置部门和部门经理的关系,设置员工和部门的关系,设置员工和日期的关系,调用各个类的toString方法进行输出。

2.计算工具

  • 程序设计思路:编写一个计算类,把半径、高、母线、体积、表面积进行封装,用setter和getter得到。编写一个测试类,产生独立对象并实例化(给出几个不同的圆柱体、圆锥体和球体的尺寸),可以用对象数组,将得到的体积和表面积分别加起来,求累加和。在再该测试类中随机产生三个float型的数,让用户分别求出圆柱体、圆锥体和球体的体积和表面,并调用计算类,判断用户的回答正确与否。

  • 实验问题分析:
    问题1:不会随机产生大于1的float型的数
    解决方案:先随机产生一个0到100之间的int型的数,再乘以0.1。

(三)代码托管

  • 码云commit历史截图

(四)学习进度条

代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
目标 5000行 300小时
第2-4周 100/100 20/20 学习了数组和方法
第5周 200/300 30/50 学习了String类和StringBuffer类
第6周 800/1100 40/90 学习了this、static关键字,Singleton模式
posted @ 2017-04-05 23:36  .M  阅读(201)  评论(2)    收藏  举报