[JAVA] 编写学生信息表,并通过方法实现学生与专业关联

      在学习了封装和无参构造,多参构造方法和各种方法调用后,编写了以下如图所示的一个简单的学生信息管理,下面将一步步分析如何实现利用多类之间的方法调用来实现表。

首先需要新建项目,在项目中建立两个包,分别存放学生信息,学科信息和测试信息,在项目中建立包主要是为了避免项目中有很多类时,产生命名冲突

包也有助于将相关的类分组在一起,使项目结构更清晰,也可以控制访问权限,便于模块划分和复用等

在这里我建立了两个包,分别有Student,Subject类和SchoolTest类

分别存放相关专业学生信息类和测试类

Subject:

package com.imooc.model;
/**
 * 专业类:
 * @author imooc
 */
public class Subject {
//成员属性:学科名称,学科编号,学制年限
	private String subjectName;
	private String subjectNo;
	private int subjectLife;
	
	// 无参构造方法
	public Subject() { // 构造方法

	}
	

	// 带参构造。实现对学科名称,编号,学制年限赋值
	public Subject(String subjectName, String subjectNo, int subjectLife) { // 带参构造
		// this.subjectName=subjectName;//第一种赋值方法
		this.setSubjectName(subjectName);// 第二种赋值方法(推荐-安全序数高)
		this.setSubjectNo(subjectNo);
		this.setSubjectLife(subjectLife);

	}

	public void setSubjectName(String subjectName) {
		this.subjectName = subjectName;
	}

	public String getSubjectName() {
		return this.subjectName;
	}

	public void setSubjectNo(String subjectNo) {
		this.subjectNo = subjectNo;
	}

	public String getSubjectNo() {
		return this.subjectNo;

	}

	public int getSubjectLife() {
		return this.subjectLife;
	}

	// 设置学制年限,限制必须》0
	public void setSubjectLife(int subjectLife) {
		if (subjectLife <= 0)
			return;// 如不满足要求条件则直接结束
		this.subjectLife = subjectLife;// 满足要求条件直接执行
	}

	
	// 添加一个描述的方法:测试信息是否可以打印出
	public String info() {
		String str = "学科信息如下:\n学科名称:" + this.getSubjectName() + "\n" + "学科编号:" + this.getSubjectNo() + "\n" + "学科年限:"
				+ this.getSubjectLife();
		return str;

	}
	
}

SchoolTest测试类:

package com.imooc.test;
import com.imooc.model.Subject;//在当前代码中引入另一个Subject类
import com.imooc.model.Student;
public class SchoolTest {

	public static void main(String[] args) {
     //测试Subject类
		Subject sub1=new Subject("计算机科学与技术","J001",4);//两种实例构造方法,一种通过无参构造,通过set方法赋值。二是通过三参赋值
		System.out.println();
		System.out.println(sub1.info());//调用描述方法
		

	}

}

显示结果:

Student类则显示学生相关信息:

package com.imooc.model;
public class Student {
//成员特征:学号,姓名,性别,年龄
	private String studentNo;
	private String studentName;
	private String sex;
	private int  studentAge;
	//private Subject studentSubject;//构造对象成员属性
	
	//无参构造方法
	public Student() {
		
	}
    //多参构造方法,实现对学号,姓名,性别,年龄的赋值
	public Student(String studentNo,String studentName,String sex,int studentAge) {
		this.setStudentNo(studentNo);
		this.setStudentName(studentName);
		this.setSex(sex);
		this.setStudentAge(studentAge);
	}
	
	
	//封装
	public String getStudentNo() {
		return studentNo;
	}


	public void setStudentNo(String studentNo) {
		this.studentNo = studentNo;
	}


	public String getStudentName() {
		return studentName;
	}


	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

//	限制性别只能是“男”或“女”,否则强制赋值“男”;可以通过equals()方法进行字符串内容的判断,
	//如果内容相等返回值为true,反之为false。如当str代表用户性别时,判断性别为”男“还是”女“
	public String getSex() {
		if(!"男".equals(sex)&&!"女".equals(sex)) {
			sex="男";
		}
		return sex;
	}


	public void setSex(String sex) {
		this.sex = sex;
	}


	public int getStudentAge() {
		return studentAge;
	}

	/**
	 * 给年龄赋值,限定年龄不能<10,>100,否则直接赋值18,反之正常赋值
	 * @param studentAge
	 */

