第一个例子: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));
}
}
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));
}
}
//关于方法覆盖的例子
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));
}
}
有同感,经典例子是那个 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(...)
{
....
}
}
你的第二个例子,
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会根据你的方法名和参数(个数和类型)到对象的所属类去寻找合适的方法
,假如找不到,就会到该类的父类中去找,直到找到为止。
只有当方法的名称和参数(个数与类型)完全相同时才叫做方法的覆盖
我个人认为:
你的第二个例子,
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会根据你的方法名和参数(个数和类型)到对象的所属类去寻找合适的方法
,假如找不到,就会到该类的父类中去找,直到找到为止。
只有当方法的名称和参数(个数与类型)完全相同时才叫做方法的覆盖=============================================楼上的说的很透彻,重载和覆盖都是对子类和父类同名方法的不同形态,对同一个类,怎么会重载???
double getVolume(double width,double height,double depth){//计算长方体的体积
return width*height*depth;
}
}
-----------------------------------------------------
程序本身写的很简洁,没有问题,但是上面这段代码怎么看都很不舒服,Obj类应该是长方体类和圆柱体类的超类,它对具体对象的形状一无所知,为什么用长、宽、高来计算体积呢?
用shape, circle, rectangle的draw()方法来说override就最好不过,
很多书都是用这样的例子。至于overload就更容易了吧,可以以不同的
构造函数来创建同一个类的实例对象作例子。上面什么obj, overload, override等类名看了就不爽
楼主为何不用中文标识符? java支持unicode,可以用中文标识符,如果用了的话会更直观! ;)