在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. LR中的编码问题

    [转载]LoadRunner字符集与检查点的探讨 很多人在loadrunner测试脚本中加入中文检查点的时候会出现检查失败的情况,究竟是为什么呢?其实是被测试系统与loadrunner字符集之间的转换 ...

  2. 6.PHP内核探索:Zend引擎

    相信很多人都听说过 Zend Engine 这个名词,也有很多人知道 Zend Engine 就是 PHP 语言的核心,但若要问一句:Zend Engine 到底存在于何处?或者说,Zend Engi ...

  3. js 和 jquery 获取页面和滚动条的高度 视口高度文档高度

    js 和 jquery 获取页面和滚动条的高度 //页面位置及窗口大小 function GetPageSize() { var scrW, scrH; if(window.innerHeight & ...

  4. Lambda 中如果构建一个查询条件,扔该Where返回我们需要的数据。

    有一个需求,比如所 省市县 这三个查询条件 都可能有可能没有,但是我们的查询条件怎么构建呢 首先需要看一下 Lambda中Where这个方法需要什么参数 public static IEnumerab ...

  5. php获得文件夹下所有文件的递归算法

    function my_scandir($dir){ $files=array(); if(is_dir($dir)) { if($handle=opendir($dir)) { while(($fi ...

  6. openssh-server 安装

    sudo apt-get update sudo apt-get install openssh-server 1:ssh-keygen -t rsa -f ~/.ssh/id_rsa 这里会提示输入 ...

  7. linux epoll 简单demo

    一个简单的epoll demo ,同时接受多个客户端连接,并把接收到的字符串转化为大写字母返回给客户端 #include<stdio.h> #include<arpa/inet.h& ...

  8. 使用mysqli_stmt类

    在生成网页时,许多PHP脚本通常都会执行除参数以外,其他部分完全相同的查询语句,针对这种重复执行一个查询,每次迭代使用不同的参数情况,MySQL从4.1版本开始提供了一种名为预处理语句(prepare ...

  9. Magento - Rewrite机制一窥

    看一个url例子 http://localhost/magento/index.php/customer/account/login 这里假定http://localhost/magento/ 是ma ...

  10. SqlServer2008R2 修改表中列为自增列

    选定列,修改列属性标识规范中(是标识)为是,标识增量为1,标识种子为1 SQL语句:alter table 表名 add 列名 int IDENTITY(1,1) NOT NULL