题目1
编写一个学生类,提供name、age、gender、phone、address、
email成员变量,且为每个成员变量提供setter、getter方法。为学生
类提供默认的构造器和带所有成员变量的构造器。为学生类提供方
法,用于描绘吃、喝、玩、睡等行为。
为了节省篇幅,这里只定义了name、age、和gender三个成员变量,吃饭一个行为。
源代码如下:
/**
* 此为一个学生类,具有姓名和年龄等成员变量,并定义了吃喝玩睡等行为
* @author Liu XueZheng
* @version 1.0
*/
public class Student{
/**
* 定义成员变量时,采用private修饰符以限制外部访问
*/
private String name; //定义姓名
private int age; //定义年龄
private String gender; //定义性别
//private String phone; //定义手机号
//private String address; //定义地址
//private String email; //定义邮箱
/**
* 提供设置name的setter方法
* @param name 学生姓名,由2-16位字符组成
*/
public void setName(String name){
//执行合理性检验
if(name.length() >16 || name.length() < 2){
System.out.println("您设置的名字长度不符合要求,请输入2-16位字符");
return;
}
else{
this.name = name;
System.out.println("我的名字被取作:" + name);
}
}
/**
* 提供获取name的getter方法
* @return 返回学生姓名
*/
public String getName(){
return this.name;
}
/**
* 提供设置age的setter方法
* @param age 学生姓名,由2-16位字符组成
*/
public void setAge(int age){
//执行合理性检验
if(age >116 || age < 1){
System.out.println("您设置的年龄不符合要求,请输入1-116的整数");
return;
}
else{
this.age = age;
System.out.println(this.name + "的年龄被取作:" + age);
}
}
/**
* 提供获取age的getter方法
* @return 返回学生年龄
*/
public int getAge(){
return this.age;
}
/**
* 提供设置gender的setter方法
* @param gender 学生性别,male或者female
*/
public void setGender(String gender){
//执行合理性检验
if(gender == "male" || gender == "female"){
this.gender = gender;
System.out.println(this.name + "的性别被取作:" + gender);
}
else{
System.out.println("请输入male或者female");
}
}
/**
* 提供获取gender的getter方法
* @return 返回学生性别
*/
public String getGender(){
return this.gender;
}
/**
* 无参构造器
*/
public Student(){
return;
}
/**
* 包含所有成员变量参数的构造器
* @param name 学生姓名
*/
public Student(String name, int age, String gender){
//初始化名字
if(name.length() >16 || name.length() < 2){
System.out.println("您设置的名字长度不符合要求,请输入2-16位字符");
return;
}
else{
this.name = name;
System.out.println("我的名字被取作:" + name);
}
//初始化年龄
if(age >116 || age < 1){
System.out.println("您设置的年龄不符合要求,请输入1-116的整数");
return;
}
else{
this.age = age;
System.out.println(this.name + "的年龄被取作:" + age);
}
//初始化性别
if(gender == "male" || gender == "female"){
this.gender = gender;
System.out.println(this.name + "的性别被取作:" + gender);
}
else{
System.out.println("请输入male或者female");
}
}
/**
* 定义一个吃的方法
* @param food 这个学生爱吃的食物
*/
public void eat(String food){
System.out.println(this.name + "爱吃" + food);
}
public static void main(String[] args){
//通过带参数的构造器初始化一个学生对象
Student duanPeng = new Student("duanPeng", 18, "male");
//通过无参数构造器与setter方法初始化一个学生对象
Student heShang = new Student();
heShang.setName("heShang");
heShang.setAge(18);
heShang.setGender("male");
heShang.eat("鸡腿");
}
}
在上面的程序中定义了两个学生:duanPeng和heShang,运行结果如下:
题目2
利用第1题定义的Student类,定义一个Student[]数组保存多个
Student对象作为通讯录数据。程序可通过name、email、address查
询,如果找不到数据,则进行友好提示。
另外定义一个Students类来完成上述要求,由于在程序1中没有定义email和address,下面仅实现通过name查询的方法。
源代码如下:
public class Students{
//定义一个通讯录数组,动态初始化其长度为10,方便后边函数引用
public Student[] studentList = new Student[10];
//定义对通讯录数组按姓名查找的方法
public void find(String name){
// 定义匹配失败次数变量
int num = 0;
for(Student s : studentList){
//如果数组元素出现空值,说明前面一直没找到,跳出循环并提示
if(s == null){
System.out.println("在通讯录中没有找到" + name + "同学。");
break;
}
//否则进行查找
if(s.getName() == name){
System.out.print(s.getName() + "被找到,");
if(s.getGender() == "male"){
System.out.println("他今年" + s.getAge() + "岁。");
}
else{
System.out.println("她今年" + s.getAge() + "岁。");
}
break;
}
//匹配失败1次,num+1,然后继续循环
else{
num++;
continue;
}
}
//匹配失败次数等于总匹配次数时,输出提示信息
if(num == studentList.length){
System.out.println("在通讯录中没有找到" + name + "同学。");
}
}
public static void main(String[] args){
//建立一个通讯录对象
Student duanPeng = new Student("duanPeng", 18, "male");
Student xiuQin = new Student("xiuQin", 20, "female");
var sList = new Students();
sList.studentList[0] = duanPeng;
sList.studentList[1] = xiuQin;
sList.find("xiuQin");
sList.find("heShang");
}
}
在main方法中,我定义了一个Students对象,并对其实例变量studentList进行了赋值,由于studentList的长度在一开始就被指定为了10,因此添加了两位同学duanPeng和xiuQin后数组3-20位元素均为null,故在执行find方法时如果前面一直查找不到,遇到空值变会跳出循环并给出提示。如果数组长度等于元素个数,也就是没有空值时,我设置了一个查找失败次数变量num,全部查找失败时同样也会给出提示。运行结果如下:
题目3
定义普通人、老师、班主任、学生、学校这些类,提供适当的
成员变量、方法用于描述其内部数据和行为特征,并提供主类使之运
行。要求有良好的封装性,将不同类放在不同的包下面,增加文档注
释,生成API文档。
前面生成类的要求基本上都已经实现过了,良好的封装性依赖于修饰符的选取,下面主要实现API文档的要求。
源代码如下:
package pe;
/**
*这是一个person类
*@author Liu XueZheng
#@version 1.0
*/
public class Person{
private String name;
/**
*@param name 输入person的名字
*/
public void info(String name){
this.name = name;
System.out.println("I am a person, my name is" + name);
}
}
上边代码定义了一个person类,第一行的package pe指定了其位于pe包下面,然后将之前定义好的Student类和Students类均放入st包中:
package st;
在命令行运行如下命令:
javadoc -d apidoc -windowtitle 第5章习题 -doctitle 第3题 -header 测试类 *.java
便将该路径下所有的.java文件生成了api文档注释
点开其中的st包,里面是定义好的Student类和Students类
点卡Student类,便可以看到我们之前的注释
题目4
改写第3题的程序,利用组合来实现类复用。
今天先写到这里吧,明天继续。如果有一起学习Java的小伙伴欢迎交流和指教~