如果 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】:这与强类型或弱类型无关。您的代码是两个强类型变量之间的隐式转换示例 - char
和 int
。
您的 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 是强类型的,那么为啥这段代码会编译? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章