2016-08-05 60 views
-2
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的概念,因爲我知道,在方法重載,我們可以使用相同的方法名與不同的參數,但如我創建了卷方法,我不得不修改方法的名稱(volume,vol),以便重載卷方法並獲得答案。這是爲什麼?

+0

重載'volume()' - *因爲我知道在方法重載時,我們可以使用相同的方法名稱與不同的參數* - 關鍵詞是參數,您不能通過更改它們的返回來重載方法類型。 –

+0

原因很明顯:您將整數傳遞給構造函數,所以double值從不設置。他們總是零。 – duffymo

回答

1

以下行調用

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

調用方法public void Dimension(int height1, int width1, int depth1)因爲字面的25,32和65處理的類型的int

因此,字段Box25類的height, width, depth有默認值0.0因此輸出你get是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); 
    } 

} 

輸出:你好一倍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); 
    } 

} 

輸出:你好詮釋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); 
    } 

} 

輸出:你好長10

原因:由於存在用於值10(其是int類型的)不匹配的方法,它是晉升爲long。現在有一個接受long參數的方法,它被調用。

+0

爲什麼投?你可以使用十進制數字 –

+0

是的,那是另一種方法。我正在演示如何調用適當的方法。按照您提出的上述建議更新了答案 – JavaHopper

+0

,是否需要明確聲明爲25.0或25d?爲什麼自動型促銷概念不適用於此?我的意思是說,當我打電話雙卷方法爲什麼不自動獲得提升雙倍 –

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 
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; 
    } 

} 

您需要設置所有的變量。

現在這兩種方法都會返回你想要的。我仍然認爲你的方式是不必要的。

+0

是@Vijay Kannan ...建議的方式是從構造函數中分配值而不是'Dimension'方法 –

相關問題