- 浏览: 2020394 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
在java和C++中都采用了引用这个概念,但是二者的行为并不一样。java的引用其实更象c++中的指针,而非c++中的引用,的确c++的指针给ren们带来强大威力的同时,也给我ren们带来了危险,大多的攻击也都是利用指针让系统崩溃。在许多书上都没有见到关于java中reference行为的更详细的探讨,本文便从与c++的的区别谈起:
一.先看java中的引用:
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;
}
}
现产生两个对象 :
Java代码
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);
因为C++中的引用赋值是赋的引用中的右值。
上述结果显示:在java中referece其行为就是c++中的指针,而不是c++中的引用. java中referece和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是怎么传递对象的:
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);
能工作么?不能。为什么?
我们看看:
当我们传递参数的时候,我们传递的是对象么?不,是对象的一个句柄(引用、“指针”)。java的对象只能
由引用来持有。如果你对c++熟悉,那么上面的过程我们翻译过来:
Java代码
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++是怎么实现对象的交换的?你或许一口就说出使用引用和指针做参数。但是上面的参数是指针
作为参数呀!原因在于:在c++中我们传递的参数的确能是对象:
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);
或者用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可以在函数体内修改对象的值:
Java代码
static void changName(Person person){
person.setName("Bob");
}
changName(a);
对java传递参数总结:
1)一个方法不能够修改一个基本类型的实参的值
2)一个方法可以改变对象的状态.
3)一个方法不能让实参引用指向另一个对象.
一.先看java中的引用:
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;
}
}
现产生两个对象 :
Java代码
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);
因为C++中的引用赋值是赋的引用中的右值。
上述结果显示:在java中referece其行为就是c++中的指针,而不是c++中的引用. java中referece和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是怎么传递对象的:
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);
能工作么?不能。为什么?
我们看看:
当我们传递参数的时候,我们传递的是对象么?不,是对象的一个句柄(引用、“指针”)。java的对象只能
由引用来持有。如果你对c++熟悉,那么上面的过程我们翻译过来:
Java代码
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++是怎么实现对象的交换的?你或许一口就说出使用引用和指针做参数。但是上面的参数是指针
作为参数呀!原因在于:在c++中我们传递的参数的确能是对象:
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);
或者用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可以在函数体内修改对象的值:
Java代码
static void changName(Person person){
person.setName("Bob");
}
changName(a);
对java传递参数总结:
1)一个方法不能够修改一个基本类型的实参的值
2)一个方法可以改变对象的状态.
3)一个方法不能让实参引用指向另一个对象.
发表评论
-
DLL中导出函数的声明有两种方式:
2012-11-12 16:42 1819DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中 ... -
k-means算法的C++实现
2011-04-05 11:38 2308k-means算法的C++实现: http://www.ku ... -
main()中的参数
2010-10-31 10:41 1508所有的应用程序都是从以main函数作为入口, 而mai ... -
static作用
2010-10-26 19:15 2353转自(from http://www.cnb ... -
mmap函数
2010-10-25 22:41 1891mmap函数的使用方法 UNIX ... -
C语言中三种内存分配方式
2010-10-25 20:23 01.malloc 原型:extern void *ma ... -
位拷贝和值拷贝
2010-10-23 15:37 1571为了便于说明我们以String类为例: 首先定义String ... -
(转帖)把类的析构函数写成虚函数的用意
2010-10-23 15:10 1671#include <iostream.h> cl ... -
动态规划/贪心算法----0/1背包问题AND普通背包问题
2010-10-23 14:03 6801两个背包问题都是比较典型的问题,对这两种算法的理解有很好的帮助 ... -
netstat, nslookup, finger, ping命令
2010-10-22 17:13 1496Netstat用于显示与IP、TCP ... -
C++返回值
2010-10-22 16:53 1526C++函数返回值: (1)正常情况下,函数的参数要复制一份在 ... -
switch语句后的表达式的值
2010-10-22 16:23 1818一般格式: switch (表达式) { case 常量 ... -
C++四种强制类型转换
2010-10-19 11:45 1541显式类型转换又被称之 ... -
C++四种强制类型转化的区别
2010-10-19 11:43 1330先介绍const_cast和reinterpret_cast: ... -
Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
2010-10-18 14:24 1806使线程同步 在程序中使用多线程时,一般很少有多个线程能在其 ... -
(转)临界区,互斥量,信号量,事件的区别
2010-10-18 14:22 1746四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行 ... -
(转)在C++中实现同步锁,类似synchronize(object){....}
2010-10-18 13:49 1860在做C++的项目中发现, ... -
C++线程同步
2010-10-18 13:46 1588线程同步是多 ... -
C++多线程编程
2010-10-18 10:56 1729今天我给大家讲一讲C++ ... -
关于C++对函数传参与函数返回值进行引用传递的详解
2010-10-16 22:51 4030关于C++对函数传参与函数返回值进行引用传递的详解 ...
相关推荐
java中引用和c++中引用的区别.docx
Java中引用类型传值的代码清单.pdf 学习资料 复习资料 教学资源
将其它格式转换为json所用的jar.在ajax时用到。
详细说明中Java中对象与引用的关系,本文有助于你的成长。
Java中的基本类型和引用类型变量的区别
Java的引用和函数参数传递Java的引用和函数参数传递Java的引用和函数参数传递Java的引用和函数参数传递
主要介绍了java中关于对象作为参数传的时候倒是什么时候是值专递还是传引用
NULL 博文链接:https://deony2jacob1314.iteye.com/blog/1845769
java中传值与传引用,详细讲解java中的传值与传引用
java数组,一维数组引用实例,二维数组引用实例
讲解String.xml标签在布局文件中及java代码中的引用
Java中弱引用软引用虚引用及强引用的区别Java开发Java经验技巧共3页.pdf.zip
java函数引用图解
java 引用 pdf模板,并且给pdf模板固定位置传相应的内容
Java中对象与引用对象的关系 Java 对象 引用变量
JAVA表面上看起来没有指针,但它的引用其实质就是一个指针,引用里面存放的并不是对象,而是该对象的地址,使得该引用指向了对象。在JAVA里,“=”语句不应该被翻译成赋值语句,因为它所执行的确实不是一个赋值的...
Java开发中初学XML中需要的Dom4j 的jar包和JDom的jar包
java手册中英文java8,java9手册 Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 Java编程语言的风格十分接近C++语言。继承了C++语言...
笔者自己的通俗总结,5分钟搞清楚java中强软弱虚引用的区别^_^