Java 在变量声明中使用double vs double

Java 在变量声明中使用double vs double,java,wrapper,tostring,Java,Wrapper,Tostring,我试图创建此程序,其中d声明为double,而不是double,您能告诉我此程序为什么不运行吗。它不是应该被自动包装和解包吗,类似于基本数据类型的装箱和拆箱吗? 另外,我是Java新手,我不记得它的实际名称,但我在某个地方读到过,这被称为基本类型的装箱和拆箱,以便在它们上运行方法 public class ToStringDemo { public static void main(String[] args) { double d = 858.48;

我试图创建此程序,其中
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()处给出错误

字符串s=d.toString()

这是一种容易出错的代码,因为
double
无法取消引用。明确地说,您必须将其框到
Double
<代码>((双精度)d).toString()

double
是基元类型,它没有
toString
方法。只有对象包含方法。而
toString
Object
类的方法,可以使用
Double
,它有
toString
方法

Double d = 858.48;
String s = d.toString();
字符串s=d.toString()

这是一种容易出错的代码,因为
double
无法取消引用。明确地说,您必须将其框到
Double
<代码>((双精度)d).toString()

double
是基元类型,它没有
toString
方法。只有对象包含方法。而
toString
Object
类的方法,可以使用
Double
,它有
toString
方法

Double d = 858.48;
String s = d.toString();
试试这个

 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.");
}
}
试试这个

 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.");
}
}

您不能对基本类型(如
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);

。。。这两种方法都可以工作。

您不能在诸如
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);

。。。这两种方法都可以使用。

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

由于没有
Double
引用,因此它没有自动装箱。试试
((双)d.toString()
d.toString();将不起作用,因为d是基元类型。只能对对象调用.toString函数。因此,如果您使用Double,它是一个对象而不是原语,那么您的代码将正常工作。它与自动装箱无关。

d.toString();将不起作用,因为d是基元类型。只能对对象调用.toString函数。因此,如果您使用Double,它是一个对象而不是原语,那么您的代码将正常工作。它与自动装箱无关。

double
是一个原始数据类型,而
double
是一个包装类。使用Double可以调用类似于
toString()
的方法。你可以这样做

Double d = 2.4;
d.toString();
但是你不能做像这样的事情

double d = 2.4;
d.toString();    // Generates compile time error.

double
是一个基本数据类型,而
double
是一个包装类。使用Double可以调用类似于
toString()
的方法。你可以这样做

Double d = 2.4;
d.toString();
但是你不能做像这样的事情

double d = 2.4;
d.toString();    // Generates compile time error.

程序将不运行的原因是,您正试图对基元数据类型调用方法。大写D double表示一个double对象,它的功能类似于原语double变量,因为它存储了双值,但增加了一个功能,您可以对其调用预定义的方法

如果要使用double原语,可以执行以下操作:

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

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

程序不运行的原因是您试图调用原语数据类型上的方法。大写D double表示一个double对象,它的功能类似于原语double变量,因为它存储了双值,但增加了一个功能,您可以对其调用预定义的方法

如果要使用double原语,可以执行以下操作:

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

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

我认为您需要使用
string.valueOf(…)
将Double转换为字符串。@PradeepSimha它不是nasecary。简单方法:字符串s=“”+d;同样有效。我认为您需要使用
String.valueOf(…)
将双精度转换为字符串。@PradeepSimha它不是nasecary。简单方法:字符串s=“”+d;也可以。但当我们在SOP中打印时会发生什么,双d=3.4;Sysout(d),然后调用toString(),问题是为什么装箱不发生?好的,但是当我们在SOP中打印时会发生什么,double d=3.4;Sysout(d),然后调用toString(),问题是为什么拳击不发生??