对Java中传值调用的理解分析

本文实例分析了Java中的传值调用。分享给大家供大家参考。具体分析如下:

Java以引用的方式操作对象实例

可以确认的是Java中操作对象的方式是以引用的方式操作对象。为了更深刻的了解这点我写了如下代码:

首先定义一个自定义类型

代码如下:

public class Person { 
     
    String name; 
     
    Person(String name){ 
        this.name = name; 
    } 
}

这里name默认是public哦(和C++中class的默认属性不一样哦)
然后Main函数中的调用如下:

代码如下:

public class Main { 
 
    /**
     * @param args
     */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
        Person p1 = new Person("Paul"); 
        Person p2 = new Person("Griefen"); 
         
        System.out.println("p1.name = " + p1.name + "   p2.name = " + p2.name); 
         
        Person tmp; 
        tmp = p1; 
        p1 = p2; 
         
        System.out.println("tmp.name = " + tmp.name + " p1.name = " + p1.name + " p2.name = " + p2.name); 
                 
    } 
 
}

这时候的输出结果如下:

代码如下:

p1.name = Paul  p2.name = Griefen 
tmp.name = Paul p1.name = Griefen p2.name = Griefen

咦?为什么是这样子一个结果呢?作为一个CPPer我感到很困惑!说好的是引用啊,那么执行了如下语句之后

代码如下:

Person tmp; 
tmp = p1; 
p1 = p2;

因为我按C++中引用的概念去理解这个操作,那么时候tmp p1 p2这时候应该都是同一个对象才对,即都应该指向p2这个对象啊。但是输出结果显然证明这样的理解是不对的!那么Java中的引用既然和C++中的引用不是一回事?!!!难道和C++中的指针是同一回事吗?

好!我们就按照C++中的指针来理解一下这个操作过程。

首先 Person tmp;是进行了一个指针的声明刚好和C++中的指针声明类似。而C++中明确的规定了引用的声明是不可以这样单独写的,引用声明的时候就应该指针一个对象,显然第一步的推理是正确的。这是一个好的开始!然后tmp = p1; p1 = p2; 显然是tmp指向了p1,p1指向了p2,核对一下输出结果。发现是吻合的!
那说明Java中的引用如果和C++中的数据操作做比较的话,应该和C++中的指针的概念更相近!

C++中指针实现上述功能

既然说上面的Java操作对象方式和C++中的指针相似,那我们就看一下C++中实现上面的方式是怎么实现的呢

代码如下:

#include "stdafx.h" 
#include <string> 
#include <iostream> 
 
class Person 

public: 
    std::string name; 
public: 
    Person(std::string name) 
    {  
        this->name = name; 
    }; 
}; 
 
int _tmain(int argc, _TCHAR* argv[]) 

    Person* p1 = new Person("Paul"); 
    Person* p2 = new Person("Griefen"); 
     
    std::cout<< "p1.name " << p1->name << " p2.name = " << p2->name << std::endl; 
 
    Person* tmp; 
    tmp = p1; 
    p1 = p2; 
 
    std::cout<<"tmp.name" << tmp->name << " p1.name " << p1->name << " p2.name = " << p2->name << std::endl; 
 
    delete tmp; 
    delete p1; 
    return 0; 
}

调试之后发现输出结果和上面Java的运行结果是一样的

任何语言的底层实现都是相同的

既然Java中的引用效果看起来和C++的指针是一样的为什么Java中不直接叫指针呢?显然还是有区别的,比如Java中的引用是不能进行++运算的,而C++的指针就可以而且移动也会很随意。显然就这一点来说Java就对它的指针做了大量的工作去限制它,让它运行起来更安全。但是不管上层看起来有多么大的却别,到了底层都需要去申请内存,内存用完了之后要释放。这是在任何一种语言中都要做的工作!

希望本文所述对大家的Java程序设计有所帮助。

(0)

