在Java中,变量分为两类:

1.基本类型变量,java是传递的副本

2.一切对象型变量,传引用副本的实质是复制指向地址的指针

a.基本类型引用

public class BasicTransmit {

	public static void test(boolean test){
test =! test;
System.out.println("in test : test = "+test);
} public static void main(String[] args) {
boolean test = true;
System.out.println("Before test : test = "+ test);
test(test);
System.out.println("After test : test = "+test); //在java中,对于基本类型变量(int,long,double,float,byte,boolean,char)
//java 是传值的副本.
}
}

运行结果是:

Before test : test = true
in test : test = false
After test : test = true

b.对象的引用(String不是基本数据类型,而是对象)

public static void test (StringBuffer str){
str.append(",wrold!");
} public static void main(String[] args) {
StringBuffer string = new StringBuffer("Hello");
test(string);
System.out.println(string);
//意料之中,String是一个引用,java对于引用形式传递对象类型的变量是,实际上是将引用
//作为一个副本传递方法函数.那么这个函数里面的引用副本所指向的是什么?
//是对象的地址,通过引用副本找到地址并修改地址的值,也就修改了对象的值
}

运行结果:Hello,wrold!

public static void test (String str){
str = "world";
} public static void main(String[] args){
String string = "Hello";
test(string);
System.out.println(string);
} //为什么会这样呢?这是因为当执行str="world"时,过程为:首先系统会自动生成应新的string对象
//并把这个新对象的值设为"world",然后把这个对象的引用赋给str
//理解:为str这个钥匙原来是指向"hello"这个仓库的,但是现在要求str这个钥匙重新指向"world"
//我们必须清楚一点是:String类是final类型的,因此,你不可以继承和修改这个类.
//str="world",其实是隐含地让java生成一个新的String对象,既然对象都是新的,那就与原来的
//"Hello"没有任何关系.
//当函数结束,str作用消失,原来的内存地址上的内容未加改变,所以打印结果仍然是Hello //StringBuffer产生的一块内存空间,相关的增删改操作都在其中进行,所以为其添加一句"world"
//仍然是在同一段内存地址上进行的,str所值向的引用并没有改变.

c.对象的引用

public class ValueTest {

	public void first(){
int i = 5;
Value v = new Value();
v.i = 25;
second(v ,i);
System.out.println(v.i);
} public void second(Value v ,int i){
i = 0;
v.i = 20;
Value val = new Value();
v= val;
System.out.println(v.i + "" + i);
} public static void main(String[] args) {
ValueTest t = new ValueTest();
t.first();
}
} class Value{
public int i = 15;
}

  结果是:15 0 20

总结:在java中无论是基本数据类型还是对象都是引用的副本或者地址的副本,当返回本函数是,值是没有变化的.除非在函数运行中已经把本地址指向的空间内的值修改了.

Java数据类型和对象的引用的更多相关文章

  1. “吃人”的那些Java名词:对象、引用、堆、栈

    记得中学的课本上,有一篇名为<狂人日记>课文:那时候根本理解不了鲁迅写这篇文章要表达的中心思想,只觉得满篇的“吃人”令人心情压抑:老师在讲台上慷慨激昂的讲,大多数的同学同我一样,在课本面前 ...

  2. java定义类 对象,引用,指针

    java是根据面向对象编程,因此有类和对象的概念,类分为普通类与抽象类. 一.定义类 类由N个 构造器  成员变量  方法组成,可以不定义,也可以根据语法定义N个. [修饰符] class 类名{ 构 ...

  3. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  4. Java中的对象和引用

    <Java编程思想>中有一段关于对象的说法: "按照通俗的说法,每个对象都是某个类(class)的一个实例(instance),这里,'类'就是'类型'的同义词." 简 ...

  5. java中的对象 方法 引用 等一些抽象的概念是什么意思呢?

    2020-03-14 最近这一段时间有点忙,好久都没有更新博客了,之后我会一直坚持下去的,和大家一同进步的. 这段时间一直在学java,相信刚开始学习java的小白,刚开始接触那么些抽象的概念一定和我 ...

  6. Java基础必备 -- 堆栈、引用传值、垃圾回收等

     在Java中,对象作为函数参数的传递方式是值传递还是引用传递?String str = "abc" 与 String str = new String("abc&quo ...

  7. Java:传值还是传引用?

    这是一个Java的经典问题,大部分人从C,C++语言入门,C语言有三种传递方式:值传递,地址传递和引用传递.详细的对C语言指针,引用的我个人的理解,见链接. Java所有操作都是传值操作!都是传值操作 ...

  8. Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题 ...

  9. JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用

    JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据 ...

随机推荐

  1. PHP Console工具使用分享

    PHP Console工具使用分享 http://www.open-open.com/lib/view/open1416193590414.html 您的评价:       不错  收藏该经验     ...

  2. C++ 构造函数放置默认转换explicit关键字(2)

    按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p );  ...

  3. linux 相关系列安装

    以Red Hat Enterprise Linux 5为例进行讲解. 相关系列: linux下jdk的安装 linux下ant的安装 linux下redis的安装 linux下svn的安装 linux ...

  4. Types of compression algorithms

    http://www.html5rocks.com/en/tutorials/speed/img-compression/ Types of compression algorithms There ...

  5. 【转】Unity 解析Json字符串

    http://blog.csdn.net/qq_15267341/article/details/52013190 LitJSON使用很简单,两个步骤: 1 将LitJSON.dll文件拖动到unit ...

  6. 运维技能大全 | Devops Tools 周期表

    老外整理的 Devops Tools 周期表,可以用酷炫屌炸天形容,划分了数据库.CI.日志.安全.监控.配置管理.云服务等15个大类,120个工具.我是有点孤陋寡闻,很多都没听说过,你要是全学会了你 ...

  7. addevent兼容函数 && 阻止默认行为 && 阻止传播

    function addEvent(a, b, c, d) { a.addEventListener ? a.addEventListener(b, c, d) : a.attachEvent(&qu ...

  8. this绑定

    js中关于this的用法,在初期时候经常会弄混,即使现在,也不敢说就一定不会混,但是起码好很多了. 函数执行过程中,主要有4种方法决定this的绑定对象. 分别为:默认绑定.隐式绑定. 显示绑定和ne ...

  9. jade复用

    jade复用说白了就是模板的继承. 使用 block 标识符,设置一个可修改的代码片段 layout.jade doctype html html head block title title Def ...

  10. Mac终端命令行提示符格式更改方法

    内容提要: 主要是通过~/.bash_profile文件更改环境变量PS1,修改命令行提示符的显示格式,并展示不同颜色. 本文介绍了默认设置的缺陷,以及需要用到的基础知识,最后介绍了更改命令行提示符格 ...