1、基础数据类型;
为什么优先级低于int的数据相加结果会是int;例始:byte a+ byte b 结果为int;
2,怎么理解JDK里的下面这句话;"字符串是常量;它们的值在创建之后不能改变。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享它们"分析:如果是因为String是声明为final的话,也只是说明类不能被extends,再者所有基础数据类型都是final的;

解决方案 »

  1.   

    1.Java编译时,可能会认为2个Byte相加时有机会大于Byte的长度,所以会自动转为整型再相加.
    2.字符串是常量我觉得没错,像"abc"就是一个字符串,当使用String st1 = "abc"; 后,st1的值就不能再改变.它会被分配到堆内存中存放,而在盏内存则放着st1相应的在堆内存中的地址,即st1是代表它在盏内存的地址,然后再通过这个地址,找到堆内存中找到相应的值"abc",这个值一旦创建就不可再修改内存中的值,当我们继续调用 st1 = st1+"a";后,具体的操作是会把st1+"a" 用另一个堆内存区来存放,然后把st1的地址再指向这个新的堆内存,所以st1就得到新的值"abca",与此同时,原来的值"abc"亦没有被释放,等待垃圾收集器回收.因此,认为字符串的值不可变.以上是我的理解.
      

  2.   

    第一个问题的解释可能是:
    因为byte本来就是一种整型变量,整型变量类型还包括short,int,long;
    byte用占8位即1个字节,表示数的范围是:-128-127;两个byte类型的变量相加很容易超出byte的表示范围.
    我想就是因为这个原因吧.
    short   16位,2个字节,范围:-32768-32767
    int   32位,4个字节,范围:-2147483648-2147483647,这个数字够大了,做为一般运算,再怎么运算也不会溢出的.
    long  64位,8个字节范围:-9223372036854775808-9223372036854775807第二个:
    String a="test";
    String b="test";
    a==b;//true;
    常量是说"test",不是在说a或者b,a和b只是一个引用而已.
    编译器执行第一句时,会先看内存中是否有"test",如果有就不创建了,直接用a来引用,如果没有就创建一个"test"的字符串,等到执行第二句时,内存中已经有了一个"test",所以就不直接创建一个b来应用它.这就说明a和b同时共享"test",a和b的改变不会影响到"test"的值.不知道我这么说你明白了没....这只是个人理解,期待老鸟解释.........
      

  3.   

    不能被继承只是不能被改变的具体表现之一
    编译时常量才必须是primitive type
      

  4.   

    Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar. 
    String的replace方法不通过直接改变String值的方式 而是返回一个新的String这一现象也从侧面反映了final String这一特性
      

  5.   

      对于第二个问题,我有点印象,好像是因为 JVM 在处理字符串时,采取了与其他对象不同的方式。其他对象都是保存在内存堆中,而引用保存在堆栈中,而字符串有一个专门的静态字符串池(具体名称不大记得了,好象是这个),所有显示定义的字符串(如:String a = "abc")都会保存在这个区域,而这些字符串是不能更改的,如果执行加减操作,并不会直接更改这个字符串,只是将它与想加的字符串加起来之后创建一个新的字符串保留在这一区域。
      这个问题初学Java的时候了解过一点,所以具体的名词可能有些差错,但基本的原理应该是这样的。
      

  6.   

    //不对啊,你们看:
    String a="asd";
           a="weroiuweroi";
    //这样也是可以,它的长度和内容全都改变了呀;
      

  7.   

    兄弟,a只是引用,引用可以指向任何的STRING对象,但是原来的"asd"还是没有改变,还是存在在内存内的
    比如说
    String a="asd";
    String b=a;
    a="weroiuweroi";
    a确实被改变了,因为它实际做了一个a=new String("weroiuweroi")的操作
    而b却没有被改变,从而说明"asd"没有被改变,而说明其final特性
      

  8.   


    String a="asd";  //a里存储的地址为: a001 
           a="weroiuweroi";  //更改后,a存储的地址则为 : a003也就是字符串改变后,返回了一个新的对象,并且把新对象的引用赋给了a.
      

  9.   


    我不同意你的意见,照你这样说int+int也可能出现超过int的情况,杂没自动转成比int长度的呢
    而str不能被改变,个人认为纯粹是国为sun JDK没提供修改的方法;第一种我理解是这样的
    在编程语言产生的初期,存储器比较小,所以从节药资源和性能上来说才会出现定义变量之说,定义变量类型有什么好处呢,看下面我的分析:
    在加载代码的时候,是按照一定的格式来存储的,这样有利于空音的合理利用,打个比方:假如你存一个 int a这个数,系统读到这就知道是int空间,然后分配相应的int空间量然后把这个值进去,假如 没有数据类型定义  a  当到这里以后,需先解析出a的值,然后再跟据a值来分配空间,明显后者要效率低且空易出问题,以上确定了为什么开发语言中会有基础数据类型的定义,当有定义以后,我们来关心另一问题,虽然java有8种基础数据类型,但是并不说明就一定有8种内存分配方式,我大胆推测,int以下的数据都是按int方式划分内存空间存储的,这也就能理解泽为啥结果会是int,再得switch  case也可以看出,这里只能是整数,但是确包括(byte,char,short,int);