zoukankan      html  css  js  c++  java
  • String属于“假引用类型”,代码为证(一个String引发的血案...)

    一直以为String是引用类型,今天写了个浅拷贝的测试,发现String有基本类型的特征。

     1 class A{
     2     public int a = 555;
     3 }
     4 class User implements Cloneable{
     5     public String str = "aaa";//这个属于假引用类型
     6     public int a = 111;
     7     public A cls =new A();
     8     
     9     public void print(){
    10         System.out.println(str+a+cls.a);
    11     }
    12     
    13     @Override
    14     protected Object clone() {
    15         // TODO Auto-generated method stub
    16         try {
    17             return super.clone();
    18         } catch (CloneNotSupportedException e) {
    19             // TODO Auto-generated catch block
    20             e.printStackTrace();
    21         }
    22         return null;
    23     }
    24 }
    25 
    26 public class TestClone {
    27     
    28     public static void main(String args[]){
    29         User u = new User();
    30         
    31         User uclone = (User) u.clone();
    32         uclone.str = "bbb";
    33         uclone.a = 222;
    34         uclone.cls.a = 666;
    35         
    36         
    37         u.print();
    38         uclone.print();
    39     }
    40 
    41 }

    print结果:

    1 aaa111666
    2 bbb222666

    如果String是引用类型,那么对象u打印的结果就应该是aaa222666.而实际上str的内容并未因为uclone的修改而修改,说明他们指向的是不同的地址,那么str具有基本类型(8种:int long char float byte double boolean short)的特征。可是按照说法,它是一个类,应该是引用类,可为什么具有基本类型的特征呢?在这里求教java同仁,小菜求解。(开始我以我String是实现Cloneable接口的,从而修改它不会引起其他对象的变化,但String确实是没有实现Cloneable,这我就不解了。)

    ps:虽然不懂为什么,但一定会figure it out的。但在记忆的时候,要记住String是引用类型的特例。

    最后问下:是什么原因造成了String的这种特殊性?或者说我们自己可以自定义一个像String这样的类吗?

  • 相关阅读:
    【机器学习】关联规则挖掘(二):频繁模式树FP-growth
    【机器学习】关联规则分析(一):Apriori
    【机器学习】聚类算法——K均值算法(k-means)
    【机器学习】分类器组合——AdaBoost
    tensorflow 中 Cross Entropy算法理解
    修改文件夹中的文件名
    poj 2635
    噪音样本
    流量录制回放助力接口自动化测试
    git
  • 原文地址:https://www.cnblogs.com/cmgrass/p/3392116.html
Copyright © 2011-2022 走看看