java第三次作业

java第三次作业

(一)学习总结

1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
封装:是将描述某类事物的数据与处理这些数据的函数封装在一起,形成一个有机整体(类)。
在java中有四大访问权限:public共有,private私有,protected保护,default默认 。

class Person { 
   private String name ; 
   private int age ; 
   static String university = "河北农业大学" ; 
   public Person(String name,int age){  
       this.name = name ; 
       this.age = age ; 
  } 
  public String toString(){ 
     return "姓名:" + this.name + ",年龄:" + this.age 
                                                     + ",学校:" +this.university  ; 
  } 
}
建立person类,管理private私有权限的姓名,年龄,且只能通过类的get、set方法,才能访问。 封装后,不可随意更改,可以用set,get方法赋值和调用
public class Test{  
	  public static void main(String args[]){ 
	    Person per1 = new Person("张三",20) ; 
	    Person per2 = new Person("李四",21) ; 
	    System.out.println(per1.toString()) ; 
	    System.out.println(per2.toString()) ; 
	    System.out.println("---------------------") ; 
	    Person.university = "华北农业大学" ; 
	    System.out.println(per1.toString()) ; 
	    System.out.println(per2.toString()) ; 
	  } 
	} 
	封装测试类进行赋值,调用。

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

不能,原因:
其一:公用类型 Test 必须在它自己的文件中定义,需另外新建立一个test类;其二:private为私有权限不能直接读取须创建secret的getter和setter并将其声明为默认或公有。

    public int getSecret() {
			return secret;
		}

	public void setSecret(int secret) {
		this.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();
    }
}

不能,原因:
x为非静态,应和y一致设为静态变量。

 static int x = 50;

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

class Book {
    //属性封装
    private int bookNum;
    private String bookName;
    private double price;

    // 声明静态变量
    private static int bookNumber;
    
    //定义静态代码块对静态变量初始化
    static {
        bookNumber = 1000;}
    
    
    //构造方法
    public Book(String bookName, double price) {
        this.bookName = bookName;
        this.price = price;
        bookNum=bookNumber;
      
        bookNumber++;
    }

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

    // 重写toString方法
    public String toString() {
		return "编号:" + bookNum + " 书名:" + this.bookName + " 价格:" + this.price;
    }
}

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。
(1),一个类有且仅有一个实例,并且自行实例化向整个系统提供。
(2),一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
(3)懒汉模式。用到时在建立这个模式。
设计一个太阳类Sun。

class Sun{
 private static Sun sun=null;
 public static Sun getsun()
 {
     if(sun==null)
     {
         synchronized(Sun.class)
         {
             if(sun==null)
                sun=new Sun();
         }
     }
     return sun;
 }

}

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

运行结果:

java只支持参数传值的机制, 即方法得到的是所有参数值的一个副本,方法不能修改传递给它的任何参数变量的内容。change调用的是str的副本,不能改变str的内容.

(二)实验总结

实验内容:
1.按照下列要求完成类的设计
(1)设计一个日期类,用于记录年、月、日,提供对日期处理的常用方法(日期输出格式xxxx-xx-xx)。
遇到的问题的解决:在调用参数之前,要在相关类中设一个函数并将在相关变量用this语句说明正在调用此变量。

 	 public Datatime(int year,int month,int day){
		this.year=year;
 	
		this.month=month;
 	
		this.setDay(day);
 	
	}

使用get和set将private私有权限设置中的变量进行读取。

 public int getyear(){return year;	}
    	public void setyear(int year){this.year=year;	}

(2)设计一个职工类,该职工类至少具有下面的属性:职工号,姓名,性别,生日,工作部门,参加工作时间,设计相应的方法。
(3)设计一个部门类,包括下列属性:部门编号,部门名称,经理,设计相应方法。
(4)设计一个测试类,采用对象数组模拟一个拥有两个部门,10个职工的单位,实现对相关信息的查询功能。
在给测试类中的employee员工employee emp1=new employee(1002," 八哥 "," 男 "," 1776-2-15 "," 技术部 "," 1997-3-8");赋值时要注意的问题是之前建立的类中所声明变量是什么类型的(int型的或string型的)要前后相对应。
调用dept相关部门是逐个设置并调用的。

emp1.setDept(dept1);

还有是要在员工和部门之间建立相关联系,如:部门dept1中有员工empt1,emp2,emp3,emp5,emp6,部门dept2中有员工emp7,emp8,emp9。这样使用数组来建立就方便多了。

dept1.setEmps(new employee[]{emp1,emp2,emp3,emp4,emp5,emp6});

dept2.setEmps(new employee[]{emp7,emp8,emp9,emp10});

使用for循环来逐次输出数组的相关信息

  System.out.println(dept1.getdname()+"员工:");

		for(int i=0;i<dept1.getEmps().length;i++){
			System.out.println(dept1.getEmps()[i]. toString());
			}

2.设计一个计算工具类,要求:
(1)为用户提供几个常见的几何体面积和体积的算法(如球的体积和表面积,圆柱体的体积和表面积,圆锥体的体积和表面积)(可以学习使用static关键字)
建立一个传参的函数,this用法调用相关的半径,高度和母线(涉及到圆锥中求表面积使用)

public SV(double r, double h,double l) {
 	
		this.r=r;
 	
		this.h=h;
 	
		this.l=l;
 	
		}

求球,圆柱和圆锥的体积和表面积的方法及公式的运用。

public double getS1(){

	return sqiu=4*3.14*r*r;

}

public void setS1(double sqiu){

	this.sqiu=sqiu;

}

最后要写出一个总的函数public String toSting(){}来调用。

public String toString(){

	return "半径:"+r+"高度:"+h+"母线:"+l+"球面积:"+sqiu+"圆锥面积:"+szhui+"圆柱面积:"+szhu+"球体积:"+vqiu+"圆锥体积:"+vzhui+"圆柱体积:"+vzhu;

}

(2)设计一个测试类,给出几个不同的圆柱体,圆锥体,球体的尺寸,用计算工具类分别求它们体积的累加和与表面积的累加和。
输入半径,高度和母线长之后根据公式运算求出它们的体积表面积,再进行求和。
(3)设计一个测试类,随机产生球,圆柱、圆锥体的尺寸,模拟考试,要求用户回答它们的体积和面积,并判断用户的回答是否正确
用scanner 和nextInt()方法进行输入输出值

        Scanner w=new Scanner(System.in);
 			System.out.println("\t请计算球的体积和表面积:");
 			double vqiu1=w.nextInt();
	    double sqiu1=w.nextInt();

用random方法求取随机值。

        System.out.println("半径:"+"r"+"高度:"+"h"+"母线:"+"l");
	    Random rand=new Random();
	    double r=rand.nextInt(100);
    double h=rand.nextInt(100);
	    double l=rand.nextInt(100);

使用if(){...;}else{}语句判断用户输入的值是否为计算值,然后进行输出计算出的正确值。不过,这个正确值的输出的不正确。
(三)代码托管(务必链接到你的项目)。
码云commit历史截图

上传实验项目代码到码云,在码云项目中选择“统计-commits”,设置搜索时间段,搜索本周提交历史,并截图。
http://git.oschina.net/hebau_cs15/java-cs02zt1

posted @ 2017-04-06 15:44  彪悍一只猫  阅读(304)  评论(1编辑  收藏  举报