Java作业二 面向对象程序设计
掌握类、对象、方法、继承、接口的编程技术
一、编写一个含有5个类的程序
-
Person类
属性:编号、姓名、性别;
构造方法:确定编号和姓名;
一般方法:修改编号、姓名,获取编号、姓名。
-
Teacher类
继承Person类并增加:
属性:系别;
构造方法:调用父类的构造方法;
一般方法:修改、获取系别。
-
Student类
继承类Person并增加:
属性:班级;
构造方法:调用父类的构造方法;
一般方法:修改、获取班级属性值。
-
Klass类:
属性:班级名称,学生名单(Student类对象的数组);
构造方法:确定班级名称;
一般方法:建立学生名单,输出学生名单。
-
Main类:
主类。主方法中创建一个班级,然后建立该班级的学生名单,最后输出学生名单。
代码实现
import java.util.Scanner;
public class Main
{
public static class Person
{
private String number;
private String name;
private String gender;
public Person(String number,String name)
{
this.number = number;
this.name = name;
}
public void setNumber(String number)
{
this.number = number;
}
public void setName(String name)
{
this.name = name;
}
public String getNumber()
{
return number;
}
public String getName()
{
return name;
}
}
public static class Teacher extends Person
{
private String department;
public Teacher(String number, String name)
{
super(number, name);
}
public void setDepartment(String department)
{
this.department = department;
}
public String getDepartment()
{
return department;
}
}
public static class Student extends Person
{
private String grade;
public Student(String number, String name)
{
super(number, name);
}
public void setGrade(String grade)
{
this.grade = grade;
}
public String getGrade()
{
return grade;
}
}
public static class Classes
{
private String className;
private Student stuList[] = new Student[100];
public Classes(String className)
{
this.className = className;
}
public void setStuList(int i,Student student)
{
stuList[i] = student;
}
public void getStuList(int n)
{
for (int i = 0; i < n; i++)
{
System.out.println(stuList[i].getName());
}
}
}
public static void main(String args[])
{
System.out.println("请输入班级名称:");
Scanner scanner = new Scanner(System.in);
if (scanner.hasNext())
{
String classname = scanner.next();
Classes class1 = new Classes(classname);
System.out.println("请输入班级人数:");
int sum = Integer.parseInt(scanner.next());
System.out.println("请分别输入每位学生的编号和姓名:");
for (int i = 0; i < sum; i++)
{
String number = scanner.next();
String name = scanner.next();
Student student = new Student(number,name);
class1.setStuList(i,student);
}
System.out.println("该班级的学生名单如下:");
class1.getStuList(sum);
}
}
}
运行截图
二、阅读程序题1
请仔细阅读下面的程序,分析程序的结构和输出结果。再将程序上机运行,验证输出结果。(重点理解:抽象类、抽象方法、(匿名)内部类、匿名对象)
abstract class A{abstract String getS();}
class Test
{
public static void main(String args[])
{
System.out.println(new A(){ String getS(){ return "抽象?匿名?";}}.getS());
}
}
分析:
定义了一个抽象类A,然后在主类的主方法中使用了它。
一般来说用到抽象类的时候,要先定义一个子类来继承它,并且实现它所有的抽象方法。抽象类中所有方法都是抽象的,没有方法体。也就是说抽象类的所有方法在子类中都要实现,不然子类仍是抽象的。
这里用到的是匿名内部类,省去了写子类继承抽象类—创建对象—用对象调用子类的方法这一过程。格式是这样new 抽象类名或接口名(){覆盖重写所有抽象方法}
。
匿名类不取名字,直接用父类的名字或接口的名字(接口跟抽象类相似)。使用new同时完成了类的定义和对象的创建。完成类的定义是指相当于声明了一个新的类来继承抽象类,所以必须在匿名类实现所有抽象方法,我们可以看到它实现了抽象类的方法String getS(){ return "抽象?匿名?";}
。完成对象的创建是指我们new完之后可以直接将子类当成对象来用,子类中它直接用.
来访问自己的方法.getS()
,同时注意到new的时候在父类的名字后有一对()
,这相当于调用构造对象时的构造方法,形参列表一般为空。
结果:
显然是输出抽象?匿名?
这一字符串了。
三、阅读程序题2
请仔细阅读下面的程序,分析程序的结构和输出结果。再将程序上机运行,验证输出结果。
(重点理解:接口、接口实现方法、(匿名)内部类、匿名对象)
interface I{ String getS(); }
class Test
{
public static void main(String args[]){
System.out.println(new I(){ public String getS(){ return "接口和内部类!";}}.getS());}
}
这题跟上题相似,只不过把抽象类变成了接口。接口的抽象程度比抽象类更高。
不同就在于抽象类中的方法在子类中必须全部实现,接口中的方法可以不必全部实现,可以只实现那些用得到的方法。
输出结果也是字符串啦。