课外天地 李树青学习天地Java程序语言课件 → 程序代码——利用继承实现的几个几何类


  共有15520人关注过本帖树形打印复制链接

主题:程序代码——利用继承实现的几个几何类

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1940 积分:26616 威望:0 精华:34 注册:2003/12/30 16:34:32
程序代码——利用继承实现的几个几何类  发帖心情 Post By:2006/2/26 21:45:07 [只看该作者]

点类:
public class Point
{
        protected int x;
        protected int y;
        
        public Point()
        {              
        }
        
        public Point(int x,int y)
        {
                this.x=x;
                this.y=y;
        }
        
        public void setX(int i)
        {
                x=i;
        }
        public int getX()
        {
                return x;
        }
        public void setY(int i)
        {
                y=i;
        }
        public int getY()
        {
                return y;
        }      
        
        public String toString()
        {
                return "("+x+","+y+")";
        }
}


圆类:
public class Circle extends Point
{
        protected int r;
        
        public Circle()
        {
        }
        
        public Circle(int x,int y,int r)
        {
                setPoint(x,y);
                setR(r);
        }
        
        public void setR(int rr)
        {
                r=rr;
        }
                
        public int getR()
        {
                return r;
        }
        
        public void setPoint(int i,int j)
        {
                x=i;
                y=j;
        }
        
        public String getPoint()
        {
                return super.toString();
        }
        
        public String toString()
        {
                return super.toString()+";Radius="+r;
        }
        
        public double getArea()
        {
                return Math.PI*r*r;
        }
}

圆柱类:
public class Cylinder extends Circle
{
        protected int height;
        
        public Cylinder()
        {
        }
        
        public Cylinder(int x,int y,int r,int h)
        {
                setCircle(x,y,r);
                setHeight(h);
        }
        
        public void setCircle(int x,int y,int r)
        {
                setPoint(x,y);
                setR(r);
        }
        
        public String getCircle()
        {
                return super.toString();
        }
        
        public void setHeight(int h)
        {
                height=h;
        }
        
        public int getHeight()
        {
                return height;
        }
        
        public String toString()
        {
                return super.toString()+";Height="+r;
        }
        
        public double getVolume()
        {
                return getArea()*height;
        }
}

应用程序:
public class exec
{
        public static void main(String [] args)
        {
                Cylinder cylinder=new Cylinder();
                cylinder.setCircle(1,2,3);
                cylinder.setHeight(2);
                System.out.println(cylinder.getCircle());
                System.out.println(cylinder.getHeight());
                System.out.println(cylinder.getVolume());
                System.out.println(cylinder.toString());
                
                
        }
}

[此贴子已经被作者于2010-12-12 07:43:40编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
admin
  2楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1940 积分:26616 威望:0 精华:34 注册:2003/12/30 16:34:32
同学作业中存在的十个主要问题!  发帖心情 Post By:2006/2/26 21:46:03 [只看该作者]

下面把同学普遍存在的主要错误说明一下:
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编辑过]

 回到顶部