	public void setStudentAge(int studentAge) {
		if(studentAge<10 || studentAge>100) 
			this.studentAge =18;
		else 
		   this.studentAge = studentAge;
			
	}

	
	
	//根据以上信息再加入专业和学制年限 方法1
	public String introduction(String subjectName,int subjectLife){
		String str="学生信息如下:\n学号:"+this.getStudentNo()+"\n姓名:"+this.getStudentName()+"\n性别:"
	+this.getSex()+"\n年龄:"+this.getStudentAge()+"\n所报专业:"+subjectName+"\n专业年限:"+subjectLife;
		return str;
	}
	/**
	 * 学生自我介绍的方法
	 * @param mysubject 所选专业的对象
	 * @return 自我介绍的信息,包括姓名,学号,性别,年龄,所报专业,专业年限
	 */
	//根据以上信息再加入专业和学制年限 方法2
		public String introduction(Subject mysubject){//里面方法是Subject中的对象类型,在测视里调用时应使用调用对象的方法
			String str="学生信息如下:\n学号:"+this.getStudentNo()+"\n姓名:"+this.getStudentName()+"\n性别:"
		+this.getSex()+"\n年龄:"+this.getStudentAge()+"\n所报专业:"+mysubject.getSubjectName()+"\n专业年限:"+mysubject.getSubjectLife()+"\n专业编号:"+mysubject.getSubjectNo();
			return str;
		}
    
		
		
    
		     public static void main(String[] args) {
		// TODO 自动生成的方法存根

	   }

}

SchoolTest测试类:

package com.imooc.test;
import com.imooc.model.Subject;
import com.imooc.model.Student;
public class SchoolTest {

	public static void main(String[] args) {
     //测试Subject类
		Subject sub1=new Subject("计算机科学与技术","J001",4);//两种实例构造方法,一种通过无参构造,通过set方法赋值。二是通过三参赋值
		System.out.println();
		System.out.println(sub1.info());//调用描述方法
		System.out.println("=======================");
		//根据以上信息再加入专业和学制年限 方法1
        Student stu2=new Student("S02","红豆","女",20);
		System.out.println(stu2.introduction("计算机科学与技术",4));
		//根据以上信息再加入专业和学制年限 方法2
		System.out.println("=======================");
        Student stu3=new Student("S03","南国","女",23);
        System.out.println(stu3.introduction(sub1));

	

	}

}

结果显示:

也可以用另一种方法存入后两项所学专业和专业年限—在Student类中添加专业对象作为属性,通过其属性获得相关信息。——此处以添加成员“王维”为例,采用这种方法

在此代码中,需要注意的是如果定义的值默认返回值是null,需对其进行初始化后赋值,避免空指针异常

package com.imooc.model;
public class Student {
//成员特征:学号,姓名,性别,年龄
	private String studentNo;
	private String studentName;
	private String sex;
	private int  studentAge;
	private Subject studentSubject;//构造对象成员属性
	
	//无参构造方法
	public Student() {
		
	}
  
	
    //多参构造方法,实现对全部属性的赋值
	public Student(String studentNo,String studentName,String sex,int studentAge,Subject studentSubject) {
		this.setStudentNo(studentNo);
		this.setStudentName(studentName);
		this.setSex(sex);
		this.setStudentAge(studentAge);
		this.setStudentSubject(studentSubject);
	}
	
	//封装
	public String getStudentNo() {
		return studentNo;
	}


	public void setStudentNo(String studentNo) {
		this.studentNo = studentNo;
	}


	public String getStudentName() {
		return studentName;
	}


	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

//	限制性别只能是“男”或“女”,否则强制赋值“男”;可以通过equals()方法进行字符串内容的判断,
	//如果内容相等返回值为true,反之为false。如当str代表用户性别时,判断性别为”男“还是”女“
	public String getSex() {
		if(!"男".equals(sex)&&!"女".equals(sex)) {
			sex="男";
		}
		return sex;
	}


	public void setSex(String sex) {
		this.sex = sex;
	}


	public int getStudentAge() {
		return studentAge;
	}

	/**
	 * 给年龄赋值,限定年龄不能<10,>100,否则直接赋值18,反之正常赋值
	 * @param studentAge
	 */

