Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 285|回复: 0

[Java基础知识]java的“别名”以及clone机制

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 17:04:06 | 显示全部楼层 |阅读模式
    1. 什么是别名?用个简单的例子说明
    2. public class Aliases{
    3.   int i;
    4.   public Aliases() {
    5.     i=1;
    6.   }
    7.   public Aliases(int i) {
    8.    this.i=i;
    9.   }   
    10.   public static void main(String args[]) {
    11.     Aliases A=new Aliases();
    12.     Aliases B=A; //A和B指向了同一个对象,A和B互为别名
    13.     System.out.println("A.i and B.i:"+A.i+" "+B.i);
    14.     System.out.println("增加B:");
    15.     B.i++;
    16.     System.out.println(("A.i and B.i:"+A.i+" "+B.i); }
    17.     }
    复制代码

       
      
    输出:
    A.i and B.i:1 1
    增加B:
    A.i and B.i:2 2

    很明显,A和B指向了同一个对象,B=A这个操作只是把A的引用复制给了B, 而对象并未拷贝。

    1. java是通过Rerference来操作对象的,上面是一个显式别名的例子,当你往函数内传递对象时
    2. 也会发生别名,如下:
    3. public class Aliases{
    4.    int i;
    5.    public Aliases() {
    6.      i=1;
    7.    }
    8.   public Aliases(int i) {
    9.     this.i=i;
    10.   }
    11.    public Increment(Aliases AS) {
    12.     AS.i++;
    13.   }
    14.    public static void main(String args[]) {
    15.      Aliases A=new Aliases();
    16.      System.out.println("A.i before Increment:"+A.i);
    17.      Increment(A);
    18.      System.out.println("A.i after Increment:"+A.i);
    19.   }
    20. }
    21. 你可以看到A在经过函数Increment()的调用后i的值发生了变化。在某种情况下,你可能不希望
    22. 传入的对象发生变化,希望函数内的对象只是传入对象的副本,对这个副本的改变不至于影响原
    23. 来的对象,那该如何处理?我们知道C++是通过把参数声明了const,就意味着此参数不可改变,
    24. 但是别忘了,C++有所谓的拷贝构造函数,所以在函数中的对象确实是拷贝,而java并未支持拷贝
    25. 构造函数,原因很明显,java传递对象的引用,你就算拷贝也只是引用的拷贝而已(所以有人说java
    26. 本质上只有传值)。那么就没办法了吗?有的,那就是“克隆机制”,在根类Object已经定义了
    27. clone()方法,你所要做的只是实现cloneable接口,并覆写clone()方法,典型的应用如下
    28. class CloneClass implements Cloneable{
    29.    public int aInt;
    30.    public Object clone(){
    31.      CloneClass o = null;
    32.      try{
    33.         o = (CloneClass)super.clone();
    34.     }catch(CloneNotSupportedException e){
    35.         e.printStackTrace();
    36.     }
    37.     return o;
    38.    }
    39.   }
    40.   调用super.clone()方法,它会为你自动处理存储分配和复制操作,有了clone机制,你就可以在
    41. 方法调用内部制造一个对象的副本了,它是局域性,对它的任何操作都不至于影响原对象的状态了。
    42. 我个人认为,这点对于编写一个安全的大型程序是非常重要的。

    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-7 23:44 , Processed in 0.392671 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表