下面把同学普遍存在的主要错误说明一下:
1、类和方法的名称起的要规范,不能随随便便的把诸如C、CC等难以看懂的符号作为它们的名称,同时也要注意单词的正确,如有人就用cubic(立方体)作为圆柱形的类名!还有的同学把对h属性操作的set方法和get方法写为诸如hset和hget的模样(应该是setH和getH)!
2、类中的set方法主要用于对类中的属性进行赋值,但是通常并不关心如何设置,即不用考虑用户是通过字符界面输入还是通过窗体界面输入,所以可以使用函数参数来将所需赋的值传递过来,无需指定输入的方式。如:
public void seth()
{
String str=javax.swing.JOptionPane.showInputDialog("Input the height of cylinder:");
height=Double.parseDouble(str);
}
应该写为:
public void seth(double h)
{
height=h;
}
3、类中的set方法一般无需返回数据,返回数据的方法应该是get方法,有的同学将setCylinder方法设定为返回体积,其实这是getCylinder的功能。同时,有的同学甚至把getCylinder方法设定为返回圆柱形高度,这也是让人不可理解的!
4、类的封装要严谨,具有一定功能的代码应该封装到一个类中。如圆柱形体积的计算应该封装到圆柱形类中,而不应该交于应用程序去完成,更不应该将圆柱形类和应用程序类混在一齐!
5、很多同学写成这个模样:
public void setVol()
{
v=3.14*(double)(r*r*h);
}
public double getVol()
{
return v;
}
可以看出此时的setV方法意义并不大,不如将setVol方法和getVol可以合并成一个getVol,即:
public double getVol()
{
v=3.14*(double)(r*r*h);
return v;
}
6、很多学生写成这个模样:
public void setVol(int r,int h)
{
v=pi*(double)(r*r*h);
}
public double getVol()
{
return v;
}
此时,圆柱形类存在逻辑错误的隐患,由于v变量可能由于外界调用setVol方法设置为新的体积值,从而和现有的其他诸如h等属性成员产生逻辑不相匹配的情况。此乃大忌!
7、不该继承的时候就无需继承,如应用程序就没有必要继承其他几何类,其实也不应该继承。有的同学写成这个模样:
public class cc extends c
{
public static void main(String args[])
{
c c1=new c();
c1.x=4;
c1.y=5;
c1.r=6;
c1.height=7;
c1.taoString();
}
}
8、有同学问:
圆柱形类中得到体积的方法:
public void js()
{
double volume=3.14*r*r*high;
System.out.println(volume);
}
应用程序调用此方法:
System.out.println(c.js());
既然圆柱形类有得到体积的方法,为什么在主函数中调用不起来?
回答:请注意js()函数定义为:public void js(),也就是返回类型为空,当然不能在main中打印了,应该将Cylinder类的js方法修改为:
public double js()
{
double volume=3.14*r*r*high;
return volume;
}
此时便可以调用了。如果不去修改圆柱形类,那么应该在主函数中调用方法为:c.js();
这也说明作为圆柱形类本身是不应该考虑输出界面的,相反它只需考虑输出什么即可,而在应用程序中去实现输出的界面。
9、有同学问:在Point类中定义了构造函数,为:
public Point(int x,int y)
{
this.x=x;
this.y=y;
}
为什么在圆柱形类中不定义构造函数会出错?
回答:子类在调用构造函数的时候,会先调用父类的构造函数,但是父类Point中只有含有参数的构造函数,而子类又没有把参数在调用父类构造函数的时候传给它,所以产生错误。解决方法有两个:
1)可以修改Point类,添加默认构造函数
public Point()
{}
2)可以在子类调用父类构造函数的时候传给它参数
public Circle()
{
super(0,0);
}
10、有的同学在圆柱形类中定义计算体积的方法如下:
public void js()
{
double volume=3.14*r*r*high;
}
注意:此方法中并没有返回体积值,也没有设置类的属性,只是设置一个方法中的局部变量volume,此volume变量会在方法结束被调用的时候销毁,所以,此方法没有任何结果留下来,没有任何意义!
应该修改为:
public double js()
{
double volume=3.14*r*r*high;
return volume;
}
关于局部变量,大家要注意,只能在定义此变量的方法中使用,而不能在其他方法中使用,如下面的定义是错误的:
public void js()
{
double volume=3.14*r*r*high;
}
public String toString()
{
return super.toString()+" "+"高:"+high+" "+"体积:"+volume;
}
解决方法为:
1)由于toString()方法不能访问js()中的局部变量,应该直接调用js()来得到体积,修改为toString:
public String toString()
{
return super.toString()+" "+"高:"+high+" "+"体积:"+js();
}
2)设置类的属性成员:double volume;
两个方法重新定义为:
public void js()
{
volume=3.14*r*r*high;
}
public String toString()
{
return super.toString()+" "+"高:"+high+" "+"体积:"+volume;
}
此时更加合理的做法是将名称定义规范:
public void setVolumn()
{
volume=3.14*r*r*high;
}
public String toString()
{
return super.toString()+" "+"高:"+high+" "+"体积:"+volume;
}
setVolumn方法意义并不大,完全可以取消,所以更加简单的做法为:
public String toString()
{
return super.toString()+" "+"高:"+high+" "+"体积:"+3.14*r*r*high;
}
[此贴子已经被作者于2010-12-12 07:44:03编辑过]