	public void setStudentAge(int studentAge) {
		if(studentAge<10 || studentAge>100) 
			this.studentAge =18;
		else 
		   this.studentAge = studentAge;
			
	}

	/**
	 * 学生自我介绍的方法
	 * @return自我介绍的信息,包括姓名,学号,性别,年龄
	 */
	//考虑后面测试信息输入的方便性,写出简单的自我介绍方法
	public String introduction(){
		String str="学生信息如下:\n学号:"+this.getStudentNo()+"\n姓名:"+this.getStudentName()+"\n性别:"
	+this.getSex()+"\n年龄:"+this.getStudentAge()+"\n所报专业:"+this.getStudentSubject().getSubjectName()+"\n专业年限:"+this.getStudentSubject().getSubjectLife();
		return str;
	}
	

	/**
	 * 学生自我介绍的方法
	 * @param mysubject 所选专业的对象
	 * @return 自我介绍的信息,包括姓名,学号,性别,年龄,所报专业,专业年限
	 */
	//根据以上信息再加入专业和学制年限 方法2
		public String introduction(Subject mysubject){//里面方法是Subject中的对象类型,在测视里调用时应使用调用对象的方法
			String str="学生信息如下:\n学号:"+this.getStudentNo()+"\n姓名:"+this.getStudentName()+"\n性别:"
		+this.getSex()+"\n年龄:"+this.getStudentAge()+"\n所报专业:"+mysubject.getSubjectName()+"\n专业年限:"+mysubject.getSubjectLife()+"\n专业编号:"+mysubject.getSubjectNo();
			return str;
		}
    
		
		
       /**
        * 获取专业对象,如果没有实例化,先实例化后再返回
        * @return 专业对象信息 
        */
	    public Subject getStudentSubject() {
	    	if(this.studentSubject==null)
	    		this.studentSubject=new Subject();
	    	return studentSubject;
	    }
	    public void setStudentSubject(Subject studentSubject) {
	    		this.studentSubject=studentSubject;
	     }
	
	     public static void main(String[] args) {
		// TODO 自动生成的方法存根

	   }

}

SchoolTest测试类:

package com.imooc.test;
import com.imooc.model.Subject;
import com.imooc.model.Student;
public class SchoolTest {

	public static void main(String[] args) {
     //测试Subject类
		Subject sub1=new Subject("计算机科学与技术","J001",4);//两种实例构造方法,一种通过无参构造,通过set方法赋值。二是通过三参赋值
		System.out.println();
		System.out.println(sub1.info());//调用描述方法
		System.out.println("=======================");
		Student stu1=new Student("S01","王维","雌",4,sub1);
	    System.out.println(stu1.introduction());
	    System.out.println("=======================");
		System.out.println(stu2.introduction("计算机科学与技术",4));
		//根据以上信息再加入专业和学制年限 方法2
		System.out.println("=======================");
        Student stu3=new Student("S03","南国","女",23);
        System.out.println(stu3.introduction(sub1));

	
	}

}

结果显示:

 最后我们需要统计当前专业报名的人数:

Subject类下关键代码:

private Student[] myStudents;//作为统计学科专业下的学生信息值容器
private int studentNum;//作为统计学科专业下的学生个数*/	

添加一个addStudent方法

public void addStudent(Student stu) {
		/**
		 * 1.将学生保存到数组中
		 * 2.将学生个数保存到studentNum
		 */
		int i=0;
		for(i=0;i<this.getMyStudents().length;i++) {
			if(this.getMyStudents()[i]==null) {
				this.getMyStudents()[i]=stu;
				this.studentNum=i+1;
				return;
				}
		}
		
	}

SchoolTest测试类:

//测试指定专业中有多少学生报名
        sub1.addStudent(stu1);
        sub1.addStudent(stu2);
        sub1.addStudent(stu3);
		System.out.println(sub1.getSubjectName()+"专业中共有"+sub1.getStudentNum()+"人选择了报名该专业");

完整代码:

Subject类

package com.imooc.model;
/**
 * 专业类:
 * @author imooc
 */
