`
sunajax
  • 浏览: 34994 次
  • 性别: 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学习笔记(必看经典).pdf

      本知识点的标题为“Java学习笔记(必看经典)”,意味着所整理的内容是针对Java初学者的一系列核心概念和原理的总结。 首先,面向对象编程是Java语言的核心,它与传统的面向过程编程有显著的不同。面向对象编程强调的...

      java学习笔记.doc

      Java 学习笔记 本资源摘要信息涵盖了 Java 编程语言的基础知识,着重于面向对象编程(OOP)的概念和实现。下面是该资源的详细知识点: 1. 面向对象编程(OOP)的基本概念: * 对象: everything is an object...

      《java学习》-java学习笔记.zip

      这份《java学习》笔记包含了多个核心主题,旨在帮助初学者和有经验的开发者深入理解和掌握Java技术。 1. **正则表达式(正则.md)**: 正则表达式在Java中用于文本匹配和搜索,是处理字符串的强大工具。Java提供了...

      java学习笔记模版

      【Java学习笔记模版】 Java实习工程师在学习过程中,会涉及到许多关键知识点,尤其是在企业级开发的场景下。从给出的四天学习笔记来看,实习生正在逐步掌握Java Web开发的基础和核心技能。以下是对这些知识点的详细...

      Java学习笔记

      ### Java学习笔记知识点详解 ...以上是关于Java学习笔记中的一些核心知识点的总结,包括环境配置、基础知识、流程控制、面向对象编程和内存管理等方面的内容。这些知识点对于初学者理解和掌握Java编程语言至关重要。

      Java学习笔记 经典必看

      ### Java学习笔记经典知识点解析 #### 一、面向对象编程基础 **面向对象**是一种重要的编程范式,它改变了传统的面向过程的编程思路,强调通过对象来组织代码,提高代码的复用性和维护性。 **面向对象的核心概念*...

      Java学习笔记-超强笔记

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

      java学习笔记

      【Java学习笔记】是针对Java编程语言的一份详尽的学习资料,主要由“圣思源”提供,旨在帮助初学者和进阶者深入理解和掌握Java技术。这份笔记可能包含了从基础语法到高级特性的全面讲解,结合了理论与实践,通过实例...

      尚硅谷JAVA基础笔记吐血整理

      Java的基本语法包括变量声明、数据类型(包括基本数据类型和引用数据类型)、运算符、控制流(如if语句、for循环、while循环)、异常处理和方法定义等。其中,变量声明时需要指定数据类型,例如`int num = 10;`,...

      java学习笔记,好好学习

      - **方法**:函数的定义、调用以及参数传递(按值传递和按引用传递)。 - **数组**:一维、二维数组的声明、初始化和操作。 2. **面向对象编程**: - **封装**:隐藏内部实现细节,提供公共接口供外部访问。 - ...

      Java学习笔记一

      在Java学习笔记中,我们将详细探讨这些主题,并通过实例和练习来加深理解。例如,我们可以创建一个简单的继承和多态示例,如定义一个抽象的动物类,然后创建具体的狗和猫类,这两个子类可以覆盖父类的`makeSound()`...

      java私塾学习笔记整理

      ### Java私塾学习笔记整理 #### 第一章:Java入门 **一、Java是什么?** Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年推出。它旨在为跨平台开发提供一种通用的语言环境,使开发者能够在任何...

      java基础学习笔记.doc

      以上是Java基础学习笔记中涉及的关键知识点,涵盖了输入输出、对象创建、随机数生成、数组和集合的使用以及字符串操作。这些是学习Java编程时的基础内容,深入理解和熟练运用这些知识将有助于进一步学习更复杂的Java...

      JAVA JDK6学习笔记

      - **数据类型**:Java分为基本数据类型(如int、char、float、boolean等)和引用数据类型(如类、接口和数组)。理解它们的区别对于编写有效代码至关重要。 - **变量声明**:如何声明并初始化变量,以及变量的作用...

      java超强笔记

      你还将学习到如何使用类、对象和接口,理解面向对象编程的基本原理,这是Java的核心特性之一。 在函数和方法部分,笔记会介绍如何定义和调用函数,理解参数传递,以及封装和重载的概念。此外,异常处理(try-catch-...

      java实战经典学习笔记

      ### Java实战经典学习笔记知识点概览 #### 一、Java概述及开发环境搭建 - **Java概述** - Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年发布。 - Java的设计目标是“一次编写,到处运行”,这...

      java学习心得,笔记,思想

      总的来说,Java学习是一个逐步深入的过程,从基本语法到高级特性,再到实际项目开发,每个阶段都有其挑战和乐趣。结合Oracle数据库的使用,可以进一步提升Java开发者的综合能力。通过阅读和实践这些笔记,可以巩固...

      java学习笔记文档

      Java学习笔记文档是一份专为初学者准备的宝贵资料,旨在提供系统且实用的Java编程知识。这份文档可能包含了从基础语法、数据类型到高级特性的全面讲解,旨在帮助新手快速掌握这门强大的编程语言。 首先,Java的基础...

      JAVA学习笔记.docx

      Java 是一种广泛使用的编程语言,本资源摘要提供了 Java 学习笔记的关键要点,涵盖了 Java 主函数解析、Java 学习注意事项、JDK 和 JRE 的区别、变量、运算符、控制结构、数组、排序、面向对象编程、继承、多态、...

    Global site tag (gtag.js) - Google Analytics