如果 Java 是强类型的,那么为啥这段代码会编译? [关闭]

Posted

技术标签:

【中文标题】如果 Java 是强类型的,那么为啥这段代码会编译? [关闭]【英文标题】: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 位数字。这里没什么特别的。 【参考方案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 正确地指的是弱类型与强类型。您正在回答与他/她所要求的完全不同的问题

以上是关于如果 Java 是强类型的,那么为啥这段代码会编译? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥说 Python 是强类型语言

浅谈JIT编译器

为啥这段代码会给出“可能的空引用返回”编译器警告?

或者是无效的 C++:为啥这段代码会编译?

浅谈对JIT编译器的理解。

为啥这段代码会导致编译器在 Xcode 中报告“未使用的变量”