JAVA中的指针,引用及对象的clone

Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。本文会让你了解什么是影子clone与深度clone,认识它们的区别、优点及缺点。

看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于使用早已臭名昭著的"GOTO"语句。Java放弃指针的概念绝对是极其明智的。但这只是在Java语言中没有明确的指针定义,实质上每一个new语句返回的都是一个指针的引用,只不过在大多时候Java中不用关心如何操作这个"指针",更不用象在操作C++的指针那样胆战心惊。唯一要多多关心的是在给函数传递对象的时候。如下例程:

package reference;
class Obj{
   String str = "init value";
   public String toString(){
     return str;
   }
}
public class ObjRef{
   Obj aObj = new Obj();
   int aInt = 11;
   public void changeObj(Obj inObj){
     inObj.str = "changed value";
   }
   public void changePri(int inInt){
     inInt = 22;
   }
   public static void main(String[] args)
   {
     ObjRef oRef = new ObjRef();
    
     System.out.println("Before call changeObj() method: " + oRef.aObj);
     oRef.changeObj(oRef.aObj);
     System.out.println("After call changeObj() method: " + oRef.aObj);
     System.out.println("==================Print Primtive=================");
     System.out.println("Before call changePri() method: " + oRef.aInt);
     oRef.changePri(oRef.aInt);
     System.out.println("After call changePri() method: " + oRef.aInt);
   }
}
/* RUN RESULT
Before call changeObj() method: init value
After call changeObj() method: changed value
==================Print Primtive=================
Before call changePri() method: 11
After call changePri() method: 11
*
*/

这段代码的主要部分调用了两个很相近的方法,changeObj()和changePri()。唯一不同的是它们一个把对象作为输入参数,另一个把Java中的基本类型int作为输入参数。并且在这两个函数体内部都对输入的参数进行了改动。看似一样的方法,程序输出的结果却不太一样。changeObj()方法真正的把输入的参数改变了,而changePri()方法对输入的参数没有任何的改变。

从这个例子知道Java对对象和基本的数据类型的处理是不一样的。和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。这种方式的参数传递被称为"值传递"。而在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。

除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。如:

package reference;
class PassObj
{
   String str = "init value";
}
public class ObjPassValue
{
   public static void main(String[] args)
   {
     PassObj objA = new PassObj();
     PassObj objB = objA;
     objA.str = "changed in objA";
     System.out.println("Print objB.str value: " + objB.str);
   }
}
/* RUN RESULT
Print objB.str value: changed in objA
*/

时间: 2024-08-06 23:17:59

JAVA中的指针,引用及对象的clone的相关文章

详解Java中的指针、引用及对象的clone

对象|详解 Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象.本文会让你了解什么是影子clone与深度clone,认识它们的区别.优点及缺点.看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的

译文:理解Java中的弱引用

不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?",我就会基本满意了,我并不期待回答是一篇诘究本末的论文描述. 然而事与愿违,我很吃惊的发现,在将近20多个有着平均5年开发经验和高学历背景的应聘者中,居然只有两个人知道弱引用的存在,但是在这两个人之中 只有一个人真正了解这方面的知识.在面试过程中,我还尝试提示一些东西,来看看有没有人突然说一声&qu

10分钟带你理解Java中的弱引用_java

前言 本文尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法. 一. What--什么是弱引用? Java中的弱引用具体指的是java.lang.ref.WeakReference<T>类,我们首先来看一下官方文档对它做的说明:      弱引用对象的存在不会阻止它所指向的对象被垃圾回收器回收.弱引用最常见的用途是实现规范映射(canonicalizing mappings,比如哈希表).      假设垃圾收集器在某个

Java中的强引用、软引用、弱引用和虚引用

Java中的强引用.软引用.弱引用和虚引用  原文链接:http://aaronfu.net/?p=9995 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用本章前文介绍的引用实际上都是强引用,这是使用最普遍的引用.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止

c++-C++中使用指针引用的问题

问题描述 C++中使用指针引用的问题 #include #include using namespace std; struct BSTNode { BSTNode left; BSTNode *right; int data; BSTNode(int value){ data=value; left=NULL; right=NULL; } }; class BST{ public: BST(){ root=NULL; } void insert(BSTNode *&ptr,int value)

Java中Json字符串直接转换为对象的方法(包括多层List集合)_java

使用到的类:net.sf.json.JSONObject  使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-beanutils.jar,commons-httpclient.jar,commons-lang.jar,ezmorph.jar,morph-1.0.1.jar 下面是例子代码: // JSON转换 JSONObject jsonObj = JSONObject.fromObject(jsonSt

工厂模式-java中工厂实例就是工厂对象对吗,和普通实例普通对象有什么区别

问题描述 java中工厂实例就是工厂对象对吗,和普通实例普通对象有什么区别 java中工厂实例就是工厂对象对吗,和普通实例普通对象有什么区别 解决方案 工厂实例就是这个工厂类的一个对象,跟普通实例对象没有什么区别的. 主要就是这个工厂实例的作用就是创建某种类型的对象的.即生产什么的工厂.

java中getA( ).getB( )意思就是 对象.对象那结果是什么

问题描述 java中getA( ).getB( )意思就是 对象.对象那结果是什么 java中getA( ).getB( )意思就是 对象.对象那结果是什么 结果还是一个对象么, 是不是子对象和父对象的意思呢 java没有这样的概念吧,应该如何理解呢 解决方案 这个要看 getA( ) 和 getB( ) 的具体实现,不能依赖于函数名来判断功能. 解决方案二: public class T2 { public static void main(String[] args) { new T2().

数据库-java中什么类,什么对象,什么方法,什么语句读取sql表文件的数据的

问题描述 java中什么类,什么对象,什么方法,什么语句读取sql表文件的数据的 java中什么类,什么对象,什么方法,什么语句读取sql表文件的数据的 解决方案 Statement或者preparedStatement类对应的实体对象,使用executeUpdate方法执行sql语句的查询操作.executeUpdate方法执行其他sql操作 解决方案二: http://blog.csdn.net/csh624366188/article/details/7305672/ 解决方案三: 这三个