《Java技术》第三次作业
(一)学习总结
1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
面向对象的封装性有两个含义,一是指把对象功能的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单位(对象)中。另一层指信息隐蔽,把不需要让外界知道的信息隐藏起来。封装性还有一个特点,为封装在一个整体内的变量及方法规定不同等级的“可见性”或访问权限。
例如:
class Datetime {
int year;
int month;
int day;
public void show(){
System.out.println(year+"年"+month+'月'+day+'日');
}
}
public class test {
public static void main(String args[]){
Datetime date=new Datetime();
date.year=2017;
date.month=-4;
date.day=1;
date.show();
}
}
结果为: 2017年-4月1日
月份为-4,在现实中是不合法的,但是系统中是没有问题的。为了避免这种错误发生我们加入属性封装(private),保证是私有数据不可以随便访问。要想访问私有数据,我们需要在类里面加入set和get保证数据的读取。在setMonth处加入检查代码。
class Datetime {
private int year;
private int month;
private int day;
public void show(){
System.out.println(year+"年"+month+'月'+day+'日');
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month1) {
if(month1>0){
this.month = month;
}
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
}
public class test {
public static void main(String args[]){
Datetime date=new Datetime();
date.setYear(2017);
date.setMonth(-4);
date.setDay(1);
date.show();
}
}
结果: 2017年0月1日 因为设置的数值不正确,所以month为0.
2.(1)不正确,因为secret为私有数据,在main中不可以直接访问,需要set和get来实现调用,但是调用虽然成功了 ,无法实现++。将++改为+1即可。++对get是无效的。
class A{
private int secret = 5;
public int getSecret() {
return secret;
}
public void setSecret(int secret) {
this.secret = secret;
}
}
public class test{
public static void main(String args[]){
A a = new A();
System.out.println(a.getSecret()+1);
}
}
还可以直接将private改为static,把++改为+1.
class B{
static int secret = 5;
}
public class A{
public static void main(String args[]){
B a = new B();
System.out.println(a.secret+1);
}
}
(2)不正确,因为int x前没用static声明属性。Static属性为全局属性或静态属性。static既可以在声明属性时使用,也可以用来声明方法。
修改后:
public class A{
static int x = 50;
static int y = 200;
public static void method(){
System.out.println(x+y);
}
public static void main(String args[]){
A.method();
}
}
3.补全程序
class Book{
private int bookId;
private String bookName;
private double price;
// 声明静态变量
static int number;
//定义静态代码块对静态变量初始化
static void num(int number){
number=1000;
}
//构造方法
public Book(){
}
public Book(String bookName,double price){
this.bookName = bookName;
this.price = price;
bookId = number;
number++;
}
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 sumBook(){
int sum=-(number-1000);
return sum;
}
//重写toString方法
public String toString(){
return "图书编号 : " + bookId + " " + "图书名称 : "
+ this.bookName + " " + "图书价格 : " + this.price;
}
}
public class Text{
public static void main(String args[]){
Book[] books = {new Book("c语言程序设计",29.3),
new Book("数据库原理",30),
new Book("Java学习笔记",68)};
System.out.println("图书总数为:"+ Book.sumBook());
for(Book book:books){
System.out.println(book.toString());
}
}
}
4.单例设计模式
含义:在设计一个类时,需要保证在整个程序运行期间针对该类只存在一个实例对象。
方法一:
public class Sun{
private Sun(){
// 构造方法私有化(用private修饰)
}
public static Sun instance = new Sun();
// 在类内创建一个实例对象,用私有静态成员instance引用该对象。
public static Sun getInstance(){
return instance; // 定义静态方法getInstance()返回实例对象instance
}
}
方法二:
class Sun{
private Sun(){
// 构造方法私有化(用private修饰)
}
public static final Sun instance = new Sun();
//在类内创建实例对象,用静态成员instance来引用,public允许外部访问该变量,static只能用类名访问该变量,final禁止对该变量进行修改。
}
public class excise {
String str = new String("你好 ");
char[] ch = { 'w','o','l','l','d' };
public static void main(String args[]) {
excise test = new excise();
test.change(test.str, test.ch); //调用change方法里str与ch,所以输出的是你好 wolld
System.out.println(test.str);
System.out.println(test.ch);
}
public void change(String str, char ch[]) {
//change取得是str,ch[]的内容,在栈里有独立的空间,所以下面的str和w[0]的赋值覆盖不了str和w[]里的内容
str = "hello";
ch[0] = 'W';
}
}
结果是:
你好
Wolld
5.其他总结:
要记得构造无参方法,检查的时候要细心,按照自己的思路去检查,弄清楚每个类的关系,还有如何调用类,如何将参数放入类,什么时候需要定义参数什么时候不需要,以及在test中关系的连接,在调用函数的时候()不能少,一定要记得那个字母大写,那些字母小写。’.’也不能少,写第一个程序是参考做的太多,导致自己没有想法,test时错误太多,还把一些没有必要的参数放到emploee中,比如说部门。一定要记得,写完一个类测试一个类,不然到最后,错误太多不知从何处找。还有写第三题是数组比较,比较的属性,不能直接用方法得出的数。需要将方法的数给属性,最后比较数组中的属性。
(二)实验总结
- 按照下列要求完成类的设计
(1)设计一个日期类,用于记录年、月、日,提供对日期处理的常用方法(日期输出格式xxxx-xx-xx)。
(2)设计一个职工类,该职工类至少具有下面的属性:职工号,姓名,性别,生日,工作部门,参加工作时间,设计相应的方法。
(3)设计一个部门类,包括下列属性:部门编号,部门名称,经理,设计相应方法。
(4)设计一个测试类,采用对象数组模拟一个拥有两个部门,10个职工的单位,实现对相关信息的查询功能。
-
程序设计思路:
先编写的日期类,进行测试,再写员工类,再进行测试,最后写部门类,写完也进行测试。三个类没问题后,建立联系。 -
实验问题分析:
问题1:输入部门号无法输出所有员工信息
原因:没有将员工分进各个部门
解决方案:用数组将员工分入部门并输出if(dno2==dept1.getDno()){ for(int i =0 ;i<emps.length-5;i++){ System.out.println(emps[i]); } } else if(dno2==dept2.getDno()){ for(int i =5 ;i<emps.length;i++){ System.out.println(emps[i]); } } else{ System.out.println("部门号不存在!"); }问题2:在员工数组输入数据时类型配不上
原因:在员工表里擅作主张把部门号和部门名称加入
解决方案:在test中调用dept的对象即可,不需要把部门号和部门名称直接加入员工表。在构造函数中把Dept dept去掉。public Employee(int eno,String ename,String sex,Datetime birthday,int time){ this.eno = eno; this.ename = ename; this.sex=sex; this.birthday=birthday; this.time = time; }
2.设计一个计算工具类,要求:
(1)为用户提供几个常见的几何体面积和体积的算法(如球的体积和表面积,圆柱体的体积和表面积,圆锥体的体积和表面积)(可以学习使用static关键字)
(2)设计一个测试类,给出几个不同的圆柱体,圆锥体,球体的尺寸,用计算工具类分别求它们体积的累加和与表面积的累加和。
(3)设计一个测试类,随机产生球,圆柱、圆锥体的尺寸,模拟考试,要求用户回答它们的体积和面积,并判断用户的回答是否正确
-
程序设计思路:先建立tools类,将球、圆柱和圆锥的体积表面积的计算方法写到类中,再建立第一个测试类,测试体积的和、表面积的和。再建立一个测试类去测试玩家输入的体积面积。
-
实验问题分析:
问题1:无法将string类型和double类型进行转化。
原因: 没有好好把前面的强制转换看看
解决方案:String a = String.format("%.2f",area); double area = Double.parseDouble(a);
实验二中也用到了强制转换:
String str2=str.substring(1,2);
int a=Integer.parseInt(str1);
问题2:在游戏测试类中无法把随机数r,h,l放入计算体积、表面积的方法中。
原因: 在tools类中,方法都为无参的。所以不能直接将随机数放入。虽然在test中可以用,因为是把数组的值给函数,建立了关系,可以放入,而随机数不行。随机数的放入不能只是建立关系,还得有参数。
解决方案:重新修改tools类,test类,testgame类将无参的计算方法修改为有参的(向老师求助的)。
public double ballArea(double r);
public double ballVolume(double r);
public double cylinderArea(double r,double h);
public double cylinderVolume(double r,double h);
public double coneArea(double r,double l);
public double coneVolume(double r,double l);
问题3:无法直接在testgame类中直接进行double和string之间的转化
原因:无法在转换中中直接掉format,会提示数据错误,分开调用也会提示数据错误。
解决方案:将转换放入tools中,提示的错误会消失。例如下面的程序。
String v = String.format("%.2f",volume);
double volume = Double.parseDouble(v);
3.用面向对象编程思想完成评分系统(选做)
提示:创建一个选手类,基本属性:编号,姓名,得分,最终得分,定义方法计算最高分,最低分,最终得分。
在测试类中完成打分功能,每位选手打分完毕后输出:去掉一个最高分xx,去掉一个最低分xx, xx号选手xxx最终得分xxx
所有选手打分完毕后,按照最 m终得分降序输出选手信息。(选手编号,选手姓名,选手得分)
-
程序设计思路:在选手类Person把基本信息加入,然后创建方法算最大值最小值以及平均分,最后在test类中直接调用即可。
-
实验问题分析:
问题1:最后排序输出的时候分数都一样
原因: 比较的是方法中的值
解决方案: 询问老师后,才知道数组比较是用的是对象数组的属性。我需要再添加一个属性,将方法中计算的最终成绩给属性,再进行比较。
创建一个新的属性public double getEndScore() { return endScore; } public void setEndScore(double end) { this.endScore = end; //test中需要加入参数,所以将无参改为有参,第二道题也涉及到 }
将方法中的计算结果给这个属性
per[i].setEndScore(per[i].finalScore(score));
在进行数组中的属性比较
public int compareTo(Person o) {
if (this.endScore > o.endScore) {
return 1;
} else if (this.endScore < o.endScore) {
return -1;
} else {
return 0;
}
}
(三)[代码托管] https://git.oschina.net/hebau_cs15/cs01wmx.git
- 码云commit历史截图

(四)学习进度条
| 代码行数(新增/累积) | 学习时间(新增/累积) | 本周学习内容 | |
|---|---|---|---|
| 目标 | 5000行 | 300小时 | 自己写的代码中的知识点,看了一些课外的程序 |
| 第2-4周 | 400/400 | 40/40 | 课上讲的String类用法,温习了很多遍,写程序的时候也查了不少资料,对各种类型做了总结。 |
| 第5周 | 450/450 | 45/45 | 复习了上课讲的知识,并且在完成学习总结的时候查阅了很多资料去了解单列设计模式 等知识点,还将ppt上的程序打了一遍。 |
| 第6周 |
浙公网安备 33010602011771号