public class Subject {
//成员属性:学科名称,学科编号,学制年限,报名选修的学生信息和学生个数——通过后面的addStudent方法实现
	private String subjectName;
	private String subjectNo;
	private int subjectLife;
	private Student[] myStudents;//作为统计学科专业下的学生信息值容器
    private int studentNum;//作为统计学科专业下的学生个数*/
	// 无参构造方法
	public Subject() { // 构造方法

	}
	public Subject(String subjectName, String subjectNo, int subjectLife,Student[] myStudent) { // 带参构造
		// this.subjectName=subjectName;
		this.setSubjectName(subjectName);
		this.setSubjectNo(subjectNo);
		this.setSubjectLife(subjectLife);

	}

	// 带参构造。实现对学科名称,编号,学制年限赋值
	public Subject(String subjectName, String subjectNo, int subjectLife) { // 带参构造
		// this.subjectName=subjectName;//第一种赋值方法
		this.setSubjectName(subjectName);// 第二种赋值方法(推荐-安全序数高)
		this.setSubjectNo(subjectNo);
		this.setSubjectLife(subjectLife);

	}

	public void setSubjectName(String subjectName) {
		this.subjectName = subjectName;
	}

	public String getSubjectName() {
		return this.subjectName;
	}

	public void setSubjectNo(String subjectNo) {
		this.subjectNo = subjectNo;
	}

	public String getSubjectNo() {
		return this.subjectNo;

	}

	public int getSubjectLife() {
		return this.subjectLife;
	}

	// 设置学制年限,限制必须》0
	public void setSubjectLife(int subjectLife) {
		if (subjectLife <= 0)
			return;// 如不满足要求条件则直接结束
		this.subjectLife = subjectLife;// 满足要求条件直接执行
	}
	/**
	 * 获取选修专业的学生信息,如果保存学生信息的数组未被初始化,则先初始化长度为200
	 * @return保存学生信息的数组
	 */

	public Student[] getMyStudents() {
		if(this.myStudents==null)
			this.myStudents=new Student[200];
		return myStudents;
	}

	public int getStudentNum() {
		return studentNum;
	}
	public void setStudentNum(int studentNum) {
		this.studentNum = studentNum;
	}
	public void setMyStudents(Student[] myStudents) {
		this.myStudents = myStudents;
	}

	// 添加一个描述的方法:测试信息是否可以打印出
	public String info() {
		String str = "学科信息如下:\n学科名称:" + this.getSubjectName() + "\n" + "学科编号:" + this.getSubjectNo() + "\n" + "学科年限:"
				+ this.getSubjectLife();
		return str;

	}
	//统计指定专业中有多少学生报名
	public void addStudent(Student stu) {
		/**
		 * 1.将学生保存到数组中
		 * 2.将学生个数保存到studentNum
		 */
		int i=0;
		for(i=0;i<this.getMyStudents().length;i++) {
			if(this.getMyStudents()[i]==null) {
				this.getMyStudents()[i]=stu;
				this.studentNum=i+1;
				return;
				}
		}
		
	}
}

Student类

package com.imooc.model;
public class Student {
//成员特征:学号,姓名,性别,年龄
	private String studentNo;
	private String studentName;
	private String sex;
	private int  studentAge;
	private Subject studentSubject;//构造对象成员属性
	
	//无参构造方法
	public Student() {
		
	}
    //多参构造方法,实现对学号,姓名,性别,年龄的赋值
	public Student(String studentNo,String studentName,String sex,int studentAge) {
		this.setStudentNo(studentNo);
		this.setStudentName(studentName);
		this.setSex(sex);
		this.setStudentAge(studentAge);
	}
	
    //多参构造方法,实现对全部属性的赋值
	public Student(String studentNo,String studentName,String sex,int studentAge,Subject studentSubject) {
		this.setStudentNo(studentNo);
		this.setStudentName(studentName);
		this.setSex(sex);
		this.setStudentAge(studentAge);
		this.setStudentSubject(studentSubject);
	}
	
	//封装
	public String getStudentNo() {
		return studentNo;
	}


	public void setStudentNo(String studentNo) {
		this.studentNo = studentNo;
	}


	public String getStudentName() {
		return studentName;
	}


	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

//	限制性别只能是“男”或“女”,否则强制赋值“男”;可以通过equals()方法进行字符串内容的判断,
	//如果内容相等返回值为true,反之为false。如当str代表用户性别时,判断性别为”男“还是”女“
	public String getSex() {
		if(!"男".equals(sex)&&!"女".equals(sex)) {
			sex="男";
		}
		return sex;
	}


