运行时重载的方法解析以及类型提升的工作原理?

时间:2016-08-05 04:27:33

标签: java methods int double overloading

package arunjava;

public class sample3 {

    public static void main(String[] args) {
        Box25 b1 = new Box25();
        Box25 b2 = new Box25();


        b1.Dimension(25, 32, 65);
        b2.Dimension(25, 45, 62);

        System.out.println("volume is" + b1.volume());
        System.out.println("volume is" + b2.volume());

        b1.Dimension(4, 6, 8);
        b2.Dimension(6, 8, 4);

        System.out.println("volume is" + b1.vol());
        System.out.println("volume is" + b2.vol());
    }
}

class Box25 {
    double height, width, depth;

    int height1, width1, depth1;

    public void Dimension(double height, double width, double depth) {
        this.height = height;
        this.width = width;
        this.depth = depth;
    }

    public void Dimension(int height1, int width1, int depth1) {
        this.height1 = height1;
        this.width1 = width1;
        this.depth1 = depth1;
    }

    double volume() {
        return height * depth * width;
    }

    int vol() {
        return height1 * depth1 * width1;
    }
}

我在Java教程中创建了上述程序。问题是我无法计算具有双数据类型的框的音量。

程序结果显示如下:

volume is0.0
volume is0.0
volume is192
volume is192

其次,我对方法重载的Java概念感到困惑,因为我知道在方法重载中我们可以使用相同的方法名称和不同的参数但是当我创建了卷方法时,我不得不修改方法的名称(音量,体积),以便超载音量方法并得到答案。为什么会那样?

3 个答案:

答案 0 :(得分:1)

以下行调用

b1.Dimension(25, 32, 65);
b1.Dimension(4, 6, 8);

调用方法public void Dimension(int height1, int width1, int depth1),因为文字25,32和65的处理类型为int

因此,类height, width, depth的字段Box25的默认值为0.0,因此您得到的输出为0.

通过调用适当的方法

,有多种方法可以解决问题

方法1:

b1.Dimension((double)25, (double)32, (double)65);
b1.Dimension((double)4, (double)6, (double)8);

方法2:

double h = 25, w = 32, d = 65;
b1.Dimension(25, 32, 65);

方法3:

b1.Dimension(25.0, 32.0, 65.0);
b1.Dimension(4.0, 6.0, 8.0);

为什么int参数已通过,未提升为double

  • 在运行时,分辨率首先通过参数类型的完全匹配来实现
  • 如果找到匹配类型,则调用具有完全匹配参数的方法
  • 如果没有完全匹配的参数,那么类型将被提升为下一个更高的类型,如果匹配,则调用该方法。

示例1:

public class OverloadingDemo {

    public static void main(String args[]) {
        OverloadingDemo obj = new OverloadingDemo();
        obj.sayHello(10);
    }

    public void sayHello(double x) {
        System.out.println("Hello double  " + x);
    }

}

输出: Hello double 10.0

原因:由于没有值10的匹配方法(类型为int),因此会将其提升为long。由于没有接受long参数的匹配方法,因此将其提升为double。现在有一个接受double参数的方法,它被调用。

示例2:

public class OverloadingDemo {

    public static void main(String args[]) {
        OverloadingDemo obj = new OverloadingDemo();
        obj.sayHello(10);
    }

    public void sayHello(int x) {
        System.out.println("Hello int  " + x);
    }

    public void sayHello(double x) {
        System.out.println("Hello double  " + x);
    }

}

输出: Hello int 10

原因:由于存在值10的匹配方法(类型为int),因此会调用它。

示例3:

public class OverloadingDemo {

    public static void main(String args[]) {
        OverloadingDemo obj = new OverloadingDemo();
        obj.sayHello(10);
    }

    public void sayHello(long x) {
        System.out.println("Hello long  " + x);
    }

    public void sayHello(double x) {
        System.out.println("Hello double  " + x);
    }

}

输出: Hello long 10

原因:由于没有值10的匹配方法(类型为int),因此会将其提升为long。现在有一个接受long参数的方法,它被调用。

答案 1 :(得分:1)

我认为有两组属性是错误的。以下是我的写作方式。

public class Box {

   private final double l, h, w;

   public Box(double length, double height, double width) {
      this.l = length; 
      this.h = height;
      this.w = width;
   }

   public double getVolume() { return this.l*this.h*this.w; }
}

如上所述,没有什么可以阻止你进入负面或零面。那有意义吗?你应该怎样做才能保证合理的价值?

如果您坚持要上课,请按照以下方法解决问题:

class Box25
{
    double height,width,depth;

    int height1,width1,depth1;

    public void Dimension(double height, double width, double depth)
    {
        this.height=height;
        this.width=width;
        this.depth=depth;

        this.height1 = (int) height;
        this.width1 = (int) width;
        this.depth1= (int) depth;

    }

    public void Dimension(int height1, int width1, int depth1)
    {
        this.height1=height1;
        this.width1=width1;
        this.depth1=depth1;

        this.height = height1;
        this.width = width1;
        this.depth = depth1;    
    }

      double volume()
    {
        return height*depth*width;
    }
     int vol()
    {
        return height1*depth1*width1;
    }

}

您需要设置所有变量。

现在两种方法都会返回你想要的东西。我仍然认为你的方式是不必要的。

答案 2 :(得分:0)

指定它是双重值,如下所示:

public static void main(String[] args) 
    {
        Box25 b1=new Box25();
        Box25 b2=new Box25();


        b1.Dimension(25d, 32d, 65d);
        b2.Dimension(25d, 45d, 62d);
        ...
        ...
}

<强>输出

volume is52000.0
volume is69750.0
volume is192
volume is192