java实验01.docx
《java实验01.docx》由会员分享,可在线阅读,更多相关《java实验01.docx(22页珍藏版)》请在冰豆网上搜索。
![java实验01.docx](https://file1.bdocx.com/fileroot1/2023-1/5/9f2df9e7-2a32-4162-a52a-a9e78d0005d7/9f2df9e7-2a32-4162-a52a-a9e78d0005d71.gif)
java实验01
电子信息学院
实验报告书
课程名:
软件开发基础Java
(2)
题目:
实验01继承、接口与多态
实验类别:
【验证、调试、设计】
班级:
软件1412
学号:
141003330212
姓名:
张杨松
一、实验目的
(1)掌握类的继承机制。
(2)熟悉类中成员变量和方法的访问控制。
(3)熟悉方法或构造方法多态性。
(4)熟悉接口的定义方法。
二、实验内容
(1)定义一个球类Ball,包含一个私有成员变量——半径(doubler),两个公有成员方法:
设定半径方法(voidsetR(doublex))、得到半径值方法(doublegetR())。
定义一个台球类Billiards,继承Ball类,包含一个私有成员变量——颜色(Stringcolor),两个公有成员方法:
设定颜色方法setColor()、输出信息方法show(),其中show()方法可以输出该台球的颜色和半径值。
定义一个公有类TestBall,测试前两个类。
(2)编写程序实现如下功能:
已知Person类包含三个公共域变量(姓名、性别、年龄)和一个构造方法,Student类是Person类的派生类,包含两个新的公共域变量(学号、班号)、两个公共方法(修改年龄、显示基本信息)及一个构造方法。
定义一组学生对象,并初始化他们的基本信息,然后依次输出。
(3)接口实验
程序文件TestInterface.java。
运行该程序,然后按【思考问题】内容修改和观察程序。
packagecn.edu.sdju.joshua;
interfaceShapeAreaPeri{
doublegetArea();
doublegetPerimeter();
}
classTriangleimplementsShapeAreaPeri{
inta,b,c;
Triangle(inta,intb,intc){
this.a=a;
this.b=b;
this.c=c;
}
publicdoublegetArea(){
doublerp=(a+b+c)/2.0;
returnMath.sqrt((rp-a)*(rp-b)*(rp-c));
}
publicdoublegetPerimeter(){
return(a+b+c);
}
}
classRectangleimplementsShapeAreaPeri{
intwidth,length;
Rectangle(intw,intl){
width=w;
length=l;
}
publicdoublegetArea(){
returnwidth*length;
}
publicdoublegetPerimeter(){
return(2*(width+length));
}
}
classCircleimplementsShapeAreaPeri{
intridus;
finaldoublepi=3.14;
Circle(intr){
ridus=r;
}
publicdoublegetArea(){
returnpi*ridus*ridus;
}
publicdoublegetPerimeter(){
return2*pi*ridus;
}
}
publicclassInterfaceDemo{
publicstaticvoidmain(Stringargs[]){
ShapeAreaPeri[]sap=newShapeAreaPeri[5];
sap[0]=newRectangle(3,7);
sap[1]=newRectangle(10,8);
sap[2]=newCircle(8);
sap[3]=newTriangle(4,4,4);
sap[4]=newCircle
(2);
for(inti=0;i<5;i++){
System.out.println("当前形状面积="+sap[i].getArea());
System.out.println("当前形状周长="+sap[i].getPerimeter());
}
}
}
【思考问题】
在实现类Rectangle中注释掉一个方法后进行编译,看发生了什么?
为什么?
在实现类Rectangle中将各实现方法前的public修饰符去掉再进行编译,看发生了什么?
为什么?
将接口ShapeAreaPeri中定义的两个方法前加上abstract修饰符再编译,看对程序有影响否?
为什么?
不用单独的实现类Rectangle,直接在主类InterfaceDemo中实现那两个方法,如何修改程序?
将接口ShapeAreaPeri中定义的两个方法拆分定义成两个接口,即每个接口只定义一个方法,程序将如何修改?
(4)根据功能提示写程序:
设计一个实数类,一个复数类,都包含求模长(绝对值)、判断是否为0,求与它数和差积商的方法。
将全部类都定义在同一个.java文件中,部分代码已给出。
classRealNumber{
doublerealPart;
publicRealNumber(doublerealPart){
this.realPart=realPart;
}
publicRealNumber(){
this(0);
}
doublegetReal(){
returnrealPart;
}
publicdoublegetModulus(){//求模长,即绝对值
returnMath.abs(realPart);
}
publicbooleanisZero(){
//调用getModulus判断是不是0并返回结果
}
publicRealNumberAdd(RealNumbernum){
doublesumRealPart=this.realPart+num.getReal();//得到和的数值
RealNumbersum=newRealNumber(sumRealPart);//用和的数值构造实数类对象
returnsum;
}
//减法Subtract
//乘法Multiply
//除法Divide,除数为0(用isZero方法判断)时输出错误信息,返回用0构造的实数对象
}
classComplexNumber{//复数类继承实数类
//子类增加代表虚部的成员变量imaginaryPart
publicComplexNumber(doublerealPart,doubleimaginaryPart){//两个参数的构造方法
//子类构造方法第一条语句须调用父类构造方法
//给虚部赋值
}
//一个参数构造方法,将虚部当作0,调用两个参数的构造方法(两个参数的构造方法已包含对父类构造方法的调用,无需再调用)
//无参构造方法,将实部虚部都当作0,调用两个参数的构造方法(两个参数的构造方法已包含对父类构造方法的调用,无需再调用)
//getImaginary方法
//根据复数模长定义,重写父类求模长方法
//加法:
参数与返回值都是ComplexNumber类型
//减法:
参数与返回值都是ComplexNumber类型
//乘法:
参数与返回值都是ComplexNumber类型
//除法:
参数与返回值都是ComplexNumber类型,分母需要实数化,需用父类isZero判断除数是否为0,若为0返回用0构造的复数对象
}
publicclassDemo{
publicstaticvoidmain(Stringargs[]){
RealNumberr1=newRealNumber
(1);
RealNumberr2=newRealNumber
(2);
RealNumbersum=r1.Add(r2);//r1和r2的和
//输出r1和r2的和差积商,注意输出信息的可读性
//输出r1和0的和差积商(需要用0构造实数类对象),注意输出信息的可读性,
ComplexNumberc1=newComplexNumber(1,2);
ComplexNumberc2=newComplexNumber(3,4);
//输出c1和c2的和差积商,注意输出信息的可读性
//输出c1和0的和差积商(需要用0构造复数类对象),注意输出信息的可读性
}
}
三、实验结果(关键代码和运行结果)
/**
*测试台球类
*
*@paramargs
*/
publicclassTestBoll{
publicstaticvoidmain(String[]args){
Billiardsbilliards=newBilliards("紅色",10);
billiards.show();
System.out.println("-----------");
billiards.setR(20);
billiards.setColor("蓝色");
billiards.show();
}
}
classBoll{
privatedoubler;
publicBoll(doubler){
this.r=r;
}
publicdoublegetR(){
returnr;
}
publicvoidsetR(doubler){
this.r=r;
}
}
classBilliardsextendsBoll{
privateStringcolor;
publicBilliards(Stringcolor,doubler){
super(r);
this.color=color;
}
publicvoidsetColor(Stringcolor){
this.color=color;
}
/**
*显示台球的基本信息
*/
publicvoidshow(){
System.out.println("台球的顏色:
"+color+"\t半径:
"+getR());
}
}
图1-1运行结果
(2)/**
*
*创建学生类,并记录每个学生的信息
*
*@authorAdministrator
*
*/
publicclassPerson{
publicStringname;
publicStringsex;
publicintage;
publicPerson(Stringname,Stringsex,intage){
this.name=name;
this.sex=sex;
this.age=age;
}
}
classStudentextendsPerson{
publicStringStuNum;
publicStringclassNum;
publicvoidsetAge(intage){
this.age=age;
}
publicStudent(Stringname,Stringsex,intage,StringStuNum,
StringclassNum){
super(name,sex,age);
this.StuNum=StuNum;
this.classNum=classNum;
}
/**
*显示学生的基本信息的方法
*/
publicvoidshowInfo(){
System.out.println("姓名:
"+name+"性別:
"+sex+"年齡:
"+age+"学号:
"+StuNum+"班号:
"+classNum);
}
publicstaticvoidmain(String[]args){
Studentstudent[]=newStudent[3];
student[0]=newStudent("张杨松","男",20,"141003330212","12");
student[1]=newStudent("周梦帆","男",19,"141003330213","13");
student[2]=newStudent("陈思成","男",19,"141003330211","11");
/*
*采用for循环,遍历,然后分别打印出每个同学的信息
*/
for(Student_student:
student){
_student.showInfo();
}
}
}
(3)【思考问题】
在实现类Rectangle中注释掉一个方法后进行编译,看发生了什么?
为什么?
编译出错;
原因:
Rectangle实现了一个接口,就必须要实现接口中所有的抽象方法。
在实现类Rectangle中将各实现方法前的public修饰符去掉再进行编译,看发生了什么?
为什么?
编译出错;
原因:
在接口中,成员方法的默认属性为:
public、abstrack;实现接口中的方法时,必为:
public。
将接口ShapeAreaPeri中定义的两个方法前加上abstract修饰符再编译,看对程序有影响否?
为什么?
无影响;
原因:
接口中的成员方法的默认属性为:
public、abstrack;
不用单独的实现类Rectangle,直接在主类InterfaceDemo中实现那两个方法,如何修改程序?
interfaceShapeAreaPeri{
doublegetArea();
doublegetPerimeter();
}
classTriangleimplementsShapeAreaPeri{
inta,b,c;
Triangle(inta,intb,intc){
this.a=a;
this.b=b;
this.c=c;
}
publicdoublegetArea(){
doublerp=(a+b+c)/2.0;
returnMath.sqrt((rp-a)*(rp-b)*(rp-c));
}
publicdoublegetPerimeter(){
return(a+b+c);
}
}
classRectangle{
intwidth,length;
publicintgetWidth(){
returnwidth;
}
publicvoidsetWidth(intwidth){
this.width=width;
}
publicintgetLength(){
returnlength;
}
publicvoidsetLength(intlength){
this.length=length;
}
Rectangle(intw,intl){
width=w;
length=l;
}
publicdoublegetArea(){
return0;
}
publicdoublegetPerimeter(){
return0;
}
}
classCircleimplementsShapeAreaPeri{
intridus;
finaldoublepi=3.14;
Circle(intr){
ridus=r;
}
publicdoublegetArea(){
returnpi*ridus*ridus;
}
publicdoublegetPerimeter(){
return2*pi*ridus;
}
}
publicclassInterfaceDemoextendsRectangleimplementsShapeAreaPeri{
InterfaceDemo(intw,intl){
super(w,l);
}
publicdoublegetArea(){
returnlength*width;
}
publicdoublegetPerimeter(){
return2*(length+width);
}
publicstaticvoidmain(Stringargs[]){
ShapeAreaPeri[]sap=newShapeAreaPeri[3];
sap[0]=newCircle(8);
sap[1]=newTriangle(4,4,4);
sap[2]=newCircle
(2);
for(inti=0;iSystem.out.println("当前形状面积="+sap[i].getArea());
System.out.println("当前形状周长="+sap[i].getPerimeter());
}
System.out.println("---------------");
Rectangler=newInterfaceDemo(10,15);
System.out.println("长方形的面积为:
"+r.getArea());
System.out.println("长方形的周长为:
"+r.getPerimeter());
}
}
将接口ShapeAreaPeri中定义的两个方法拆分定义成两个接口,即每个接口只定义一个方法,程序将如何修改?
interfaceGetArea{
doublegetArea();//获得面积、
}
interfaceGetPerimeter{
doublegetPerimeter();//获得周长
}
//三角形类
classTriangleimplementsGetArea,GetPerimeter{
inta,b,c;
Triangle(inta,intb,intc){
this.a=a;
this.b=b;
this.c=c;
}
publicdoublegetArea(){
doublerp=(a+b+c)/2.0;
returnMath.sqrt((rp-a)*(rp-b)*(rp-c));
}
publicdoublegetPerimeter(){
return(a+b+c);
}
}
//长方形类
classRectangleimplementsGetArea,GetPerimeter{
intwidth,length;
Rectangle(intw,intl){
width=w;
length=l;
}
publicdoublegetArea(){
returnwidth*length;
}
publicdoublegetPerimeter(){
return(2*(width+length));
}
}
classCircleimplementsGetArea,GetPerimeter{
intridus;
finaldoublepi=3.14;
Circle(intr){
ridus=r;
}
publicdoublegetArea(){
returnpi*ridus*ridus;
}
publicdoublegetPerimeter(){
return2*pi*ridus;
}
}
publicclassInterfaceDemo{
publicstaticvoidmain(Stringargs[]){
Rectangler=newRectangle(3,7);
Circlec=newCircle(8);
Trianglet=newTriangle(4,4,4);
System.out.println("长方形的面积="+r.getArea());
System.out.println("长方形的周长="+r.getPerimeter());
System.out.println("--------------");
System.out.println("圆的面积="+c.getArea());
System.out.println("圆的周长="+c.getPerimeter());
System.out.println("--------------");
System.out.println("三角形的面积="+t.getArea());
System.out.println("三角形的周长="+t.getPerimeter());
}
}
(4)
classRealNumber{
doublerealPart;
publicRealNumber(doublerealPart){
this.realPart=realPart;
}
publicRealNumber(){
this(0);
}
d