第一个例子:import java.util.*;
class Obj
{
public double getVolume(double wid,double hei,double dep)
{//计算长方体的体积
return wid*hei*dep;
    } 
    public double getVolume(double rad,double hei)
    {//计算圆柱体的体积
      return Math.PI * rad * rad * hei;
    }
}
public class MethodOverload
{
public static void main(String args[]){
Obj box=new Obj();//盒子
System.out.println("长、宽、高分别为:10、20、30的盒子的体积为:"+box.getVolume(10,20,30));
Obj cylinder=new Obj();//圆柱体
System.out.println("低面半径、高分别为:10、20的圆柱体的体积为:"+cylinder.getVolume(10,20));
}
}

解决方案 »

  1.   

    第二个例子:
    //关于方法覆盖的例子
    class Obj
    {
    double getVolume(double width,double height,double depth)
    {//计算长方体的体积
    return width*height*depth;
        }
    }  
    class Cylinder extends Obj
    {
    double getVolume(double width,double height,double depth)
    {//计算圆柱的体积的2倍(覆盖了父类中的getVolume方法)
         return width*height*depth*2;
       }
    }
    public class MethodOverride
    {
    public static void main(String args[])
    {
    Obj box=new Obj();
    System.out.println("长、宽、高分别为:10、20、30的盒子的体积为:"+box.getVolume(10,20,30));
    Cylinder myCylinder=new Cylinder();
        //System.out.println("低面半径、高分别为:10、20的圆柱体的体积为:"+myCylinder.getVolume(10,20));   
        System.out.println("低面半径、高分别为:10、20的圆柱体的体积为:"+myCylinder.getVolume(10,20,30));          
        }
    }
      

  2.   

    程序本身没有问题,感觉在类的设计上就有问题,盒子和圆柱体应该是两个类,各自的属性不同,而且这样便于扩展,也更符合思维习惯,不要因为要使用overload,override而牵强的使用。:)
      

  3.   

    程序本身没有问题,感觉在类的设计上就有问题,盒子和圆柱体应该是两个类,各自的属性不同,而且这样便于扩展,也更符合思维习惯,不要因为要使用overload,override而牵强的使用。:)  --------------
      有同感,经典例子是那个 Shape 的吧,看一下就可以了呀。一般在父类中只定义一个抽象方法,留给子类自己去实现的。
        说你的第二个例子吧,如果你的 Obj box=new Obj(); 改成 Obj obj; 只创建一个引用,然后想算 box 的时候再创建对象 obj = new Obj(); 算完 Box 后,再 obj = new Cylinder(); 便可以接着算 Cylinder 了。比如说这样的话可能会稍微好一些吧。
    abstract class Shape
    {
        double getVolume();
    }
    class Box extends Shape
    {
        // 自己实现,类似地其它形状也这样
        double getVolume(...)
        {
            ....
        }
    }
      

  4.   

    我个人认为:
      你的第二个例子,
      class Cylinder extends Obj{
    double getVolume(double radius,double height){//计算圆柱的体积(覆盖了父类中的getVolume方法)
                return Math.PI * radius * radius * height;
    ***************************************************************************   }
    Cylinder类中定义的getVolume(double,double)方法并没有覆盖父类Obj的getVolume(double,double,double)
    只是重载了它而已,
    当你使用这个方法时,java会根据你的方法名和参数(个数和类型)到对象的所属类去寻找合适的方法
    ,假如找不到,就会到该类的父类中去找,直到找到为止。
    只有当方法的名称和参数(个数与类型)完全相同时才叫做方法的覆盖
      

  5.   

    回复人: yubokings(天涯) ( ) 信誉:100  2005-04-07 13:08:00  得分: 0  
     
     
       我个人认为:
      你的第二个例子,
      class Cylinder extends Obj{
    double getVolume(double radius,double height){//计算圆柱的体积(覆盖了父类中的getVolume方法)
                return Math.PI * radius * radius * height;
    ***************************************************************************   }
    Cylinder类中定义的getVolume(double,double)方法并没有覆盖父类Obj的getVolume(double,double,double)
    只是重载了它而已,
    当你使用这个方法时,java会根据你的方法名和参数(个数和类型)到对象的所属类去寻找合适的方法
    ,假如找不到,就会到该类的父类中去找,直到找到为止。
    只有当方法的名称和参数(个数与类型)完全相同时才叫做方法的覆盖=============================================楼上的说的很透彻,重载和覆盖都是对子类和父类同名方法的不同形态,对同一个类,怎么会重载???
      
     
      

  6.   

    class Obj{
    double getVolume(double width,double height,double depth){//计算长方体的体积
    return width*height*depth;
         }
    }
        -----------------------------------------------------
    程序本身写的很简洁,没有问题,但是上面这段代码怎么看都很不舒服,Obj类应该是长方体类和圆柱体类的超类,它对具体对象的形状一无所知,为什么用长、宽、高来计算体积呢?
      

  7.   

    太垃圾了,如果是作为OO教程中的例子,别人肯定不知所云
    用shape, circle, rectangle的draw()方法来说override就最好不过,
    很多书都是用这样的例子。至于overload就更容易了吧,可以以不同的
    构造函数来创建同一个类的实例对象作例子。上面什么obj, overload, override等类名看了就不爽
      

  8.   

    楼主辛苦了!
    楼主为何不用中文标识符? java支持unicode,可以用中文标识符,如果用了的话会更直观! ;)