java类与继承复用验证.docx
《java类与继承复用验证.docx》由会员分享,可在线阅读,更多相关《java类与继承复用验证.docx(17页珍藏版)》请在冰豆网上搜索。
java类与继承复用验证
上机内容:
类与继承、复用、验证
学号:
班级:
姓名:
1.已实现的功能说明(UML图或文字)
1)设计并编写GeometricObject图形类
要求a)覆盖toString()输出图形的名称和数据成员值
b)覆盖equals()比较图形的面积
c)定义area()方法计算图形的面积
2)定义矩形、圆形、三角形类由GeometricObject派生
要求:
重写必要的方法
:
注意:
成员的访问权限
3)将这些类放入一个软件包中
4)编写图书类,在主类中计算并输出图书总价。
a)图书基本信息:
name,author,price,amount;
b)统计所有图书总价。
5)验证型上机实践
a)编写一段程序,测试String,StringDuffer,StringBuilder的创建,赋值,连接,替换,删除操作;
b)完成House类的clone改为深复制;
c)编写一段程序,自定义一维和二维数组测试数组常用方法。
2.主要源码(必要的注释)
1.图形
packagetestt;
publicabstractclassGeometricObject{
//定义数据类型的相关方法
publicStringtoString(){
return"name:
"+name+"\nradius="+radius+"\nlength="+length+"wide="+wide+"\nsideA="+sideA+"sideB="+sideB+"sideC="+sideC+"\nS="+area();
}
publicbooleanequals(GeometricObjectother){
if(this.area()==other.area())
returntrue;
else
returnfalse;
}
abstractdoublearea();
}
classRectangleextendsGeometricObject{
Stringname="矩形";
publicRectangle(doublel,doublew){
length=l;
wide=w;
}
doublearea(){
returnlength*wide;
}
publicvoiddisplay(){
System.out.println("name:
"+name+"\nlength="+length+"wide="+wide+"\nS="+area());
}
}
classCircleextendsGeometricObject{
Stringname="圆形";
publicCircle(doubler){
radius=r;
}
doublearea(){
return3.14*radius*radius;
}
publicvoiddisplay(){
System.out.println("name:
"+name+"\nradius="+radius+"\nS="+area());
}
}
classTriangleextendsGeometricObject{
//必要的get、set方法
doublearea(){
doublep=(sideA+sideB+sideC)/2.0;
returnMath.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));
}
publicvoiddisplay(){
System.out.println("name:
"+name+"\nradius="+radius+"\nS="+area());
}
}
packagetestt;
publicclasstesty{//测试
publicstaticvoidmain(String[]args){
Rectangley=newRectangle(3,4);
y.display();
Circleci=newCircle
(2);
ci.display();
TriangleT=newTriangle(2,2,2);
T.display();
System.out.println(ci.equals(T));
}
}
2.图书:
packagetestt;
importjava.util.Scanner;
publicclassBook
{
Scannerinput=newScanner(System.in);
//必要的数据类型定义
//以下为添加读者信息
doublezongjias=0;
publicvoidadd()
{
System.out.println("请输入要添加第"+(i+1)+"书籍的名字");
name[i]=input.next();
System.out.println("请输入要添加的第"+(i+1)+"书籍的作者");
author[i]=input.next();
System.out.println("请输入要添加第"+(i+1)+"书籍的价格");
price[i]=input.nextFloat();
System.out.println("请输入要添加第"+(i+1)+"的书籍的数量");
amount[i]=input.nextInt();
i++;
}
publicvoidss()
{
zong[0]=0;
for(intj=0;j
{
zong[j]=price[j]*amount[j];
System.out.println("第"+(j+1)+"本书籍的总价是"+zong[j]);
}
for(intp=0;p
{
zongjias=zong[p]+zongjias;
}
System.out.println("您所添加的书籍的总价是"+zongjias);
}
publicstaticvoidmain(String[]args)//主函数,用来测试
{
System.out.println("请选择您的操作:
\n1添加书籍\n2计算所添加书籍的总价格\n0退出系统");
Scannerinput=newScanner(System.in);
……
}
3.Buffer
packagetestt;
publicclassBuffer{
publicstaticvoidmain(String[]args){
try{
intcount=2;
testString(count);
testStringBuffer(count);
testStringBuilder(count);
}catch(Exceptione){
e.printStackTrace();
}
}
privatestaticStringtestString(intcount){//String
Stringresult="";
longbegin=System.currentTimeMillis();//开始时间
for(inti=0;i<1500;i++){
result+="hello";
}
longend=System.currentTimeMillis();//结束时间
longtime=end-begin;
System.out.println("String方法拼接"+1500+"次消耗时间:
"+time+"毫秒");
Stringresulta="Hello,";//创建及赋值A
Stringresultb="howareyou!
";//创建及赋值B
System.out.println("赋值a为:
"+resulta);
System.out.println("赋值b为:
"+resultb);
result=resulta+resultb;//连接
System.out.println("连接结果为:
"+result);
Stringreplace=resulta.replace("Hello","Hi");//string替换
result=replace+resultb;
System.out.println("替换结果为:
"+result);
Stringc=resultb.replace("areyou","");//删除
System.out.println("删除结果为:
"+c);
returnresult;
}
privatestaticStringtestStringBuffer(intcount){
StringBufferresult=newStringBuffer();
longbegin=System.currentTimeMillis();
for(inti=0;i<1500;i++){
result.append("hello");
}
longend=System.currentTimeMillis();
longtime=end-begin;
System.out.println("StringBuilder方法拼接"+1500+"次消耗时间:
"+time+"毫秒");
StringBufferresulta=newStringBuffer("Hello,");//创建及赋值A
StringBufferresultb=newStringBuffer("howareyou!
");//创建及赋值B
System.out.println("赋值a为:
"+resulta);
System.out.println("赋值b为:
"+resultb);
result=resulta.append(resultb);//连接
System.out.println("连接结果为:
"+result);
result=result.replace(6,18,"HOWAREYOU!
");//string替换
System.out.println("替换结果为:
"+result);
result=result.delete(6,18);//删除
System.out.println("删除结果为:
"+result);
returnresult.toString();
}
privatestaticStringtestStringBuilder(intcount){
StringBuilderresult=newStringBuilder();
longbegin=System.currentTimeMillis();
for(inti=0;i<1500;i++){
result.append("hello");
}
longend=System.currentTimeMillis();
longtime=end-begin;
System.out.println("StringBuffer方法拼接"+1500+"次消耗时间:
"+time+"毫秒");
StringBuilderresulta=newStringBuilder("Hello,");//创建及赋值A
StringBuilderresultb=newStringBuilder("howareyou!
");//创建及赋值B
System.out.println("赋值a为:
"+resulta);
System.out.println("赋值b为:
"+resultb);
result=resulta.append(resultb);//连接
System.out.println("连接结果为:
"+result);
result=result.replace(6,18,"HOWAREYOU!
");//string替换
System.out.println("替换结果为:
"+result);
result=result.delete(6,18);//删除
System.out.println("删除结果为:
"+result);
returnresult.toString();
}
}
4.深复制
packagetestt;
publicclassShenfuzhi{
publicstaticvoidmain(String[]args)
{
shallowcopya=newshallowcopy("tanghaolin","lll");
shallowcopycopy1=(shallowcopy)a.clone();
//改变属性值
System.out.println("浅复制前的对象普通数据类型成员值"+a.names+"浅复制前的引用类型成员值"+a.test1.name);
System.out.println("浅复制后的对象普通数据类型成员值"+copy1.names+"浅复制后的引用类型成员值"+copy1.test1.name);
a.test1.name="123";
//String是基本数据类型所以复制时只把值拷贝过去
//test1是引用类型中的对象所以复制时拷贝的是test1的地址
System.out.println("改变属性值后浅复制前的对象普通数据类型成员值"+a.names+"浅复制前的引用类型成员值"+a.test1.name);
System.out.println("改变属性值后浅复制后的对象普通数据类型成员值"+copy1.names+"浅复制后的引用类型成员值"+copy1.test1.name);
System.out.println("浅复制前的对象是否相等"+(a==copy1));
//==比较的是对象的地址通过地址来观察是否相等或者是否另外创建了新的对象
System.out.println("浅复制前后普通成员变量是否相等"+(a.names==copy1.names));
System.out.println("浅复制前后引用类型变量的是否相等"+(a.test1.name==copy1.test1.name));
deepcopyb=newdeepcopy("lll","tanghaolin");
deepcopycopy2=(deepcopy)b.clone();
System.out.println("深复制前的对象普通数据类型成员值"+b.name+"深复制前的引用类型成员值"+b.test2.name);
System.out.println("深复制后的对象普通数据类型成员值"+copy2.name+"深复制后的引用类型成员值"+copy2.test2.name);
//改变属性值
b.test2.name="789";
System.out.println("改变属性值后深复制前的对象普通数据类型成员值"+b.name+"深复制前的引用类型成员值"+b.test2.name);
System.out.println("改变属性值后浅复制后的对象普通数据类型成员值"+copy2.name+"浅复制后的引用类型成员值"+copy2.test2.name);
System.out.println("浅复制前的对象是否相等"+(b==copy2));
//==比较的是对象的地址通过地址来观察是否相等或者是否另外创建了新的对象
System.out.println("浅复制前后普通成员变量是否相等"+(b.name==copy2.name));
System.out.println("浅复制前后引用类型变量的是否相等"+(b.test2.name==copy2.test2.name));
}
}
classshallowcopyimplementsCloneable
{
testtest1;
Stringnames;
publicshallowcopy(Stringnames,Stringobj)
{
this.names=names;
test1=newtest(obj);
}
//proteced属性
publicObjectclone()
{
try
{
//浅赋值直接调用父类的赋值函数
returnsuper.clone();
}
catch(CloneNotSupportedExceptione)//抛出异常
{
returnnull;
}
}
}
classdeepcopyimplementsCloneable
{
testtest2;
Stringname;
publicdeepcopy(Stringname,Stringobj)
{
//this.test2=o;
test2=newtest(obj);
this.name=name;
}
publicObjectclone()
{
deepcopys=newdeepcopy(name,test2.name);
returns;
}
}
classtest
{
Stringname;
inti;
publictest(Stringname)
{
this.name=name;
//this.i=i;
}
}
5.数组
packagetestt;
importjava.util.Arrays;
publicclassShuzu{
publicstaticvoidmain(String[]args){
//一位数组和二维数组的常用方法
System.out.println("一维数组部分方法测试");
int[]p={1,11,6,8,4,66,12};
//数组赋值函数
int[]s=newint[10];
s=Arrays.copyOf(p,p.length);
System.out.println("数组赋值(s是复制而来)");
//Duplicate重复
for(intt=0;t{
System.out.print(s[t]+"");
}
//排序函数
System.out.println("");
Arrays.sort(p);
System.out.println("数组排序函数(重排结果如下)");
for(intw=0;w
{
System.out.print(p[w]+"");
}
System.out.println("");
System.out.println("二维数组部分函数测试");
int[][]r={{2,2,3},{6,5,6},{6,5,6}};
for(intv=0;v{
for(intu=0;uSystem.out.print(r[v][u]+"");
System.out.println();
}
}
}
3.开发中遇到的问题与解决方法
1)类与类之间的关系模糊,致使在编程中期目标不明确
编程第一步应先进行总体规划,画出类图,明确类间层次关系
2)重写toString(),equals方法。
4.目前存在的问题与改进方案
equals方法简单实现。
可以进一步添加图形数据验证方法,例如:
三角形任意两边大于第三边,半径大于0等。
5.运行效果图