byte或byte,请解释

  • 本文关键字:byte 解释 java byte
  • 更新时间 :
  • 英文 :


我正在JAVA中创建一个新的Byte对象,并使用Byte构建String,它给出了一个错误…

Byte B1 = new Byte((byte)41);
String S1 = new String(B1);

但是,当我使用byte而不是Byte时,没有问题

byte d[]= {65,48};
String s1 = new String(d);

有什么区别?

区别在于new String(byte[])有一个合适的构造函数重载,而new String(Byte)没有。

为什么?

  • 因为这是设计的方式。
  • 因为构造函数的设计目的。
  • 因为Java设计者认为通常来说,用构造函数和方法重载来处理很少使用的变量是一个坏主意。

你应该如何发现更多?例如,类型有哪些构造函数?他们是什么意思?

  • 通过阅读javadoc !

顺便说一下,自动拆箱/加宽与这个例子无关。没有String(byte)String(Byte)…或String(Object)构造函数。再多的拆箱或展开也不能使这个例子正常工作。

并且为了说明new String(...)不能与byte一起工作…

public class Test {
    String s = new String((byte) 42);
}
$ javac Test.java 
Test.java:2: error: no suitable constructor found for String(byte)
    String s = new String((byte) 42);
               ^
    constructor String.String(String) is not applicable
      (argument mismatch; byte cannot be converted to String)
    constructor String.String(char[]) is not applicable
      (argument mismatch; byte cannot be converted to char[])
    constructor String.String(byte[]) is not applicable                                                                                                       
      (argument mismatch; byte cannot be converted to byte[])                                                                                                 
    constructor String.String(StringBuffer) is not applicable                                                                                                 
      (argument mismatch; byte cannot be converted to StringBuffer)                                                                                           
    constructor String.String(StringBuilder) is not applicable                                                                                                
      (argument mismatch; byte cannot be converted to StringBuilder)                                                                                          
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output                                                                   
1 error                                                                       
$   

最大的区别是,在一种情况下,你使用的是数组,而在另一种情况下,你不是。

然而,值得指出的是,即使在这两种情况下都使用数组,也会有区别。即:
Byte[] d1 = {65,48};         // legal
byte[] d2 = {65,48};         // legal
String s1 = new String(d1);  // illegal
String s2 = new String(d2);  // legal

(注意:最好说Byte[] d1而不是Byte d1[];这两个是等价的,但是第一个清楚地表明Byte[]是变量的类型,而第二个包含在Java中只是作为对习惯以这种方式编写程序的C程序员的让步。

这里的要点是Java将自动装箱和自动装箱Bytebyte。也就是说,如果您有一个Byte变量并为它分配了一个byte,它将自动转换,反之亦然。然而,这种自动装箱和自动装箱并不适用于数组——Java 不会在之间自动转换Byte[]byte[]

不幸的是,我没有看到一个简单的方法来转换两种数组类型,除了使用Apache Commons有toObjecttoPrimitive数组转换(见这里)。

这是因为自动装箱和拆箱的工作方式。您可以在这里获得更多信息:http://beginnersbook.com/2014/09/java-autoboxing-and-unboxing-with-examples/

相关内容

  • 没有找到相关文章

最新更新