Java实验之接口2

问题描述

定义一个类 Student,包括如下属性:学号(ID)、姓名(name)、性别(sex)、出生日期(birthDate)、专业(specialty)、课程(course),实现以下方法:每个属性的获取和定义,要求至少包含一个构造方法。定义一个接口类,定义方法query_course_catalog()用来查询课程。
编写一个接口,定义相关选课操作,定义Student 实现该接口。

个人解题思路

这个问题的主要难点在于Student类中course应该定义为何种数据类型,因为选课的数量是不确定的,但是就这个题目而言,再去新建一个Course类又没太大必要,因此将其定义为字符串数组较为合适;但是定义为字符串数组又有新的问题了:对于course的初始化以及修改该怎么办?这里我们想到course是成员变量(不是类变量)那么我们可以先只给它定义,需要使用的时候再去初始化和赋值(也算是一种动态吧)于是就可以看到如下局部代码:

import java.util.Scanner;
interface StudentInterface
{
	void query_course_catalog();
	void selectCourse();
}
class Student implements StudentInterface
{	/*其它不重要参数已经省去*/
	private String[] course;
	public void selectCourse()
	{
		String[] temp=course;/*防止temp空指针异常*/
		Scanner s=new Scanner(System.in);
		Scanner reader=new Scanner(System.in);
		int flag=0;
		System.out.println("请输入你想学的课程名称:");
		while(s.hasNextLine()){
			String name=s.nextLine();
			if(name.equals("exit")||name.equals("EXIT"))break;
			//System.out.println(name);
            System.out.println("您输入的课程名称是:"+name+"\n确认选择,请输入数字1\n重新输入,请输入数字0\n请输入:");
			if(reader.hasNextInt()&&reader.nextInt()==1)
			{
				if(course==null)
				{
					course=new String[1];
					course[0]=name;
				}
				else
				{
					temp=course;//保存course原数据
					course=new String[temp.length+1];
					System.arraycopy(temp,0,course,0,temp.length);
					course[temp.length]=name;
				}
				System.out.println("完成!\n需要继续添加课程请直接输入课程名称,结束添加请输入:exit");
			}
		}
	}
}

实验过程中遇到的问题的解决办法及心得

实验过程中一共遇到了3个问题:
1.关于Scanner类的使用
首先是创建Scanner类对象的时候需要注意:
Scanner s=new Scanner(System.in);
一定记得将System.in传入构造函数中(一般用法);

其次,一般一个Scanner对象对应一个hasNext***()函数和一个next***()函数,也就是在一次循环中只使用同一个Scanner类对象的hasNext**()函数和next***()函数,应当避免在一次循环中使用两次及以上的next***()函数;可以看到我为了获取一个字符串和一个数字的时候分别创建了一个Scanner对象;
2.关于euqals和==问题
如果你们先学习过C/C++之类的语言就不难发现,在Java中很多时候==貌似不起作用,在Java中,貌似只有基本数据类型可以使用==进行判别两者是否相等,利用包装类或者类创建的对象需要使用equals进行判断两者是否相等;因为每个对象都有一个固定的ID,相同的对象在java中不会创建第二个;

3.空指针问题
当去掉selectCourse()函数中第一行的语句时,编译会报错,提示temp未初始化,还有在不对course属性进行初始化就使用的时候也会出现空指针异常,当然这个编译能通过,当你运行程序的时候就会报错;所以在使用数组时一定记得给它进行初始化
PS:谁说java中没有指针的,数组不就是吗?

以上内容仅为个人想法及看法,如有不当,欢迎各位纠错。

附:全部代码

import java.util.Scanner;
interface StudentInterface
{
	void query_course_catalog();
	void selectCourse();
}
class Student implements StudentInterface
{
	private String ID;
	private String name;
	private char sex;
	private String birthDate;
	private String specialty;
	private String[] course;
	public Student(String ID,String name,char sex,String birth,String specialty)
	{
		this.ID=ID;
		this.name=name;
		this.sex=sex;
		this.birthDate=birth;
		this.specialty=specialty;
	}
	Student()
	{
		ID=null;
		name=null;
		sex='男';
		birthDate=null;
		specialty=null;
	}
	public String getID()
	{
		return ID;
	}
	public void setID(String ID)
	{
		this.ID=ID;
	}
	public String getName()
	{
		return this.name;
	}
	public void setName(String name)
	{
		this.name=name;
	}
	public char getSex()
	{
		return sex;
	}
	public void setSex(char sex)
	{
		this.sex=sex;
	}
	public String getBirthDate()
	{
		return birthDate;
	}
	public void setBirthDate(String birthDate)
	{
		this.birthDate=birthDate;
	}
	public String getSpecialty()
	{
		return this.specialty;
	}
	public void setSpecialty(String specialty)
	{
		this.specialty=specialty;
	}
	public String[] getCourse()
	{
		return this.course;
	}
	public void setCourse(String[] course)
	{
		this.course=course;
	}
	public void selectCourse()
	{
		String[] temp=course;//防止temp空指针异常
		Scanner s=new Scanner(System.in);
		Scanner reader=new Scanner(System.in);
		int flag=0;
		System.out.println("请输入你想学的课程名称:");
		while(s.hasNextLine()){
			String name=s.nextLine();
			if(name.equals("exit")||name.equals("EXIT"))break;
			//System.out.println(name);
            System.out.println("您输入的课程名称是:"+name+"\n确认选择,请输入数字1\n重新输入,请输入数字0\n请输入:");
			if(reader.hasNextInt()&&reader.nextInt()==1)
			{
				if(course==null)
				{
					course=new String[1];
					course[0]=name;
				}
				else
				{
					temp=course;//保存course原数据
					course=new String[temp.length+1];
					System.arraycopy(temp,0,course,0,temp.length);
					course[temp.length]=name;
				}
				System.out.println("完成!\n需要继续添加课程请直接输入课程名称,结束添加请输入:exit");
			}
			}
	}
	public void query_course_catalog()
	{
		System.out.println("---------选课信息---------");
		if(course!=null){
			System.out.println(name+"已经选择如下课程:");
			for(int i=0;i<course.length;i++)
			{
				System.out.println((i+1)+"."+course[i]);
			}
		}
		else
			System.out.println("提示:该生未选课!");
	}
	public void show()
	{
		System.out.println("---------基本信息---------");
		System.out.println("学号:"+getID());
		System.out.println("姓名:"+getName());
		System.out.println("性别:"+getSex());
		System.out.println("出生日期:"+getBirthDate());
		System.out.println("专业:"+getSpecialty());
		query_course_catalog();
	}
}
public class StudentTest
{
	public static void main(String[] args)
	{
		Student s1=new Student();
		s1.setID("201501002");
		s1.setName("张三");
		s1.setSex('男');
		s1.setBirthDate("19970101");
		s1.setSpecialty("计算机科学与技术");
		s1.selectCourse();
		s1.show();
	}
}
请保存为StudentTest.java再运行

猜你喜欢

转载自blog.csdn.net/ZC_25/article/details/78450977