0

我试图用d声明为double和 not创建这个程序Double,你能告诉我为什么这个程序不运行吗?它不应该被自动包装和解包,比如原始数据类型的装箱和拆箱吗?PS - 我是 Java 新手,我不记得它实际上是什么,但我在某处读到这被称为原始类型的装箱和拆箱以在它们上运行方法。

public class ToStringDemo {

    public static void main(String[] args) {
        double d = 858.48;
        String s = d.toString();

        int dot = s.indexOf('.');

        System.out.println(dot + " digits " +
            "before decimal point.");
        System.out.println( (s.length() - dot - 1) +
            " digits after decimal point.");
    }
}

注意 - 上面的程序给出了错误String s = d.toString();

4

7 回答 7

2

字符串 s = d.toString();

它是容易出错的代码,因为double无法取消引用。明确地,您必须将其装箱为Double. ((Double)d).toString().

double是原始类型,它没有toString方法。只有对象包含方法。并且toStringObject类的方法,你可以使用Doublewhich has toStringmethod。

Double d = 858.48;
String s = d.toString();
于 2013-05-29T11:28:21.383 回答
1

您不能在原始类型上调用方法,例如double- 而您可以在包装类型上调用它们,例如Double. 这就是您提供的代码不起作用的原因。

装箱确实会自动发生 - 但只有当您有效地为其指定了转换目标时。例如,您可以使用:

double d = 858.48;
Double boxed = d;
String text = boxed.toString();

Double...但是如果没有在代码中提及,则不会发生中间转换。当然,您仍然可以在一行中完成:

String text = ((Double) d).toString();

您根本不需要装箱即可将值转换为字符串,请注意:

String text1 = String.valueOf(d);
String text2 = Double.toString(d);

...两者都可以工作。

于 2013-05-29T11:29:49.360 回答
1

double是原始数据类型,而Double是包装类。使用 Double 使您能够调用诸如toString(). 你可以做类似的事情

Double d = 2.4;
d.toString();

但你不能做类似的事情

double d = 2.4;
d.toString();    // Generates compile time error.
于 2013-05-29T11:30:38.893 回答
0

尝试这个..

 public class ToStringDemo {

public static void main(String[] args) {
    double d = 858.48;
    String s = String.valueOf(d);
    int dot = s.indexOf('.');
    System.out.println(dot + " digits " +
        "before decimal point.");
    System.out.println( (s.length() - dot - 1) +
        " digits after decimal point.");
}
}
于 2013-05-29T11:29:16.803 回答
0

它没有被自动装箱,因为没有Double参考。尝试((Double)d).toString()

于 2013-05-29T11:29:58.630 回答
0

d.toString(); 将不起作用,因为 d 是原始类型。您只能对对象调用 .toString 函数。所以如果你使用 Double,它是一个对象而不是原始的,你的代码就可以工作。它与自动装箱无关。

于 2013-05-29T11:30:24.877 回答
0

程序无法运行的原因是您试图调用原始数据类型的方法。Capital D double 表示一个双精度对象,其功能类似于原始双精度变量,因为它存储双精度值,但具有可以调用预定义方法的附加功能。

如果您想使用双原语,您可以执行以下操作:

double aDouble = 100;
String aString = Double.toString(aDouble);

原语作为参数传递给 Double 对象上的方法,该方法将返回一个字符串。

于 2013-07-16T18:48:07.230 回答