我试图创建此程序,d
声明为double
而不是Double
,请您告诉我为什么此程序无法运行。是不是应该自动包装和解包,比如原始数据类型的装箱和拆箱?
附: - 我是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();
答案 0 :(得分:2)
String s = d.toString();
这是容易出错的代码,因为double
无法解除引用。明确地说,你必须将它包装到Double
。 ((Double)d).toString()
。
double
是原始类型,它没有toString
方法。只有对象包含方法。 toString
是Object
类的方法,您可以使用Double
方法{。}}。
toString
答案 1 :(得分: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);
......也会起作用。
答案 2 :(得分:1)
double
是原始数据类型,而Double
是包装类。使用Double可以调用toString()
之类的方法。你可以做点什么
Double d = 2.4;
d.toString();
但你不能做像
这样的事情double d = 2.4;
d.toString(); // Generates compile time error.
答案 3 :(得分: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.");
}
}
答案 4 :(得分:0)
由于没有Double
引用,因此未进行自动装箱。试试((Double)d).toString()
答案 5 :(得分:0)
d.toString();因为d是原始类型,所以不会起作用。您只能在对象上调用.toString函数。因此,如果您使用Double,它是一个对象而不是原始的,您的代码将起作用。它与自动装箱无关。
答案 6 :(得分:0)
程序无法运行的原因是因为您尝试在原始数据类型上调用方法。 Capital D double表示一个双重对象,其功能类似于原始双变量,因为它存储了双重值,但添加了一个功能,您可以在其上调用预定义的方法。
如果您想使用双原语,您可以执行以下操作:
double aDouble = 100;
String aString = Double.toString(aDouble);
将原语作为参数传递给Double对象上的方法,该对象将返回一个字符串。