如楼主所说,10默认类型是int,当你用char c=10时,系统会进行隐式的类型转换.同理,byte
short..

解决方案 »

  1.   

    我觉得10 的默认类型short, 否则 int 是不能转为short 或者byte的。
    当数值超过32737才会默认为int.
    大家商榷
      

  2.   

    比较奇怪。
    任何数字的默认类型都是int.当你把它赋给short时,进行了转换。当数值溢出时会报错。
    赋给long,隐士转换 当然没有问题了。
      

  3.   

    我认为10的默认类型应该为byte(1个字节) 这样才能转换为short(2个字节)
      

  4.   

    楼上说的不对。可以试一下。
    class A {}classB{
    A a = 10
    }看它报的错就知道了。
      

  5.   

    同意heksn的意见,觉得这样可以节省内存(10占1Byte)。但就像qgdeng所说,如果如下程序:
    public class Test9{
    public static void main(String[] args){
    boolean b = 10;
    }
    }
    则报错:
    found   : int
    required: boolean
    boolean b = 10;
                                ^
    1 error
    可以看出10在java中似乎是int型的。
    有哪位大虾是JVM权威来说说,java中具体是如何分配数字型常量内存的(String的问题已经有好多人说了)。
      

  6.   

    其实这里涉及到精度的问题:对于float f = 10.0;   // error
    这是因为会损失精度,所以报错。对于byte b = 10;      // ok
    这是因为byte的容量可以表示10这个数字,不会损失精度,所以正确。如果你写byte b = 128; 就会损失精度,编译会报错。明白了吗?
    如果不明白,请举手!
      

  7.   

    Dynamic这是你自己理解的吧,你有什么证据吗?比如java规范上怎么说?jvm中怎么处理的?
      

  8.   

    再系统中10默认为int,而在java中当一张数据类型赋值给另一种类型的变量时,如果满足下面的条件,将执行自动类型转换:
     .两个数据类型是兼容的。
     .目标数据类型比源类型大。
    在此问题中还牵扯到了几个专业名词:宽类型转换和自动类型转换。
      

  9.   

    major_0119
    你是说byte和int兼容,所以可以把int类型的值10赋值给byte类型的变量吗。
    另请问什么是宽类型转换,这个概念没听过,你说的是强制类型转换吗?
      

  10.   

    thinking in java 第二版 侯捷 译 108 页 讲得很清楚。基本类型转型(除boolean,这个不能接受任何转型动作) 只要是宽化转换,就不需要明确指示。因为新型别能容纳来自是旧型别的信息,而不会遗失任何信息。只要有窄化转换时,编译器才会要求你强制转型。当然,class的型别不允许转型的。
      

  11.   

    int => float 就是宽化
    float => int 就是窄化
      

  12.   

    int => byte 是宽化??????????????????????????这才是大家讨论的地方,请注意.
      

  13.   

    public class Test9{
    public static void main(String[] args){
    int a = 10;
    byte b = a;
    }
    }Test9.java:4: possible loss of precision
    found   : int
    required: byte
                    byte b = a;
                             ^
    1 error
    public class Test9{
    public static void main(String[] args){
    byte b = 128;
    }
    }Test9.java:4: possible loss of precision
    found   : int
    required: byte
                    byte b = 128;
                             ^
    1 errorpublic class Test9{
    public static void main(String[] args){
    byte b = 10;
    }
    }ok也就是说在编译的时候,编译器会自动对赋值进行检查,如果能够确定赋值不会造成精度损失,将自动进行类型转换;反之如果超出精度范围或者是进行变量赋值无法准确确定是否会造成精度损失的话,将通不过编译。
      

  14.   

    10缺省就是int,这和 int a = 10; 有何区别?
    byte b = a;////////
      

  15.   

    gyang的问题很好,我有程序:public class TypeTeset{
    public static void main(){
    int a = 10;
    byte b = a;
    }
    }
    有如下错误:
    found   : int
    required: byte
    byte b = a;
                             ^
    那为什么 byte b = 10;就没错误呢?
      

  16.   

    看一下
    byte b = 10;和byte b = (byte)10; 
    编译出来的class有什么不同就可以了。没试过,但是我认为是没有不同的。这个是编译期优化。也就是整形(64bit long除外)只要不越界,就自动转型。还有1.0和1.0f的区别也可以看出来java中整形默认类型100000%是int(错了自己给自己100000个耳光:P),大家可以试试
    byte a = 10;
    byte b = 10;
    byte c = a + b;
    的编译结果了。有人提到JVM,我不清楚,但是我想这个和CPU有关,java支持的CPU都是32位以上的吧,所以计算的时候,计算的过程都是用32bit进行的吧。
    而且就上面的a+b是int类型的例子而言(其它short, char之间或者相互之间相加也是如此),因为他们相加可能会越界,因此使用了int, 而int之所以不管越界,就是因为32位cpu做int运算的电子电路只能出来两个正数相加等于负数的结果(最高位变1)。说错了,大家不要笑
      

  17.   

    先看一下下面的语句那些是非法的。byte b1=2;
    byte b2=1+1;
    byte b3=b1+1;
    byte b4=b1++;int i1=Integer.MAX_VALUE+1; //Integer.MAX_VALUE=2147483647
    int i2=2147483648;
    把byte改为char和short几乎是一样的。
    因为整数字面常量是int型的,也就是1和2都是int型的
    在赋值语句中直接把一个int型赋给byte肯定是不行的。
    int i=1;
    byte b=i;
    是编译不过的,因为隐性类型转换不允许,改为下面的就可以了
    int i=1;
    byte b=(byte)i;隐性转换一般都是放宽转换(如byte到int,String到Object)
    但是却有一个例外就是,在赋值转换中,
    隐性转换也包含了缩窄基本转换。就是从int到byte,char,short的转换:
    比如:
    byte b=1;//合法
    byte b=128; //非法右边必须为int型字面常量,而且值必须能被左边类型表示
      

  18.   

    隐性转换一般都是放宽转换(如byte到int,String到Object)
    但是却有一个例外就是,在赋值转换中,
    隐性转换也包含了缩窄基本转换。就是从int到byte,char,short的转换:
    比如:
    byte b=1;//合法
    byte b=128; //非法右边必须为int型字面常量,而且值必须能被左边类型表示----------------------------------------------
    请问,在哪些规范或书籍上有文字记载,谢谢.
      

  19.   

    似乎有点明白了.呵呵PS,JVM不是号称所有的基本类型在不同的JVM上长度都是一样的吗?所以楼上的某位似乎说错了.
      

  20.   

    gyang问的好,我也想知道到底在哪能确定一个问题的答案。
    或者能引经据典,或者可以在java编译器的处理或JVM内存分配上明确说明。
    否则,都很难说就是这样的。
      

  21.   

    帮我up一下:谢谢了http://community.csdn.net/Expert/topic/3354/3354538.xml?temp=.8964655
      

  22.   

    我在《java2学习指南〉上看到了,他们提了上面属于隐式变化。只能是直接赋值时。
      

  23.   

    在<java language Specification>中看到了说Integer literals的部分,不知是不是我们这的解。
    另有问题:
    int i1 = 4000000000;  //error!possible loss of precession
    int i2 = 0xffffffff;  //success!
    奇怪不?不知何解。