A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

寻得美好

中级黑马

  • 黑马币:80

  • 帖子:84

  • 精华:0

本帖最后由 寻得美好 于 2014-7-2 21:41 编辑

class Jia
{
        public static void main(String[] args)
        {
                final int a=11;
               
                short b;
                b=a;//    a是int类型的常量,这里编译为什么能通过呢?“=”运算符不含有隐式进行强制类型转换的功能
                System.out.println("\"short b\"="+b);
                b+=a;
                System.out.println("\"b+=a..\"="+b);
        }
}

11 个回复

正序浏览
我的理解是这样的:

byte a = 2;
a += 2;
//a = a+2;不能这样,a+2的结果会被转为int型,而一个int型的值不能赋给一个byte型的变量。
a = (byte)(a+2); //这样可以,且等价于 a+=2;
回复 使用道具 举报
寻得美好 发表于 2014-7-1 19:16
short b;
final int a=11;
int c=12;

[quote][/quote]因为"b=c"C是变量不确定的值,编译器不确定,编译不能通过,不会做强转(byte为最小数据类型,一个不确定变量只能>=byte类型,大变小 所以会提示损失精度)。而"b=a" a被final修饰相当于是常量,类型是确定的int型,编译器会做强转,编译通过。不知道我说明白了吗
回复 使用道具 举报
这是个很闲的问题.
回复 使用道具 举报
3楼说的不对.
b=a的实质是a是个全局常量,如果去掉final,a就是一个int型的变量,编译会报错的.因为编译器编译的时候会检测到语法错误(一个int型的变量要赋值给一个short型的变量会损失精度)
回复 使用道具 举报
DKID 中级黑马 2014-7-1 23:22:32
8#
寻得美好 发表于 2014-7-1 19:16
short b;
final int a=11;
int c=12;

b=a中被定义为final,而c是一个变量
回复 使用道具 举报
謓心い謓意 发表于 2014-7-1 18:34
对于b=a,编译器在编译时右边默认是int型,但编译器会判断这个数是不是在byte字节范围内【-128~127】如果在 ...

short b;
final int a=11;
int c=12;
b=c;//编译不通过  12在【-128~127】这个范围内  会提示损失精度
b=a;//编译通过   和b=c有什么不同?
回复 使用道具 举报
咋TAB就给回复了呢!郁闷
隐式类型转换举例:要求变量必须在所要转的数据类型里面,
    byte b = 2; 2本来默认是int类型的,不过他在byte范围内,就自动做了一个转换byte b  =(byte) 2;
   short s = 254;
   char ch = 65;这里65在ASSI表里代表的字符就是'A',这里就自动转换了
  char ch2 = 'A';
强制类型转换举例:
  long l = 123L;
  int i = (int)l;

你题目中的b+=a;  
实际就是b=b+a;但是这样写会报错,a为int类型,b+a无法赋值给short类型的
+=运算符在给s赋值时,自动完成了强转操作。
回复 使用道具 举报
对于 b+=a; 实际上“+=”是一个运算符 这种运算符内含了强制转换功能。等效于b=(short)(b+a)
回复 使用道具 举报
对于b=a,编译器在编译时右边默认是int型,但编译器会判断这个数是不是在byte字节范围内【-128~127】如果在这个范围的话会把a这个变量里的数进行强转,取这个数的最后一个字节赋值到b中(别问这个为什么,java编译器带的功能),这时候b就是byte型了在byte范围了,编译不会报错。
回复 使用道具 举报
隐式类型转换举例:
回复 使用道具 举报
=”运算符不含有隐式进行强制类型转换的功能
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马