【问题标题】:If Java is Strongly typed then why does this code compile? [closed]如果 Java 是强类型的,那么为什么这段代码会编译? [关闭]
【发布时间】:2016-03-01 17:42:00
【问题描述】:

我对强类型的理解是该语言不会进行隐式类型转换。但是,此代码将 char 转换为它的 ascii 值,然后使用该值。

static char x = 'j';
static int y = 7;

public static void main(String[] args){
    System.out.println(y+x);
}

【问题讨论】:

  • “强类型”对不同的人有不同的含义,但在 Java 中有很多隐式转换。鉴于此问题依赖于“强类型”的含义,因此我投票决定将其作为基于意见的问题结束。
  • 字符只是一个无符号的 16 位数字。这里没什么特别的。

标签: java types casting strong-typing weak-typing


【解决方案1】:

如果 Java 是强类型的,那么为什么这段代码会编译?

因为JLS 是这么说的。在这种情况下,我们是widening a primitive,char 可以变成 int。然后我们可以添加两个整数并输出结果。然后,您可以根据需要将 narrow int 转换为 char。

System.out.println((char) (y+x));

【讨论】:

    【解决方案2】:

    这与强类型或弱类型无关。您的代码是两个强类型变量之间的隐式转换示例 - charint

    您的 System.out.println(y+x) 实际上已编译为 System.out.println(y+(int)x);,因此会调用 System.out.println(int arg0)

    演员 (int)x 将字符转换为其 ascii 值仅仅是因为 Java 将字符存储为 UTF-16 值。

    【讨论】:

      【解决方案3】:

      Java 是一种强类型编程语言,因为每个变量都必须用数据类型声明。一个变量在不知道它所能容纳的值范围的情况下是无法开始生命的,而且一旦被声明,变量的数据类型就不能改变。

      例子:

      以下声明是允许的,因为具有“hasDataType”的变量被声明为布尔数据类型:

       boolean hasDataType;
      

      在它的余生中,hasDataType 的值只能是 true 或 false。

      以及为什么在您的示例中将 char 转换为数字。

      System.out.println(y+x);
      

      你可以看看这个example

      【讨论】:

      • 您在这里定义的是静态类型与动态类型。 Op 正确地指的是弱类型与强类型。您正在回答与他/她所要求的完全不同的问题
      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      相关资源
      最近更新 更多