	public void setSex(String sex) {
		this.sex = sex;
	}


	public int getStudentAge() {
		return studentAge;
	}

	/**
	 * 给年龄赋值,限定年龄不能<10,>100,否则直接赋值18,反之正常赋值
	 * @param studentAge
	 */

	public void setStudentAge(int studentAge) {
		if(studentAge<10 || studentAge>100) 
			this.studentAge =18;
		else 
		   this.studentAge = studentAge;
			
	}

	/**
	 * 学生自我介绍的方法
	 * @return自我介绍的信息,包括姓名,学号,性别,年龄
	 */
	//考虑后面测试信息输入的方便性,写出简单的自我介绍方法
	public String introduction(){
		String str="学生信息如下:\n学号:"+this.getStudentNo()+"\n姓名:"+this.getStudentName()+"\n性别:"
	+this.getSex()+"\n年龄:"+this.getStudentAge()+"\n所报专业:"+this.getStudentSubject().getSubjectName()+"\n专业年限:"+this.getStudentSubject().getSubjectLife();
		return str;
	}
	/**
	 * 学生自我介绍的方法
	 * @param subjectName 所学专业
	 * @param subjectLife 专业年限
	 * @return自我介绍的信息,包括姓名,学号,性别,年龄,所报专业,专业年限
	 */
	
	//根据以上信息再加入专业和学制年限 方法1
	public String introduction(String subjectName,int subjectLife){
		String str="学生信息如下:\n学号:"+this.getStudentNo()+"\n姓名:"+this.getStudentName()+"\n性别:"
	+this.getSex()+"\n年龄:"+this.getStudentAge()+"\n所报专业:"+subjectName+"\n专业年限:"+subjectLife;
		return str;
	}
	/**
	 * 学生自我介绍的方法
	 * @param mysubject 所选专业的对象
	 * @return 自我介绍的信息,包括姓名,学号,性别,年龄,所报专业,专业年限
	 */
	//根据以上信息再加入专业和学制年限 方法2
		public String introduction(Subject mysubject){//里面方法是Subject中的对象类型,在测视里调用时应使用调用对象的方法
			String str="学生信息如下:\n学号:"+this.getStudentNo()+"\n姓名:"+this.getStudentName()+"\n性别:"
		+this.getSex()+"\n年龄:"+this.getStudentAge()+"\n所报专业:"+mysubject.getSubjectName()+"\n专业年限:"+mysubject.getSubjectLife()+"\n专业编号:"+mysubject.getSubjectNo();
			return str;
		}
    
		
		
       /**
        * 获取专业对象,如果没有实例化,先实例化后再返回
        * @return 专业对象信息 
        */
		
	    public Subject getStudentSubject() {
	    	if(this.studentSubject==null)
	    		this.studentSubject=new Subject();
	    	return studentSubject;
	    }
	    public void setStudentSubject(Subject studentSubject) {
	    		this.studentSubject=studentSubject;
	     }
	
	     public static void main(String[] args) {
		// TODO 自动生成的方法存根

	   }

}

SchoolTest测试类:

package com.imooc.test;
import com.imooc.model.Subject;
import com.imooc.model.Student;
public class SchoolTest {

	public static void main(String[] args) {
     //测试Subject类
		Subject sub1=new Subject("计算机科学与技术","J001",4);//两种实例构造方法,一种通过无参构造,通过set方法赋值。二是通过三参赋值
		System.out.println();
		System.out.println(sub1.info());//调用描述方法
		System.out.println("=======================");
		Student stu1=new Student("S01","王维","雌",4,sub1);
	    System.out.println(stu1.introduction());
	    System.out.println("=======================");
		//根据以上信息再加入专业和学制年限 方法1
        Student stu2=new Student("S02","红豆","女",20);
		System.out.println(stu2.introduction("计算机科学与技术",4));
		//根据以上信息再加入专业和学制年限 方法2
		System.out.println("=======================");
        Student stu3=new Student("S03","南国","女",23);
        System.out.println(stu3.introduction(sub1));

		System.out.println("=======================");
    	//测试指定专业中有多少学生报名
        sub1.addStudent(stu1);
        sub1.addStudent(stu2);
        sub1.addStudent(stu3);
		System.out.println(sub1.getSubjectName()+"专业中共有"+sub1.getStudentNum()+"人选择了报名该专业");


	}

}

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值