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