一、实验名称
面向对象程序设计的继承、多态等特性的练习
二、实验目的
1)掌握类的继承机制。
2)熟悉类中成员变量和方法的访问控制。
3)熟悉方法或构造方法多态性。
4)熟悉接口的定义方法。
三、实验记录
1.编写程序实现如下功能:已知Person类包含三个公共域变量(姓名、性别、年龄)和一个构造方法,Student类是Person类的派生类,包含两个新的公共域变量(学号、班号)、两个公共方法(构造方法、修改年龄、显示基本信息)和一个构造方法。定义一组学生对象,并初始化他们的基本信息,然后依次输出。步骤(1):定义类Person,并添加以下公共域变量
public String name; public char sex; public int age;
添加构造方法Person(String name,char sex,int age){……}
步骤(2):基于类Person派生类Student,并添加如下公共域变量和方法
public String classno; public String sno;
public void updateAge(int age){……}
void toString(){……}
Student(String name,char sex,int age,String sno,String name)
{ super(name,sex,age);
…….
}
步骤(3):定义一个包含main方法的Application程序类TestStudentPerson,初
始化一个学生类对象数组,并利用循环语句显示所有学生基本信息。
源程序如下:
package pk2;
class Person{
public String name;
public char sex;
public int age;
Person(String name,char sex,int age){
https://www.doczj.com/doc/4c9743152.html,=name;
this.sex=sex;
this.age=age;
}
}
class Student extends Person{
public String classno,sno;
public void updateAge(int age){
this.age=age;
}
public String toString(){
System.out.println(name+" "+sex+" "+age+" "+sno+" "+classno);
return name+" "+sex+" "+age+" "+sno+" "+classno;
}
Student(String name,char sex,int age,String sno,String classno){ super(name,sex,age);
this.sno=sno;
this.classno=classno;
}
}
public class TestStudentPerson {
public static void main(String[] args)
{Student s[]=new Student[3];
s[0]=new Student("Jin",'M',20,"200904135146","电信0904");
s[0].updateAge(21);
s[1]=new Student("Liu",'M',20,"200904135147","电信0904");
s[2]=new Student("Zhu",'M',20,"200904135148","电信0904");
System.out.println("Name"+" "+"Sex"+" "+"Age"+" "+"Sno"+" "+"Classno");
for(int i=0;i<3;i++)
s[i].toString();
}
}
运行结果如下:
2.输入课本例5-4的源程序,观察其运行结果,然后将Shape类分别定义为一个抽象类和接口,然后将源
程序进行修改,让其实现相同功能。
步骤(1):在编辑调试工具中输入课本例5-4TestVirtualInvoke.java程序,编译运行,观察程序的运行
结果,并思考为什么产生这样的结果。
步骤(2):将Shape类定义为abstact class Shape{……},然后重新定义Shape抽象类的派生类Circle、Triangle、Line,最后编译运行,观察程序的运行结果是否和上面的结果相同。
步骤(3):将Shape定义为interface Shape{……},然后基于Shape接口实现类Circle、Triangle、Line,最后编译运行,观察程序的运行结果是否和上面的结果相同。
●方法一:
public class TestVirtualInvoke {
static void doStuff(Shape s){
s.draw();
}
public static void main(String[] args) {
Circle c=new Circle();
Triangle t=new Triangle();
Line l=new Line();
doStuff(c);
doStuff(t);
doStuff(l);
}
}
class Shape{
void draw(){
System.out.println("Shape Drawing");
}
}
class Circle extends Shape{
void draw(){
System.out.println("Shape Circle");
}
}
class Triangle extends Shape{
void draw(){
System.out.println("Shape Triangle");
}
}
class Line extends Shape{
void draw(){
System.out.println("Shape Line");
}
}
●方法二:使用抽象类abstract
(此处略去public class TestVirtualInvoke{……} )
abstract class Shape{
abstract void draw();
}
class Circle extends Shape{
void draw(){
System.out.println("Shape Circle");
}
} //定义Shape抽象类的派生类Circle
class Triangle extends Shape{
void draw(){
System.out.println("Shape Triangle");
}
} //定义Shape抽象类的派生类Triangle
class Line extends Shape{
void draw(){
System.out.println("Shape Line");
}
} //定义Shape抽象类的派生类Line
方法三:使用interface接口方法
(此处略去public class TestVirtualInvoke{……} )interface Shape{
public void draw();
} //定义一个Shape接口
class Circle implements Shape{
public void draw(){
System.out.println("Shape Circle");
}
} //基于Shape接口利用implements实现类Circle
class Triangle implements Shape{
public void draw(){
System.out.println("Shape Triangle");
}
} //基于Shape接口利用implements实现类Triangle
class Line implements Shape{
public void draw(){
System.out.println("Shape Line");
}
} //基于Shape接口利用implements实现类Line
3.某小型公司,主要有三类人员:经理、兼职技术人员和兼职推销员。
这三类人员共同拥有的相关属性:姓名、编号;相关方法:获取当月薪水的getPay()方法、显示个人信息的toString()方法。
人员编号基数为1000,每创建一个人员实例对象,其编号属性的值顺序加1。月薪计算方法:经理拿固定月薪8000元;兼职技术人员按每小时100元领取月薪;兼职推销人员的月薪按当月的销售额的4%提成。
源程序如下:
四abstract class Worker
{ String name;
long no;
static long id=1000;
abstract public double getPay();
Worker(String name){ https://www.doczj.com/doc/4c9743152.html,=name;id=id+1;}
}
class Manager extends Worker
{
double pay=8000;
public double getPay(){return 8000;}
Manager(String name)
{super(name);no=id;}
public String toString(){return"name:"+name+" no:"+no+" pay:8000"+"\n";}
}
class Sale extends Worker
{ long saleNum;
public double getPay(){return saleNum*0.4;}
Sale(String name,long saleNum)
{super(name);
no=id;
this.saleNum=saleNum;
}
public String toString()
{return"name:"+name+" no:"+no+" pay:"+getPay()+"\n";} }
class Tech extends Worker
{ long salaryHours;
public double getPay()
{return salaryHours*100; }
Tech(String name,long salaryHours)
{super(name); no=id;
this.salaryHours=salaryHours;}
public String toString() {return"name:"+name+" no:"+no+" pay:"+getPay()+"\n";}}
public class TestWorker
{static double sum;
public static void main(String args[])
{
Worker a[]=new Worker[4];
a[0]=new Sale("张三",2000);
a[1]=new Sale("李四",6000);
a[2]=new Tech("王五",100);
a[3]=new Manager("钱七");
// String output="";
for(int i=0;i //output+=a[i]; System.out.println(a[i]); for(int i=0;i sum+=a[i].getPay();System.out.println("totalPay:"+sum); } } 运行结果如下: 四、个人小结 本次实验是编写三个java程序实现简单的功能,其中第二个实验要求用三种方法实现,包括使用抽象类和接口方法,实验是在java集成开发环境Myeclipse中完成的,在Myeclipse中完成java源程序的编辑、编译与运行。实验中遇到过很多问题,而Myeclipse能够较准确的指出错误并提出修改建议,在不断的修改后,终于使得所写的程序没有语法等错误,但在运行时却不能正常运行,经检查发现是创建的数组没有初始化,改正后程序正常运行出现正确的结果。 通过这次上机,我对java面向对象的程序设计的概念有了进一步的认识,深化了对课本知识的了解与认识,对类与接口的理解更深刻,熟悉了类域的使用,父类子类运以及方法的继承覆盖运用更加娴熟,也学会了一些基本的编程方法与技巧,希望经过以后的上机来更好的掌握java。 第3章面向对象程序设计基础 第3章面向对象程序设计基础 【1】什么是Java程序使用的类?什么是类库? 答:类是将一类事物的特性描述出来,然后如果用这个类来定义对象,则该对象就拥有了这个类所描述的所有特性。 在Java系统中,系统定义好的类根据实现的功能不同,可以划分成不同的集合,每个集合称为一个包,所有包合称为类库。 【2】如何定义方法?在面向对象程序设计中方法有什么作用? 答:方法的定义由两部分组成:方法声明和方法体。 方法的声明如下: 返回值类型方法名(参数类型形式参数1,参数类型形式参数2…){ 程序代码; 返回值; } 在面向对象程序设计中,方法的作用是完成对类和对象属性操作。 【3】简述构造方法的功能和特点。下面的程序片段是某学生为student类编写的构造方法,请指出其中的错误。 void Student(int no,String name) { studentNo=no; studentName=name; return no; } 答:构造方法的功能是:构造方法是一个特殊的方法,主要用于初始化新创建的对象; 特点:构造方法的方法名要求与类名相同,用户不能直接调用,只能通过new运算符调用,而且构造方法是不返回任何数据类型,甚至也不返回void数据类型,即不能在构造方法前加void。 错误之处:(1)构造方法Student()前不能加void,(2)不能用return语句,(3)类名Student 首字母S改成小写s. 【4】定义一个表示学生的student类,包括的域有学号、姓名、性别、年龄,包括的方法有获得学号、姓名、性别、年龄及修改年龄。编写Java程序创建student类的对象及测试其方法的功能。 class Student { String id; String name; String sex; int age; void talk(){ 1 什么是面向对象程序设计,它与传统的结构式程序有什么不同。 面向对象程序设计是一种适用于设计、开发各类软件的范型。它是将软件看成是一个由对象组成的社会:这些对象具有足够的智能,能理解从其他对象接受的信息,并以适当的行为作出响应;允许低层对象从高层对象继承属性和行为。通过这样的设计思想和方法,将所模拟的现实世界中的事物直接映射到软件系统的解空间。 与传统的结构式程序设计相比,面向对象程序设计吸取了结构式程序设计的一切优点(自顶向下、逐步求精的设计原则)。而二者之间的最大差别表现在: ·面向对象程序采用数据抽象和信息隐藏技术使组成类的数据和操作是不可分割的,避免了结构式程序由于数据和过程分离引起的弊病。 · 面向对象程序是由类定义、对象(类实例)和对象之间的动态联系组成的。而结构式程序是由结构化的数据、过程的定义以及调用过程处理相应的数据组成的 2 用面向对象方法建立模型的思维过程是怎样的。 用面向对象方法建立拟建系统的模型的过程就是从被模拟现实世界的感性具体中抽象要解决的问题概念的过程。这种抽象过程分为知性思维和具体思维两个阶段,其中:·知性思维是从感性材料中分解对象,抽象出一般规定,形成了对对象的普遍认识。·具体思维是从知性思维得到出的一般规定中揭示的事物的深刻本质和规律,其目的是把握具体对象的多样性的统一和不同规定的综合。 3 解释以下概念: ①对象:在现实世界中,对象就是可以感觉到的实体。每个对象具有一个特定的名字以 区别于其他对象;具有一组状态用来描述它的某些特性;具有一组操作,每一个操作决定对象的一种功能或行为(为自身服务的操作和为其他对象提供服务的操作)。而在面向对象系统中,对象是可以标识的存储区域。每个对象的状态被保存在此区域中,而实现一类对象行为的操作(代码)被保存在另外相关的存储器区域中。 ②消息:消息是要求某个对象执行其某种功能操作(方法)的规格说明。因此,消息是 由消息的接收者、消息要求提供的操作(消息名)和必要的参数组成的。 ③类:在现实世界中,类是对一组具有共同特性(属性和行为)的客观对象的抽象。而 在面向对象系统中,类是由程序员自定义的具有特定结构和功能的类型,是一种代码共享的手段。 ④实例:任何一个对象都是该对象所属类的一个具体实例。 ⑤公有消息:是由对象外向对象发送的消息,用于激活该对象的某种方法。 ⑥私有消息:是由对象向自身发送的消息,用于内部操作;该类消息不能从对象外向该 对象发送。 ⑦消息序列:在面向对象系统中一个事件的发生总会有多个对象的多次相互作用才能完 成,使得这些对象能够相互作用的消息组成的序列被称为消息序列。 4 类与实例的关系如何? 类是创建对象的模板,而对象是实现类的实例。属于同一类的不同实例必须具有: ·相同的操作集合; ·相同的静态属性集合; ·不同的对象名和属性动态值。 实验项目名称:继承和多态 (所属课程:Java语言程序设计) 院系:专业班级:姓名: 学号:实验地点:指导老师: 本实验项目成绩:教师签字:日期: 1.实验目的 (1)掌握类的继承机制。 (2)熟悉类中成员变量和方法的访问控制。 (3)熟悉方法或构造方法多态性。 2.实验内容 (1)模拟编写程序,理解类的继承、多态、继承和多态规则。 (2)独立编程,实现类的继承和多态。 3.实验作业 设计一个类Shape(图形)包含求面积和周长的area()方法和perimeter()方法以及设置颜色的方法SetColor(),并利用Java多态技术设计其子类Circle(圆形)类、Rectangle (矩形)类和Triangle(三角形)类,并分别实现相应的求面积和求周长的方法。每个类都要覆盖toString方法。 海伦公式:三角形的面积等于s(s-a)(s-b)(s-c)的开方,其中s=(a+b+c)/2 程序代码为: Class包 package Class; public class Shape { private String color = "while"; public Shape(String color){ this.color = color; } public void setColor(String color){ this.color = color; } public String getColor(){ return color; } public double getArea(){ return 0; } public double getPerimeter(){ return 0; } public String toString(){ return"color:" + color; } } package Class; public class Circle extends Shape { private double radius; public Circle(String color,double radius) { super(color); this.radius = radius; } public void setRadius(double radius){ this.radius = radius; } public double getRadius(){ return radius; } public double getCircleArea(){ return 3.14*radius*radius; } public double getCirclePerimeter(){ return 3.14*2*radius; } public String toString(){第3章 面向对象程序设计基础
什么是面向对象程序设计
JAVA继承和多态实验报告
(完整版)《面向对象程序设计》答案