这可能是堆栈溢出中有史以来最愚蠢的问题,但这让我很烦恼......
public class shorte
{
public static void main(String []args)
{
short e = 56; // no need for explicit cast
System.out.println(e);
start(56); // why does int literal here needs explicit cast ...
}
static void start(short e)
{
System.out.println(e);
}
}
从函数中的int文字创建正常的短变量时,不要求任何显式强制转换,但是 为什么将int literal传递给short变量(参数传递)需要显式转换...... ??
再次
我现在不建议在单个帖子中提出两个不相关的问题,但这在另一个帖子中提出的问题太过微不足道了。
**'的范围计数器变量**
public class forloop
{
public static void main(String []args)
{
int a =12;
for(int a =12;a<14;++a) // no showdowing of variable ,give compile-time error
{
System.out.println(a);
}
}
}
所以我尝试使用普通块
a=12
{
a=13; even this doesn't compile
}
这是否意味着,街区不具备自己的范围......
答案 0 :(得分:4)
short
文字可以从Java中的int
字面值自动构建。
short e=50;
但调用函数和传递参数是不同的。由于存在重载的可能性,函数调用应该与函数原型完全匹配。想象一个重载函数,其中一个版本的int
参数和另一个版本的short
参数。
至于第二个问题,在大多数语言中,您通常无法通过内部作用域中的相同标识符隐藏在外部作用域中声明的标识符。我头脑中有两个例外:
1-全局变量可以被局部变量隐藏(例如,在C ++中,因为Java没有全局变量)。
2-类数据成员可以被局部变量隐藏。
在这两种情况下,该语言都提供了一个解析运算符(:: for for 1- this
for 2-)。
答案 1 :(得分:3)
仅从技术角度出发(不推测原因;-)):它在the specification
a)
5.2分配转换
[...]另外,如果表达式是一个常量表达式( §15.28 )类型 字节 , 短 , 烧焦 , 要么 INT :
• 如果变量的类型是,则可以使用缩小的基元转换 字节 , 短 , 要么 烧焦 ,并且常量表达式的值可以表示为 变量的类型。
b)
6.4 阴影和模糊
[...]
如果是局部变量的名称,则是编译时错误 v 被重新宣布为当地人 直接封闭方法,构造函数或初始化程序块的变量 的范围 v ;或作为a的例外参数 抓住 条款 尝试 声明 范围内直接封闭的方法,构造函数或初始化程序块 的 v ;或者作为一种资源 尝试 - 直接封闭的资源声明 方法,构造函数或初始化程序块在范围内 v
答案 2 :(得分:2)
问题2:
int a =12;
for(int a =12;a<14;++a) // no showdowing of variable ,give compile-time error
{
System.out.println(a);
}
我认为理由是大多数时候,这不是故意的,而是编程或逻辑缺陷。
在一个像你一样微不足道的例子中,它很明显,但是在一大块代码中,意外地重新声明一个变量可能并不明显。
问题1:
在int版本中,编译器知道数字中的所有数据都可以短时间存储。没有信息丢失。对于字面值,这并不总是正确的。