在double,int,long和short类型中,有多少可以填充空白以使此代码输出0? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在double,int,long和short类型中,有多少可以填充空白以使此代码输出0? [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

static _____ defaultValue;

public static void main(String[] args){

    System.out.println(defaultValue);

}

选项:

A.一个

B.二

C.三

D.四

我书中的答案:

C.由于defaultValue是一个实例变量,它会自动初始化为该类型的相应值。对于double,默认值为0.0。相比之下,0intlongshort。因此选项C是正确的。

现在我的问题是defaultValue是一个静态变量,它怎么可能是一个实例变量?它不应该有任何初始值。请纠正我,因为我知道我错了。我正在攻读OCA java认证考试,我在Scott Selikoff和Jeanne Boyarsky的书中找到了这个问题。

答案

声明为类成员变量的变量(静态或实例)以及未赋值的变量将被赋予其默认值。注意defaultValue是一个静态类成员变量。

声明字段时并不总是需要分配值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型。 Primitive Data Types

将分配的默认值如下。

Default values

在给定的四种基本类型(double,int,long和short)中,每个将分配0,但是,输出取决于基元类型如何转换为String。从基元生成String的方式几乎相同,只是每种基本类型都有不同的方法。我们来看一下int基元类型:

通过调用System.out.println(int i),您可以使用System.out.print(int i)来有效地调用line.separator来终止该行,如PrintStream documentation.中所述.System.out.print(int i)方法采用String.valueOf(int i)生成的字符串,根据平台的默认字符编码将其转换为字节。最后,String documentation显示String.valueOf(int i)充当Integer.toString(int i)的包装

因此,通过调用toString()方法生成基本类型的String值,其中原始值作为对应于基元类型的包装类的参数(Integer表示int,Short表示简短等)。

这些方法如何将其默认值转换为String?问题中的所有原始值(double,int,long和short)都被赋值为默认值0(对于double为0.0d)。每个包装类的toString(primitive_type value)声明:

Double

如果m为零,则由字符“0.0”表示;因此,负零产生结果“-0.0”,正零产生结果“0.0”。 toString(double d)

Integer

返回表示指定整数的String对象。参数转换为带符号的十进制表示形式并作为字符串返回,就像参数和基数10作为toString(int,int)方法的参数一样。 toString(int i)

如果幅度为零,则由单个零字符'0'(' u0030')表示toString(int i, int radix)

Long

返回表示指定long的String对象。参数转换为带符号的十进制表示形式并作为字符串返回,就像参数和基数10作为toString(long,int)方法的参数一样。 toString(long i)

如果幅度为零,则由单个零字符'0'(' u0030')表示toString(long i, int radix)

Short

返回表示指定short的新String对象。假设基数为10. toString(short s)请注意,检查代码表明此方法只是return Integer.toString((int)s, 10);的包装器

因此,int,long和short将在值为0时输出字符'0',而double值将打印字符'0.0'。

另一答案

你怀疑,你书中的答案是错误的动机。

由于defaultValue是一个实例变量

这是一个static变量。如果它是一个实例变量,则此代码甚至不会编译。

它会自动初始化为该类型的相应值。

正确,但这适用于实例和静态变量。

对于double,默认值为0.0。相比之下,int,long和short为0。

关于它没有'相反'。在所有这些情况下,默认值实际上为零。 System.out.println()将在doublefloat的情况下打印0.0,但变量中的内容从零开始不可判断。

因此选项C是正确的。

关于它没有“因此”。这里有几个非sequiturs,以及几个事实的错误。

我在Scott Selikoff和Jeanne Boyarsky的书中找到了这个问题。

很高兴知道,所以我们可以避免它。

另一答案

书中写的内容是正确的,除了它所说的行“因为defaultValue是一个实例变量”。由于defaultValue是一个静态变量,因此它不能是实例变量,但它当然是一个类变量。由于它是一个类变量,因此会自动初始化为该类型的相应值。

另一答案

C.因为defaultValue是一个实例变量 - 这个语句是错误的,因为defaultValue不是一个实例变量 - 它是一个类变量,因为它的声明包含static关键字。静态变量与包含它们的类相关联。另一个值得一提的事实是静态变量在实例变量之前被初始化(实例变量不包含static作为它们的修饰符 - 每个实例都有自己的变量,并且该变量中的任何变化都不会影响其他实例的变量)。

现在我的问题是defaultValue是一个静态变量,它怎么可能是一个实例变量?它不应该有任何初始值。 - 这个说法是对的。它不是实例变量,而是类变量。无论如何它将具有初始值,因为只有局部变量没有初始化为它们的默认值(局部变量是那些,其范围是它们被声明的方法。例如,如果你在defaultValue方法或任何其他方法中声明了main()方法,它不会被初始化为其默认值。

当程序开始执行并且您没有为变量分配任何特定值时,包含基本类型的变量将初始化为其默认值(您可以在下面的链接中看到这些默认值的列表),包含对象的变量初始化为null

这里,在“默认值”段落中,是一个分配给基本类型的值列表:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

以上是关于在double,int,long和short类型中,有多少可以填充空白以使此代码输出0? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

java 变量数据类型转换?byte, short, char, int, long, float, double

Java语言中的String类跟byte、short、long、int、float、double、char、boolean等八大数据类型有什么不同?

Java中char,short,int,long占几个字节和多少位

c语言中如何将short,int,long,float这些类型的数值转换为字符串?

c语言中如何将short,int,long,float这些类型的数值转换为字符串?

数据溢出