java:String不是基本类型,不是数组,是类,而数组也是类 |
您所在的位置:网站首页 › 类的对象是数组对象吗 › java:String不是基本类型,不是数组,是类,而数组也是类 |
本文可以用一句话总结:String不是基本类型,不是数组,是类,而数组也是类。 由于脚本语言使用较多,我在java中也写过这样的代码: String str = "hi"; System.out.println(str[1]); // 错误的可惜是错的。str是java.lang.String类的一个对象,无法使用[]运算符。真正可用的代码是这样的: String str = "hi"; System.out.println(str.charAt(1));数组是类 请参考java:反转数组,以及System.out的实现机制。 其实,从下面的语句就可以看出来: int[] ia = new int[9];也可以从下面的代码片段中看出来: char[] arr = {'a', 'b', 'c'}; char[] arr2 = arr; // 引用 System.out.println(arr); // abc System.out.println(arr2); // abc arr[1] = '6'; System.out.println(arr); // a6c System.out.println(arr2); // a6cString不是基本类型 java提供了8个基本类型,分别是:byte、short、int、long、float、double、boolean和char,并没有String。基本类型可以以下面的形式定义变量并赋值: int a = 5;上面的变量a是一个基本类型变量,不是对象,所以变量a没有任何属性和方法,只有值。 当然,这8个基本类型也有对应的类,分别是java.lang包下的Byte、Short、Integer、Long、Float、Double、Boolean、Character。这8个类都有一个私有的使用基本类型的变量value来保存值。 Java中有“自动装箱”、“自动拆箱”的概念,这是针对基本类型和它们对应的类而言的。 自动装箱:把基本类型用它们对应的引用类型包装起来,使它们具有对象的特质,可以调用toString()、hashCode()、getClass()、equals()等方法。 拆箱:跟自动装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为基本类型的数据。 注意:自动装箱和拆箱是由编译器来完成的,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。 代码示例: Integer a = 5; // 自动装箱 int b = new Integer(6); // 自动拆箱 System.out.println(a); // 5 System.out.println(b); // 6String不是数组 因为无法使用数组运算符[]。 String内部实现 String是一个类,具体是java.lang.String,查看其源码,可以看到 public final class String implements java.io.Serializable, Comparable, CharSequence { /** The value is used for character storage. */ private final char value[];char数组value用来存储字符串。注意char类型的下面的性质: char类型是一个单一的16位Unicode字符; 最小值是’\u0000’(即为0); 最大值是’\uffff’(即为65,535); char数据类型可以储存任何字符; 例子:char letter = ‘A’。 String类并没有暴露可以修改value的方法,所以可以认为String是无法修改的。 下面是一个示例: char[] arr = {'a', 'b', 'c'}; String str = new String(arr); System.out.println(arr); // abc System.out.println(str); // abc arr[1] = '6'; System.out.println(arr); // a6c System.out.println(str); // abc其中:new String(arr);使用了下面的构造方法: public String(char value[]) { this.value = Arrays.copyOf(value, value.length); }这相当于把arr的内容拷贝一份,让后让this.value指向它新生成的数组。所以,在arr[1] = ‘6’;后,字符串对象str的value并没改变。 那么”123”意味着? 看一下下面的代码: package hellojava; public class HelloJava { void hi(char[] arr) { System.out.println("hi, char[]"); } void hi(String str) { System.out.println("hi, String"); } public static void main(String[] args) { HelloJava hj = new HelloJava(); char[] arr = {'a', 'b'}; hj.hi("123"); // hj.hi({'a', 'b'}); // 错误 hj.hi(arr); } }运行结果是: hi, String hi, char[]所以”123”是代表着String。 如果上面的代码中,没有void hi(String str)方法,那么hj.hi(“123”);也会报错。 补充 String类下还有这个构造方法: String(char[] value, boolean share) { // assert share : "unshared not supported"; this.value = value; }如果该构造方法使用public修饰了,那么,下面的代码是成立的: // 这段代码在实际中是不成立的 char[] arr = {'a', 'b', 'c'}; String str = new String(arr, true); System.out.println(arr); // abc System.out.println(str); // abc arr[1] = '6'; System.out.println(arr); // a6c System.out.println(str); //-> 结果会是: a6c也就是String能被修改了,然而该构造方法没有使用public修饰。只有同在java.lang包中的类才能使用。 原帖(https://my.oschina.net/letiantian/blog/415858) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |