`
sunajax
  • 浏览: 34622 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java学习笔记之三(按值传递和按引用传递)

    博客分类:
  • Java
阅读更多
方法参数按值传递和按引用传递:
[list]
  • 按值传递:所谓按值传递就是在方法内部改变参数的值并不会影响传递进来的外部对象,例如:
  •         int i = 1;
            public void increment(int i){
               i++;
               System.out.println(i);   //输出为2
            }
            System.out.println(i);   //输出为1
    
  • 按引用传递:引用传递和按值传递相反,它会影响传递进来的外部对象(像C中的"&参数"就是按引用传递);
  • [/list]
    在Java只有按值传递,可能有人会奇怪传递进来如是对象,它会改变对象的值,例如:
           public class Test{
              int i;
              public void increment(Test t){
                  t.i++;
                  System.out.println(i);   //输出为1
              }
              public static void main(String[] args){
                  Test t = new Test();
                  t.increment(t);
                  System.out.println(t.i); //输出也为1
              }
           }
    

    这的确是改变了对象的值,但它并没有改变对象引用的值,它还是指向原来的对象,我们传递进来的是对象引用并不是对象,造成这种错误的认识主要是没有理解对象和对象引用的区别,我们可以将对象理解为气球,而对象引用可理解为拉着气球的线,所以这还是按值传递;

    1)"别名"问题:因为Java中只有按值传递,所以就会出现当有几个句柄(对象引用)指向同一对象时,有的可能需要改变对象的值,而有的并不需要,这就产生了别名问题,解决这一问题就是制作本地副本对象,通过Object.clone()方法,如下:
          public class TestHandIn implements Cloneable {
             private int in;
             public void testreference(TestHandIn testin){
    	   //制作本地副本,使其不影响外部对象
    	    TestHandIn in = (TestHandIn)testin.clone();
    	    in.in++;
    	    System.out.println(in.in);//输出为1
    	}
             public Object clone(){
    	   Object obj = null;
    	   try {
    		 obj = super.clone();
                } catch (CloneNotSupportedException e) {
    		System.out.println(e.getMessage());
    	   }
    	   return obj;
    	}
             public static void main(String[] args){
                 TestHandIn in = new TestHandIn();
                 in.testreference(in);
    	    System.out.println(in.in); //输出为0,没有改变
             }
          }
    

    clone()方法在Object中是protected的,子类要具有clone能力需覆盖此方法并实现Cloneable接口,这样做是为了不使每个类默认都具有clone能力,并且Object.clone()方法会检查该类是否实现了Cloneable接口,所以必须实现Cloneable接口;
    2)只读类String及其"同志"类StringBuffer和StringBuilder:先看如下一段代码:
             public void passString(String s){
                s = s + "abc";
                System.out.println(s);  //输出123abc
             }
             public static void main(String[] args){
                String s = "123";
                passString(s);
                System.out.println(s);   //输出123,并没有改变
             }
    

    这好像看起来是按引用传递参数,其实是String类的作用,在String中的每个方法都是新建了个对象对其进行操作,所以原来对象并没有改变,String类也称只读类,它很好的解决了"别名问题",但如果需要一个修改的对象就很麻烦,同时有效率问题,于是出现了"同志"类StringBuffer和StringBuilder,StringBuffer是线程同步的,而StringBuilder不是,效率高些;StringBuffer和StringBuilder的append()方法修改不需要频繁创建对象,效率比"+"要高,但"+"看起来比较直观,根据实际情况选择:
             String s = "abc";
             s = s + "def" + "f" + "g" + "h";  //效率低
              StringBuffer sb = new StringBuffer("abc");
             sb.append("def").append("f").append("g").append("h"); //效率高
    

    在String中比较有用的字符集转换方法:String.getBytes()和new String(byte[] bytes, String charsetName),在解决中文问题时非常有用的两个方法,字节流和字符流的转换桥梁类InputStreamReader和InputStreamWriter,底层实现就是使用这两个方法。
    5
    0
    分享到:
    评论
    3 楼 sunajax 2008-08-18  
    是滴...我在那里写清楚了只有按值传递,并解释当传入对象时有些人理解为按引用传递的误区...
    2 楼 conkeyn 2008-08-18  
    java 好像只有按值传递的吧
    1 楼 conkeyn 2008-08-18  
    java 好像只有按值传递的吧

    相关推荐

      Java学习笔记-超强笔记

      定义属性:实例变量 格式:[ 修饰符 ] 类型 变量名 [ = ?... java中所有参数都是值传递。 当没有值返回时,返回类型必须被定义为void。 返回类型必须与方法名相邻,其他修饰符可以调换位置。

      瑜琅java学习笔记

      1 java起源 2 java语言概述 3 简单(基本)数据类型 4 运算符:java有四大类运算符:算数运算、位运算、关系运算和逻辑运算 5 程序控制语句 6 介绍类:类是java的核心和本质 7 深入方法和类:方法重载、参数传递和递归...

      java学习笔记-java思维导图流程图表格整理

      Java学习笔记 1 命令行运行 1 Java基础 1 ...值传递和引用传递 33 创建和初始化对象 34 封装 34 继承 37 super 37 方法重写 39 多态 39 instanceof和类型转换 40 instanceof 40 类型转换 42 static详解

      java多线程笔记

      Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 ...Java线程:线程之间的数据传递 58

      Java学习笔记

      JAVA健壮性高,它去掉指针、内存申请和释放、无条件转移语句,但有引用的概念,实际传递的是内存地址 (大小为4字节) JAVA提供多线程、提供动态下载程序代码的机制、安全性,它的操作以字节码(class)文件形式保存

      Java学习笔记之深入理解引用

      引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解的版本...

      corejava的学习笔记

      -implicit:{none,class} 指定是否为隐式引用文件生成类文件 -encoding <编码> 指定源文件使用的字符编码 -source <版本> 提供与指定版本的源兼容性 -target <版本> 生成特定 VM 版本的类文件 -version 版本...

      java学习笔记 - 9

      1.引用类型数组 2.继承: 1)作用 2)方法 3)超类/父类&派生类/子类 4)派生类继承超类后,派生类具有:派生类+超类的属性和行为 5)一个超类可以有多个派生类 6)继承具有传递性 7)java规定:构造派生类...

      Java学习笔记(必看经典)

      (编写一个程序验证对象的传递的值为地址) 注意下面这种形式: static void changename(student stu){stu.setName “LUCY”} 注意生成新的对象与旧对象指向无关,生成新对象生命消亡与旧对象无关。 面向对象方法的...

      java学习笔记–java基础

      java学习笔记 这是目录java学习笔记第一部分. java基础1.1 输入输出用户交互Scanner用户交互Scanner进阶1.2 基本数据类型基本数据类型类型转换变量,常量,作用域运算符补充:包机制补充:JavaDoc1.3 顺序结构1.4 循环...

      Java 客户端服务器程序 学习笔记

      NULL 博文链接:https://youngmaster.iteye.com/blog/429280

      java引用传递笔试题abc-ES6-Note:ES6学习笔记

      java引用传递笔试题abc ES6 笔记 ES6学习笔记 注:此笔记是我在主要用Swift语言开发,对比整理的一些我感觉常用的功能特性点,匆匆忙忙,粗粗浅浅,以偏概全,仅自以为容易混淆和类比以及不同的知识点。 目 录 var ...

      j2ee学习笔记(很详细)

      j2ee学习笔记, J2EE模式 Value Object(值对象) 用于把数据从某个对象/层传递到其他对象/层的任意Java对象。 通常不包含任何业务方法。 也许设计有公共属性,或者提供可以获取属性值的get方法。 JSP 1.JSP的基础知识...

      Java并发编程(学习笔记).xmind

      Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

      Java开发详解.zip

      000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...

      JAVA并发编程实践-线程池-学习笔记

      本节主要关注在配置和调整线程池时用的高级选项,讲述了任务执行框架的过程中需 要注意的危险。线程复用原理如下:每一个 Thread 的类都有一个 start 方法。 当调用 start 启动线程时 Java 虚拟机会调 用该类的 run...

      java核心基础个人笔记

      1Basic基本类型 2OOP面向对象 3SE(I-IV)API字符串 4插Bin二进制 5oracle数据库 6JDBC核心API 7webbasic-WEB前端 8jQuery选择器 ...13 Struts2使用,参数传递、Session ,,,,,,,推荐eclipse导入

      c#学习笔记.txt

      c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...

      2009年Java认证考试重点指导

      [学习资料] 09年Java认证考试:我的Java学习道路 [学习资料] 09年Java认证考试:学好java开发的关键七步 [学习资料] 09年Java认证考试:JAVA求素数算法实现 [学习资料] 09年Java认证考试:java类的构造方法 [学习...

      net学习笔记及其他代码应用

      答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生) 30.简要谈一下您对微软.NET 构架下remoting和webservice两项技术的...

    Global site tag (gtag.js) - Google Analytics