1

当我们将 123 传递给显示方法时,为什么它给出错误而使用变量 by1 传递相同的值被 JVM 接受。

以下两个陈述有什么区别 1.serv.display(123); 2.serv.display(by1);

public class Lab1 {

public static void main(String[] args) {
    MethodService serv=new MethodService();
    byte by1=123;
    serv.show(123);
    serv.show(by1);
    serv.display(123);
    serv.display(by1);
    }
}

class MethodService{
void show(int ab){
    System.out.println("---show(int)\t:"+ab);
}
void display(byte by1){
    System.out.println("display(byte)\t:"+by1);
}
}
4

5 回答 5

6
serv.display(123);

将抛出错误,因为没有名称 display 接受int值的方法。

serv.show使用byteand输入的原因int是方法输入类型是int. 这允许该方法接受可以由编译器自动转换为 int 的输入类型。因此,任何占用较少内存位(32 或更少)(例如byte(8 位))的数据类型都将自动转换为 int 值。

但是serv.display将输入视为byte这意味着该方法可以采用可以自动转换为字节的输入,即任何 8 位或更少的输入。当您将 an 传递int给它时,它无法自动转换需要 32 位,因为它超出了byte位范围。因此编译器会抛出错误。

于 2013-09-14T10:51:50.347 回答
2

display(byte b1)方法接受一个byte. 您正在传递,编译器将123其视为int

于 2013-09-14T10:46:27.160 回答
0

服务显示(123);

MethodService 类型中的方法 display(byte) 不适用于参数 (int)

于 2013-09-14T10:58:59.897 回答
0

display 方法接受byte类型的参数,并且您正在传递整数123

于 2013-09-14T11:03:11.397 回答
0

您需要添加一些演员表。

serv.display((byte)123); // requires a cast

有时需要强制转换,有时则不需要。以下是一些解释,以说明何时以及为什么需要它。

Java 有几种原始类型:

  • 字节(8 位)
  • 短(16 位)
  • 整数(32 位)
  • 长(64 位)

这很重要,因为如果将 32 位 ( int) 值分配给 8 位 ( byte) 变量,您实际上会丢失 24 位数字。这种类型的转换称为缩小原始转换cast为安全起见,编译器仅在您明确指定 a (例如)时才会接受(byte)123

因此,简单地说,每当您将较大类型(更多位)的值或变量传递给较小类型(较少位)之一时,您都需要进行强制转换。

(反之亦然)如果您需要将byte(8 位)传递给int(16 位),那么没有问题。编译器知道不会丢失任何数据,并且代码无需显式转换即可编译。因此,这就是您不需要为以下行进行强制转换的原因:

serv.show(by1); // does not require casts.

现在,您可能还想知道您的第一行代码,您实际上将整数分配给一个字节。所以理论上有些位可能会丢失。

byte by1 = 123; // assignments do not require casts.

但是,java 中的赋值转换比方法调用转换更宽容(或者更智能)。编译器知道上面的值 ( 123) 适合 a byte,并且会容忍它。

于 2013-09-14T14:18:21.757 回答