(一)学习总结
1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
答:java中的封装就是利用private进行修饰,这样使实例化的类不可以直接访问,需要用get和set方法进行访问,保证数据安全性。
例如:
class Example
{
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
private int i;
}
public class Test {
public static void main(String[] args) {
Example lizi =new Example();
lizi.setI(5);
lizi.getI();
}
}
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++);
}
}
答:本代码不可运行,因为secret被private进行修饰了,所以想要添加或者获取内容的时候必须写入get和set方法。
例如:
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();
a.setSecret(a.getSecret()+1);
System.out.println(a.getSecret());
}
}
这段代码对吗
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进行调用,需要对X进行静态修饰。
例如:
public class Test{
static int x = 50;
static int y = 200;
public static void method(){
System.out.println(x+y);
}
public static void main(String args[]){
Test.method();
}
}
3 . 使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出了测试类代码和Book类的部分代码,将代码补充完整。
class Book{
int bookId;
String bookName;
double price;
// 声明静态变量
//定义静态代码块对静态变量初始化
//构造方法
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;
}
//定义方法求图书总册数
//重写toString方法
}
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());
}
}
}
改写后结果为:
class Book{
int bookId;
String bookName;
double price;
static int number;// 声明静态变量
public static void chushihua()//定义静态代码块对静态变量初始化
{
number =0;
}
public Book(String bookName,double price) //构造方法
{
this.bookName =bookName;
this.price =price;
this.bookId =1000+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 totalBook() //定义方法求图书总册数
{
return number;
}
public String toString ()//重写toString方法
{
return "编号:"+bookId+" 书名:"+bookName+" 价钱:"+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。
答:在单利模式中,构造方法被private进行修饰,导致无法new该类,使得该类无法实例化,所以需要在类内进行实例化,并返回该实例化内存,且该返回方法需要被静态修饰,这样就可以匿名调用该方法,进行取得已经被实例化好的地址了。
例如:
class danLi
{
private int data;
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
private danLi()//现在不可被new
{
}
public static danLi getDanLi()
{
return new danLi();
}
}
public class Test
{
public static void main(String args[])
{
danLi danli = danLi.getDanLi();
}
}
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';
}
}
答 :本代码运行结果如下:
其中当调用change的方法的时候,新开辟了两个空间,这两个空间中并赋值了传送进来的两个字符,当改变这两个字符的时候,并没有改变传进来的原始位置的参数,所以原来的数值并没有被改变,所以出现了这个情况。
(二)实验总结
实验内容: 1.按照下列要求完成类的设计 (1)设计一个日期类,用于记录年、月、日,提供对日期处理的常用方法(日期输出格式xxxx-xx-xx)。 (2)设计一个职工类,该职工类至少具有下面的属性:职工号,姓名,性别,生日,工作部门,参加工作时间,设计相应的方法。 (3)设计一个部门类,包括下列属性:部门编号,部门名称,经理,设计相应方法。 (4)设计一个测试类,采用对象数组模拟一个拥有两个部门,10个职工的单位,实现对相关信息的查询功能。
答:在这道题中,首先写出来日期类,其中得写构造方法,还得复写toString方法,在使用toString方法的时候直接输出该指针就可以做到直接调用该方法,省去了指针点该方法的步骤,可以解决代码过多的问题,在写职工类的时候需要进行在(1)里面的日期类的定义方法,并且需要(3)部门类的调用,所以要先写出来(3),在类二中调用,以为题中要求有两个部门,不会再增多,所以我就直接在(2)类中直接用private进行实例化了两个(3)类,这样就减少了以后要实例化的麻烦,在(4)中要求进行查询功能,所以我得建立一个(2)的数组类,在不使用class类集的时候进行查找,使用数组是最方便的办法了。以上就是我这次对一题的经验总结。
2.设计一个计算工具类,要求:
(1)为用户提供几个常见的几何体面积和体积的算法(如球的体积和表面积,圆柱体的体积和表面积,圆锥体的体积和表面积)(可以学习使用static关键字)
(2)设计一个测试类,给出几个不同的圆柱体,圆锥体,球体的尺寸,用计算工具类分别求它们体积的累加和与表面积的累加和。
(3)设计一个测试类,随机产生球,圆柱、圆锥体的尺寸,模拟考试,要求用户回答它们的体积和面积,并判断用户的回答是否正确
答:在写这道题的时候,为了减少代码冗余度,我用一个大类写出了所有计算面积和体积的方法,这样使得我在后面的代码中调用需要的时候就可以直接调用,不用在想办法写计算方法。在后面的(2)(3)需要写两个测试类,但是这是一个题所以我就在主函数中写出了一个选择,选择需要的功能,然后在这两个测试类中进行切换,这样使得我在交作业的时候交上一个.java文件就可以了。其中(3)的测试类中都需要进行Random进行产生随机数,在产生随机数之后就可随机选择需要计算的物体形状及其半径长宽高等数据,最后在把用户输入的和计算的作比较判断用户是否输入正确。
3.用面向对象编程思想完成评分系统
答:在上节课中写过的评分系统中,只要稍加改动,就可以完成。
4.用面向对象编程思想编写猜拳游戏
答:在这道题中,只需要写三个类就可以了,电脑类,还有玩家类,还有一
个计算输赢的类,在这些类中,也可以把电脑类和玩家类合并为一个类。其中在电脑出拳的产生一个由0-2的随机数,每一种表示一种拳头,然后让玩家同时也输入这三个数中的一个,判断是否相等,假如相等的话说明两个人是平手,假如不相等的话,x-y这两个数要是等于1或者等于-2就说明是你赢了否则就是你输了。
(三)代码托管(务必链接到你的项目)
码云commit历史截图
https://git.oschina.net/hebau_cs15/Java-CS01ygy.git
上传实验项目代码到码云,在码云项目中选择“统计-commits”,设置搜索时间段,搜索本周提交历史,并截图。