java作业3
(一)学习总结
1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
封装性就是将不愿意让其他人看见的属性封装起来,用setter方法和getter方法进行访问和修改。
class person{
private int age;
public void setterAge(){
if(age>0&&age<150)
this.age=age;
}
public int getterAge(){
return this.age;
}
}
2.阅读下面程序,分析是否能编译通过?如果不能,说明原因。
class A{
private int secret = 5;
}
public class Test{
public static void main(String args[]){
A a = new A();
System.out.println(a.secret++);
}
}
不能通过编译,因为A类中的属性用private封装,不能直接访问和修改。
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{
static int bookId=1000;
String bookName;
double price;
// 声明静态变量
static int sum;
//定义静态代码块对静态变量初始化
static{
sum=0;
}
//构造方法
public Book(int bookId,String bookName,double price){
this.bookName=bookName;
this.price=price;
bookId++;
}
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;
}
//定义方法求图书总册数
static void inc(){
sum++;
}
//重写toString方法
public String toString(){
return "书号"+this.getBookId()+"书名+"this.getBookName+"价格"+this.getprice();
}
}
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());
}
}
}
4.什么是单例设计模式?它具有什么特点?用单例设计模式设计一个太阳类Sun。
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一类只有一个实例而且该实例易于外界访问,从而达到使用目的(如windows操作系统中,任务管理器只能打开一个--主要目的),同时还能方便对实例个数的控制并节约系统资源(主要目的之外的好处)。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
懒汉式
public class Sun{
private static Sun instance=null;
public static Sun getInstance()
{
if(instance==null)
{
synchronized(Sun.class)
{
if(instance==null)
instance=new Sun();
}
}
return instance;
}
private Sun(){
}
}
饿汉式
public static class Sun{
private static final Sun instance = new Sun();
private Sun(){
}
public static Sun getInstance(){
return instance;
}
}
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';
}
}
运行结果是 你好 World
ch[]储存到栈内存内,其地址被change引用,首元素ch[0]被改变为‘W’;用String声明的不可更改,所以输出的还是"你好",如果想改变的话,可以用Stringbuffer类。
(二)实验总结
1.部门职工
程序设计思路:先创建三个类,职工类,日期类,部门类,分别设置其属性以及相应的构造方法,在测试类中实例化,并进行关联操作。
2.设计计算工具类
程序设计思路:先创建一个计算类,类中有求球、圆柱、圆锥的体积和表面积的方法。然后创建两个测试类,第一个测试类是构造几个球,圆柱和圆锥,求出其体积和表面积。第二个测试类是模拟考试,让选手计算球,圆柱,圆锥的体积和表面积。
问题:所求出的结果有好多位小数。
解决方案:DecimalFormat df= new DecimalFormat("0.0");
再用format方法就可保留两位小数。
3.评分系统
程序设计思路:与上次作业留的评分系统思路基本一致,就是得用面向对象方法写,然后再加上对对象的排序。对象的排序基本方法如下:
public int compareTo(Player o) {
if (this.sum1 > o.sum1) {
return 1;
}
else if (this.sum1< o.sum1) {
return -1;
}
else {
return 0;
}
}
问题:并未进行排序
解决方案:我在输出方法中输出了sum的值,结果发现了值为0,然后我发现了只有调用了avg函数,才能给sum赋值,所以我在测试类中增加了调用setsum1函数的功能,使sum1有了值,才能排序。
4.猜拳游戏
程序设计思路:此程序创建一个测试类和三个基本类——电脑类,选手类,游戏类。电脑类和选手类基本一致,只不过电脑类需要自动出拳,所以要增加随机函数。这两个类都需要静态声明score,每当选手或者电脑获胜时,都应该增加相应的分数。游戏类的作用就是初始化界面,规定游戏规则。在测试类中直接初始化游戏类即可开始游戏。

浙公网安备 33010602011771号