相关推荐

  • Jquery之Bind方法参数传递与接收的三种方法

    方法一. function GetCode(event) { alert(event.data.foo); } $(document).ready(function() { $("#summary").bind("click", {foo:'abc'} ,GetCode); }); 方法二. 函数句柄 $("#summary").bind("click", function() { GetCode("abc"

  • Java方法参数是引用调用还是值调用?

    方法调用(call by) 是一个标准的计算机科学术语.方法调用根据参数传递的情况又分为值调用( call by reference ) 和引用调用( call by value ) .江湖上有很多关于这两种调用的定义 ,最通常的说法是传递值的是值调用,传递地址的是引用调用.这其实很不恰当,这种 这些说法很容易让我们联想到Java的对象参数传递是引用调用,实际上,Java的对象参数传递仍然是值调用 . 我们首先用一段代码来证实一下为什么Java的对象参数传递是值调用. public class

  • JQuery中$.ajax()方法参数详解及应用

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求. 如果需要发送同步请求,请将此选项

  • PHP获取当前日期和时间及格式化方法参数

    使用函式 date() 实现 复制代码 代码如下: <?php echo $showtime=date("Y-m-d H:i:s");?> 显示的格式: 年-月-日 小时:分钟:秒 相关时间参数: a - "am" 或是 "pm" A - "AM" 或是 "PM" d - 几日,二位数字,若不足二位则前面补零; 如: "01" 至 "31" D - 星期几

  • Js-$.extend扩展方法使方法参数更灵活

    在做JS开发时,我们将第三方复杂的插件进行封装,然后对外公开一个很简单的方法接口,这是开发时常用的方法,在JS里,我们的方法参数通常使用JQ的$.extend 扩展方法来实现 复制代码 代码如下: function extend(arr) { arr = $.extend({ name: 'zzl', sex: 'male', age: 31 }, arr || {}); alert("[Name:]" + arr.name + "[Sex:]" + arr.sex

  • batchcollect pagecollect来自官方杰奇jieqi定时采集配置方法参数详解第1/2页

    前言 要实现采集,默认方式是根据配置好的采集规则,在浏览器提交相应的参数即可完成后面的采集入库全部动作. 而实现定时采集,与人工在浏览器提交有些区别,主要分两大步骤: 一.编写采集的url和相关参数,访问这个url即可实现想要的采集模式.(这个url直接在浏览器提交同样可以实现采集) 二.把定时访问这个url的功能加到系统的定时任务里面,实现无人值守的定时采集. 具体实现方法请参考下面内容: 1.对采集配置文件的解释 任何一个采集都会用到两个采集配置文件(跟后台采集规则配置对应),都可以用文本编

  • 对Java中传值调用的理解分析

    本文实例分析了Java中的传值调用.分享给大家供大家参考.具体分析如下: Java以引用的方式操作对象实例 可以确认的是Java中操作对象的方式是以引用的方式操作对象.为了更深刻的了解这点我写了如下代码: 首先定义一个自定义类型 复制代码 代码如下: public class Person {            String name;            Person(String name){          this.name = name;      }  } 这里name默认是

  • java 中Buffer源码的分析

    java 中Buffer源码的分析 Buffer Buffer的类图如下: 除了Boolean,其他基本数据类型都有对应的Buffer,但是只有ByteBuffer才能和Channel交互.只有ByteBuffer才能产生Direct的buffer,其他数据类型的Buffer只能产生Heap类型的Buffer.ByteBuffer可以产生其他数据类型的视图Buffer,如果ByteBuffer本身是Direct的,则产生的各视图Buffer也是Direct的. Direct和Heap类型Buff

  • 谈谈对Java中的volatile的理解

    前言 volatile相关的知识其实自己一直都是有掌握的,能大概讲出一些知识,例如:它可以保证可见性:禁止指令重排.这两个特性张口就来,但要再往深了问,具体是如何实现这两个特性的,以及在什么场景下使用volatile,为什么不直接用synchronized这种深入和扩展相关的问题,就回答的不好了.因为volatile是面试必问的知识,所以这次准备把这部分知识也给啃掉. 系统处理效率与Java内存模型 在计算机中,每条程序指令都是在CPU中执行的,而CPU执行指令的数据都是临时存储在内存中的,但是

  • java中join方法的理解与说明详解

    前言: java 中的 join() 方法在多线程中会涉及到,这个方法最初理解起来可能有点抽象,用一两次大概就懂了.简单说就是当前线程等待调用join方法的线程结束才能继续往下执行. 1. 举个例子 如下, MyRunnable 类是实现 Runnable 接口的多线程类,其run() 方法是一个计算,计算值存储在 result 字段,获取计算结果就必须等线程执行完之后调用 getResult() 获取 public class MyRunnable implements Runnable {

  • Java中ThreadLocal的一些理解

    前言 面试的时候被问到ThreadLocal的相关知识,没有回答好(奶奶的,现在感觉问啥都能被问倒),所以我决定先解决这几次面试中都遇到的高频问题,把这几个硬骨头都能理解的透彻的说出来了,感觉最起码不能总是一轮游. ThreadLocal介绍 ThreadLocal是JDK1.2开始就提供的一个用来存储线程本地变量的类.ThreadLocal中的变量是在每个线程中独立存在的,当多个线程访问ThreadLocal中的变量的时候,其实都是访问的自己当前线程的内存中的变量,从而保证的变量的线程安全.

  • Java中SPI的一些理解

    前言 最近在面试的时候被问到SPI了,没回答上来,主要也是自己的原因,把自己给带沟里去了,因为讲到了类加载器的双亲委派模型,后面就被问到了有哪些是破坏了双亲委派模型的场景,然后我就说到了SPI,JNDI,以及JDK9的模块化都破坏了双亲委派. 然后就被问,那你说说对Java中的SPI的理解吧.然后我就一脸懵逼了,之前只是知道它会破坏双亲委派,也知道是个怎么回事,但是并没有深入了解,那么这次我就好好的来总结一下这个知识吧. 什么是SPI SPI全称Service Provider Interfac

  • java 中volatile和lock原理分析

    java 中volatile和lock原理分析 volatile和lock是Java中用于线程协同同步的两种机制. Volatile volatile是Java中的一个关键字,它的作用有 保证变量的可见性 防止重排序 保证64位变量(long,double)的原子性读写 volatile在Java语言规范中规定的是 The Java programming language allows threads to access shared variables (§17.1). As a rule,

  • java 中RandomAccess接口源码分析

    java 中RandomAccess接口源码分析 RandomAccess是一个接口,位于java.util包中. 这个接口的作用注释写的很清楚了: /** * Marker interface used by <tt>List</tt> implementations to indicate that * they support fast (generally constant time) random access. The primary * purpose of this

  • 老生常谈Java中instanceof关键字的理解

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: result = object instanceof class 参数: Result:布尔类型. Object:必选项.任意对象表达式. Class:必选项.任意已定义的对象类. 说明: 如果 object 是 class 的一个实例,则 instanceof 运算符返回 true.如果 object

  • java编程中实现调用js方法分析

    本文实例讲述了java编程中实现调用js方法.分享给大家供大家参考,具体如下: /* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); try { String str="2&1"

随机推荐