- 浏览: 1588015 次
- 性别:
- 来自: 吉林
文章分类
- 全部博客 (624)
- C/C++ (33)
- Java (181)
- 网络相关 (7)
- 我爱篮球 (3)
- 也爱足球 (4)
- 杂谈 (1)
- 系统架构 (3)
- Web Service (14)
- Framework (3)
- 系统命令 (8)
- 管理平台相关 (8)
- 其它 (35)
- Websphere (1)
- Struts2 (24)
- Hibernate (16)
- Spring (23)
- javascript (20)
- jquery (23)
- html/css/div (28)
- 数据库 (40)
- JavaWeb (27)
- 设计模式 (2)
- 文档编写 (3)
- SVN (5)
- Ant (1)
- Maven (13)
- 软件项目管理 (8)
- AOP (1)
- kindeditor (1)
- JSON (2)
- Servlt/JSP (4)
- WordXML (2)
- XML (12)
- 面试相关 (7)
- Tomcat (11)
- 性能与调优 (29)
- 职业发展 (2)
- 操作系统 (7)
- AJAX (2)
- DWR (1)
- Eclipse (12)
- 持续集成 (3)
- 批处理命令 (1)
- Mozilla Rhino (2)
- 新鲜技术 (18)
- Apache mina (2)
- 底层技术 (18)
- Linux (22)
- 新鲜技术,IT历史 (1)
- 敏捷开发 (1)
- 版本控制 (5)
- 较火技术 (7)
- 集群 (2)
- Web前端 (13)
- 报表工具 (3)
- 网站架构 (5)
- 大数据 (8)
- 分布式存储 (5)
- 云计算 (8)
- TCP/IP协议 (1)
- 负载均衡 (3)
- 硬件 (1)
- 表现层技术 (3)
- Velocity (3)
- jvm (6)
- 并发编程 (10)
- hadoop (8)
- 数据结构和算法 (12)
- 计算机原理 (1)
- 测试驱动开发-TDD (3)
- 开发技巧 (1)
- 分词器 (1)
- 项目构建工具 (2)
- JMX (4)
- RMI (1)
- 测试技术 (22)
- 网络完全 (1)
- Git (4)
- apache开源包 (4)
- Java常用 (1)
- mock (2)
- OSGi (2)
- MongoDB (1)
- JBPM (1)
- Storm (3)
- mysql (2)
- telnet (1)
- 正则表达式 (1)
- bootstrap (4)
- Apache ActiveMQ (1)
- redis (9)
- Nginx (2)
- rsync+inotify文件同步 (2)
- testng (1)
- 原型设计工具 (1)
- 工程能力 (1)
- 风险控制 (3)
- ibatis (1)
- 分布式 (4)
- 安全技术 (1)
- 计算机基础 (4)
- 消息中间件 (1)
- UML (2)
最新评论
-
u012236967:
java命令执行jar包(里面的main函数)的方式(包括依赖其它的jar包问题) -
世界尽头没有你:
Selenium自动化测试从入门到精通(Java版)百度网盘地 ...
自动化测试工具 Selenium WebDriver 入门教程(针对主流浏览器) -
小小西芹菜:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
dwr实现Reverse Ajax推送技术的三种方式 -
hellozhouqiao:
楼主,请教一点问题.现在我们需要在excel 的页脚里面加上图 ...
FreeMaker + xml 导出word(处理目录,图片和页眉页脚问题) -
乱在长安:
使用Timer会有各种各样的问题好嘛?!书上推荐使用Sched ...
DelayQueue (ScheduledThreadPoolExecutor调度的实现)
在java和C++中都采用了引用这个概念,但是二者的行为并不一样。java的引用其实更象c++中的指针,而非c++中的引用,的确c++的指针给我们带来强大威力的同时,也给我们带来了危险,大多的攻击也都是利用指针让系统崩溃。在许多书上都没有见到关于java中reference行为的更详细的探讨,本文便从与c++的的区别谈起:
一.先看java中的引用:
- class Person
- {
- private String name;
- public Person(String name)
- {
- this.name=name;
- }
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- }
class Person { private String name; public Person(String name) { this.name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
现产生两个对象 :
Person p1=new Person("Zhangsan"); Person p2=new Person("Lisi");
引用Person p=p1,p1=p2;
测试结果p.getName(): Zhangsan;
p1.getName():Lisi;
P2.getName :Lisi;
而在c++的引用中其结果应该都是Lisi即p2的name(因为p1的改变会影响p);
上述结果显示:在java中referece其行为就是c++中的指针,而不是c++中的引用.
但是java的referece是一种安全的指针,不仅受到编译器的保护,还受到执行系统的保护。但java没有“指针”运算。c++中的引用感觉叫做别名更合适,许多语言都用alias关键字来定义别名。
二、java中的参数传递问题--By value or By reference
java中的参数传递都是采用by value.其实这句话是个笼统的说法,如果不加思索或许不能理解其真正的含义。
首先说什么是by value,by value是指在参数结合的时候,形参是否是实参的一个副本,如果产生这个副本那么我们说是by value,否则我们说是by reference.
java中的基本类型和c、c++语言一样采用by value传参是毋庸置疑的。
那么java有在参数传递的时候有没有by reference?回答是否定的。java中的一切类型在传递参数的时候都是传值的。
首先,我们想想c++和java中的对象有什么区别?其实没有什么区别,只是java中的对象必须由reference来持有,而c++的对象可以单独存在。那好,那就让我们看看java是怎么传递对象的:
- public static void swap(Person person1, Person person2) // doesn't work
- {
- Person temp = person1;
- person1 = person2;
- person2 = temp;
- }
- Person a = new Person("Alice");
- Person b = new Employee("Bob");
- swap(a, b);
public static void swap(Person person1, Person person2) // doesn't work { Person temp = person1; person1 = person2; person2 = temp; } Person a = new Person("Alice"); Person b = new Employee("Bob"); swap(a, b);
能工作么?不能。为什么?
我们看看:
当我们传递参数的时候,我们传递的是对象么?不,是对象的一个句柄(引用、“指针”)。java的对象只能
由引用来持有。如果你对c++熟悉,那么上面的过程我们翻译过来:
- static void swap(Person *person1,Person *person2)
- {
- Person *temp = person1;
- person1 = person2;
- person2 = temp;
- }
- Person *a = new Person("Alice");
- Person *b = new Person("Bob");
- swap(a,b);
static void swap(Person *person1,Person *person2) { Person *temp = person1; person1 = person2; person2 = temp; } Person *a = new Person("Alice"); Person *b = new Person("Bob"); swap(a,b);
这两段代码产生的行为是一样的,都不能正常工作(即无法完成我们的交换工作)。
原因:C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。用指针变量做函数参数时同样要遵循这一原则。不可能通过执行调用函数来改变实参指针变量的值,“但是可以改变实参指针变量所指变量的值”。上述代码若改成
Person temp;//是类型
temp = *person1;
*person1 = *person2;//交换的是值
*person2 = temp;
就可以了。
那我们先想想c++是怎么实现对象的交换的?你或许一口就说出使用引用和指针做参数。但是上面的参数是指针
作为参数呀!原因在于:在c++中我们传递的参数的确能是对象:
Person a("Alice"); Person b("Bob"); swap(a,b);
这样可以成功完成交换动作.
前两段的代码不能工作的原因在于:
但我们传递实参的时候,我们传递的是指针("指针"),传递的过程,指针("指针")进行了复制,如下图示:
a--->对象1<----a'(其中a',b'分别为a,b在传递参数的时候产生的副本)
b--->对象2<----b'
进入函数体后副本发生了交换,如下图示:
a-->对象1<---b'
b-->对象2<---a'
我们可以看出a和b安然无恙的指向了原来的对象.这就是产生上述结果的原因.
但java可以在函数体内修改对象的值:
static void changName(Person person){ person.setName("Bob"); } changName(a);
对java传递参数总结:
1)一个方法不能够修改一个基本类型的实参的值
2)一个方法可以改变对象的状态.
3)一个方法不能让实参引用指向另一个对象.
发表评论
-
Java SE7新特性之二进制字面量
2016-12-14 22:53 827Java SE 7中, 整数类型(byte, shor ... -
浮点数为什么不精确?为什么银行的金额不能用浮点数计算
2016-12-14 22:52 2016浮点数为什么不精确? 其实这句话本身就不精确, 相对精确一 ... -
计算机是如何计算乘法除法的(实际上都是转换为二进制加法计算)
2016-12-14 22:46 6628http://blog.csdn.net/blues1021 ... -
什么是补码、反码、负数在计算中如何表示
2016-12-14 22:39 921负数在计算机中如何表 ... -
Math.abs()绝对值取到的数不一定是正数
2016-12-14 22:37 1265Math.abs() 注释:Note that if th ... -
用BigInteger实现大素数生成算法
2016-12-06 16:42 1866转自:http://www.cnblogs.co ... -
加密(AES)、公私钥(PKI)、摘要(DIGEST)、签名(SIGNATURE)、证书(CERT)的形象解释和组合用法
2016-09-15 18:19 94091.鲍勃有两把钥匙,一把是公钥,另一把是私钥。 ... -
RSA加密公私钥生成工具(openssl)
2016-09-15 13:00 1188https://www.openssl.org/source/ ... -
RPC原理详解
2016-06-23 20:47 579RPC 功能目标 RPC 的主要功能目标是让构建分布式计算 ... -
Java并发之CountDownLatch、CyclicBarrier和Semaphore
2016-06-23 20:36 1411这次说一下 JUC 中的同步器三个主要的成员:CountDo ... -
线程间协作的两种方式:wait、notify、notifyAll和Condition
2016-06-23 20:35 577在前面我们将了很多关于同步的问题,然而在现实中,需要线程之 ... -
The final local variable xxx cannot be assigned, since it is defined in an enclo
2016-04-24 17:42 1594本文就自己编程时候遇到的一个问题,简要描述一下,并提出解决 ... -
一个奇葩的excel中无法trim的“空格”的问题
2016-03-29 16:21 1932太奇怪了。打印出来的命名是空格,就是 trim() 不管用。 ... -
List深度复制
2016-02-17 09:34 2680昨天弄了一个类似List<Map<String, ... -
Eclipse导入 jar 源码乱码问题
2015-12-15 19:43 874http://blog.csdn.net/laiwenqian ... -
Java高并发编程的各种陷阱
2015-07-25 17:49 1003www.iteye.com/blogs/subjects/ja ... -
ASM介绍(java字节码操作利器)
2015-06-10 20:46 4362转自:http://www.ibm.com/de ... -
JDK 7 中的 Fork/Join 模式(并发处理)
2015-06-03 19:47 1006转自:http://www.ibm.com/dev ... -
Java常见内存溢出异常分析
2015-06-03 16:36 828转自:http://www.iteye.com/news/3 ... -
dom4j解析带有命名空间的xml
2015-04-09 21:23 5529Element rootEle = resultDoc.g ...
相关推荐
Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。...
本文将深入探讨Java中的参数分析,结合给定的资源《参数分析总结.doc》,我们将涵盖以下几个核心知识点: 1. **基本类型与引用类型参数**: - Java中有两种类型的参数:基本类型(如int, double, boolean等)和...
本教程将深入探讨Java中的引用传递机制,并通过视频教程的形式帮助学习者更好地理解和应用这一概念。 首先,理解“引用”在Java中的含义至关重要。在Java中,当我们声明一个对象变量时,实际上我们得到的是指向对象...
本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用传递以及C++中的指针传递,并通过具体的代码示例来帮助理解这些概念。 #### 值传递 值传递是最简单的参数传递方式之一,它指...
这篇博客文章将探讨如何在Eclipse中配置和使用Java命令行参数,这对于理解程序的运行行为以及调试是非常有帮助的。 在Java程序中,命令行参数是通过`main`方法的`String[] args`数组传递的,它们允许我们在不修改...
以下是深入探讨Java中多态实现机制的详细说明: 1. **子类型多态**: - 子类型多态是Java中最常见的多态形式,它基于继承和方法的覆盖。当一个派生类对象通过基类引用调用方法时,实际执行的是派生类中重写的方法...
下面我们将深入探讨一些 Java 8 的核心知识点。 1. **函数式编程**: - **Lambda 表达式**:Java 8 引入了 Lambda 表达式,使得编写简洁、可读性强的代码成为可能。Lambda 可以被当作一种匿名函数,用于传递行为...
本文将深入探讨Java中参数传递的实质,以帮助理解和澄清这一问题。 首先,我们需要理解值传递和引用传递的基本概念。值传递是指当函数或方法接收一个参数时,实际传递的是该参数值的一个副本。这意味着在函数内部对...
本文将深入探讨Java中的对象、引用以及它们之间的关系,并结合值传递的概念进行解析。 首先,我们需要理解什么是Java对象。在Java中,对象是类的实例。当我们使用`new`关键字创建一个类的实例时,就创建了一个对象...
1. 参数传递方式:Java中的参数传递总是按值传递,但对于对象类型,实际上是传递对象的引用(地址)。这意味着,函数内部对参数对象的修改会影响到原始对象,除非是基本类型。 2. 基本类型与引用类型的区别:基本...
这里我们将深入探讨两种行为型设计模式:责任链模式(Chain of Responsibility)和命令模式(Command Pattern)。 首先,责任链模式是一种结构型设计模式,其核心思想是将多个处理者组织成一个链条,每个处理者都有...
本篇将深入探讨Java中的多线程机制,包括线程的创建、管理以及如何处理并发环境中的数据安全问题。 首先,我们需要理解什么是线程。线程是操作系统分配CPU时间的基本单位,是程序执行的流。在Java中,每个程序都有...
- 方法定义、调用和参数传递,理解方法作为代码重用的手段。 - 类的定义,包括属性(字段)和行为(方法)。 - 对象的创建和初始化,以及构造器的概念。 - 类的封装、继承和多态性,这是面向对象编程的三大特性...
在编程语言中,值传递和引用传递是函数参数传递的两种基本方式,它们涉及到内存管理、数据安全以及程序效率等多个重要方面。这篇文章将深入探讨这两种传递方式,并通过内存解析来帮助理解它们的工作原理。 首先,...
下面我们将深入探讨回调函数的基本原理、应用场景以及如何在Java中实现回调。 首先,回调函数的主要优点是可以解耦代码,使得调用者和被调用者之间不直接依赖具体的实现。例如,在事件驱动的系统中,事件监听器就是...
本篇文章将详细探讨Java语言规范与Java虚拟机规范在Java 8和Java 9版本中的关键知识点。 首先,Java语言规范(Java Language Specification, JLS)是Java编程语言的官方文档,它详细规定了语言的各个方面,包括语法...
本文将深入探讨如何在Java中实现委托模式,并通过一个名为`DelegateDemo`的示例来阐述其用法。 ### 什么是委托? 委托是一种设计模式,它允许我们将行为(即方法调用)作为参数传递给其他对象。这种模式提高了代码...
本文将深入探讨Java接口的使用方法,帮助你理解其核心特性、作用以及如何在实际编程中灵活运用。 1. **接口的定义与特点** - 接口中所有的方法默认都是抽象的(abstract)和公开的(public),不需要声明这两个...
以下我们将深入探讨Java反射的基本概念、主要API以及如何通过给定的代码示例来理解反射的应用。 首先,让我们了解什么是类的反射。在Java中,`java.lang.Class` 类代表了运行时的类信息。我们可以通过一个类的全名...