java面试小知识Day001-1

复合运算能强制转换

在Java中,复合赋值运算符(如+=, -=, *=, /=等)确实可以在某些情况下执行隐式类型转换,但这种转换有一些限制和注意事项:

  1. 基本类型的隐式转换:
    对于基本数据类型,复合赋值运算符会自动执行必要的类型转换。例如:

    byte b = 10;
    b += 5; // 等价于 b = (byte)(b + 5)

    这里,b + 5的结果实际上是int类型,但复合运算符会自动将结果转换回byte类型。

  2. 不能用于扩大数据类型:
    复合赋值运算符不能用于将较小的数据类型转换为较大的数据类型。例如:

    int i = 10;
    long l = 5;
    i += l; // 编译错误,不能将long类型赋值给int

  3. 对象引用的限制:
    对于对象引用,复合赋值运算符不能改变引用的类型。例如:

    Object obj = “Hello”;
    String str = “”;
    str += obj; // 可以,因为这里实际上调用了obj.toString()
    // obj += str; // 编译错误,不能将String赋值给Object

  4. 数组的特殊情况:
    对于数组,复合赋值运算符不能改变数组的类型或维度。

为什么nextLine()需要 nextInt()消耗换行符

这个问题确实是由于 nextInt() 和 nextLine() 方法处理输入的方式不同而导致的:

  1. nextInt() 的行为:

    • nextInt() 方法读取一个整数。
    • 它会停在该整数之后,不会消耗掉整数后面的换行符(\n)。
  2. nextLine() 的行为:

    • nextLine() 方法读取一整行的输入,直到遇到换行符。
    • 它会消耗掉这个换行符,但不包括换行符在内的整行内容会被返回。
  3. 问题产生的过程:

    • 当您使用 nextInt() 后紧接着使用 nextLine() 时:
      • nextInt() 读取了整数,但留下了换行符。
      • 紧随其后的 nextLine() 会立即读取到这个换行符,然后就结束了,看起来好像它没有读取任何内容。
  4. 解决方案:

    • 在 nextInt() 之后额外调用一次 nextLine(),用来消耗掉那个剩余的换行符。
    • 这样,下一次真正需要用 nextLine() 读取内容时,就能正确地读取到用户输入的内容了。

示例:

Scanner scanner = new Scanner(System.in);

System.out.print("Enter a number: ");
int number = scanner.nextInt();
scanner.nextLine(); // 消耗掉换行符

System.out.print("Enter a string: ");
String text = scanner.nextLine();

System.out.println("Number: " + number);
System.out.println("Text: " + text);

在这个例子中,如果没有 scanner.nextLine(); 这一行,text 变量可能会得到一个空字符串,因为 nextLine() 会立即读取到 nextInt() 留下的换行符并结束。

这个问题不仅出现在 nextInt() 和 nextLine() 之间,也会出现在其他 nextXxx() 方法(如 nextDouble(), nextFloat() 等)和 nextLine() 之间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值