`

java 传对象和传变量

    博客分类:
  • java
阅读更多
引用

  • 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。参数是原始类型int,long,float,byte,char,double、boolean、short等等。 
  • 引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

引用
string不是基本类型,但是传递参数时,为什么其原参数值没有发生变化,下面我们来看看new出String对象的那小段代码(String类中),也就是String类的构造函数:
publicString(String original) {

        int size = original.count;

        char[] originalValue = original.value;

        char[] v;

      if (originalValue.length > size) {

             int off = original.offset;

             v = Arrays.copyOfRange(originalValue, off, off+size);

        } else {

            v = originalValue;

        }

        this.offset = 0;

        this.count = size;

        this.value = v;

}


也许你注意到了里面的char[],这说明对String的存储实际上通过char[]来实现的。怎么样?其实就是一层窗户纸。不知道大家还记不记得在Java API中定义的那些基本类型的包装类。比如Integer是int包装类、Float是float的包装类等等。对这些包装类的值操作实际上都是通过对其对应的基本类型操作而实现的。是不是有所感悟了?对,String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类就是如此体现的。所以,对于String在这种情况下的展现结果的解释就自然而然得出了。同样的,Integer、Float等这些包装类和String在这种情况下的表现是相同的。
传对象
public class ZhiShu {
	public  void setMapValue(Map maps){
		maps.put("3","3");
		maps.put("4","4");
	}
	public static void main(String[] args) {
		ZhiShu z=new ZhiShu();
		Map map=new HashMap();
		map.put("1","1");
		map.put("2","2");
		z.setMapValue(map);
		System.out.println(map);
	}
}


顺便说一下string对象
引用
String是一个非可变类,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变,该类对象本质上是线程安全的,不要求同步。建一个Stirng对象,主要就有以下两种方式:
String str1 = new String("abc");     
Stirng str2 = "abc";   

虽然两个语句都是返回一个String对象的引用,但是JVM对两者的处理方式是不一样的。对于第一种,JVM会马上在堆区中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,JVM首先会在内部维护的串池中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在堆区中重新创建一个新的String对象;如果串池中没有该String对象,JVM则在堆区中创建新的String对象,将其引用返回给用户,同时将该引用添加至串池中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到串池里面的,除非程序调用 String的intern方法。

看下面实例:
引用

String str1 = new String("abc");  

  /**此句在执行的时候先在字符串池中寻找是否有"abc"这样的字符串,如果没有,则在字符串池中创建一个,然后再通过new()方法在堆中创建一份"abc"的拷贝。所以以上的语句实际是创建了两个对象,一个是字符串池中的"abc",一个是堆中的"abc"。许多人可能以为s也是一个对象,这是不对的,s是一个变量,只是对对象的引用。如果在此句后面紧接着执行:       
String S1=new String("abc");
则此句只创建一个对象,即通过new()在堆中创建池中对象"abc"的一份拷贝。即如果上面的语句是如下的话:
String S1="abc";
则此句不会创建对象,只会把字符串池中的对象"abc"的地址赋给S1。
知道为什么new String("abc")亦要检查串池吗?那是因为String()的constructor是原因。这是其中一个String的constructor : String(String original).留意当new String("abc")时.其实已经先做了一个动作,String original = "abc".*/

引用
intern()方法:这是一个本地方法。在调用这个方法时,JAVA虚拟机首先检查字符串池中是否已经存在与该对象值相等对象存在,如果有则返回字符串池中对象的引用;如果没有,则先在字符串池中创建一个相同值的String对象,然后再将它的引用返回,看下面实例:

String str1 = new String("abc"); //jvm 在堆上创建一个String对象    
   
str1 = str1.intern();    
//程序显式将str1放到strings pool中,intern运行过程是这样的:首先查看strings pool    
//有没“abc”对象的引用,没有,则在堆中新建一个对象,然后将新对象的引用加入至    
//strings pool中。执行完该语句后,str1原来指向的String对象已经成为垃圾对象了,随时会    
//被GC收集。    
   
//此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”    
//因此直接返回str1指向的对象给str2,也就是说str2和str1引用着同一个对象,    
//此时,堆上的有效对象只有一个。    
Stirng str2 = "abc";    
   
 if(str1 == str2){    
         System.out.println("str1 == str2");    
 }else{    
         System.out.println("str1 != str2");    
 }    
  //打印结果是 str1 == str2    

引用
   (1).栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。

   (2).堆(heap):用于存储对象。
分享到:
评论

相关推荐

    Java 成员变量和局部变量

    在面向对象的设计中,有两种主要类型的变量:成员变量(也称为类变量或字段)和局部变量。理解这两者的区别和用法对于编写高效、清晰的Java代码至关重要。 **成员变量** 成员变量是定义在类的主体部分,而不是方法...

    Java中的基本类型和引用类型变量的区别

    Java 中的基本类型和引用类型变量的区别 Java 中的基本类型和引用类型变量是两个不同的概念,它们在内存分配、变量赋值和函数传递等方面有着本质的区别。 基本类型是 Java 中的八种基本类型,包括 byte、short、...

    java面向对象编程pdf

    在这篇文章中,我们将对Java面向对象编程的基础知识进行总结和解释。面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将程序设计看作是对象的交互,对象之间的关系和行为。 一、对象和类 在...

    Java面向对象编程练习题.pdf

    本资源摘要信息涵盖了 Java 面向对象编程的基础知识,通过三个练习题,展示了 Java 编程语言的基本概念和应用。 练习题 01: 类的成员变量 本练习题展示了 Java 中类的成员变量的概念。类 A 有一个成员变量 v,初始...

    Java面向对象程序设计

    Java面向对象程序设计是计算机编程领域中的核心主题,它基于面向对象编程(OOP)理念,使得代码更具有模块化、可复用性和易于维护的特点。以下是对标题和描述中涉及的知识点的详细阐述: 1. **第1章:Java入门** -...

    java变量命名心得

    下面我们将通过一个实例来展示局部变量和实例变量的区别,并总结 java 变量命名的几个典型问题。 首先,让我们来看一下局部变量和实例变量的区别。局部变量是指在方法内部定义的变量,它的作用域仅限于该方法内部。...

    java替换word中的变量

    总之,使用Java替换Word文档中的变量主要依赖于Apache POI库,通过创建和操作HWPFDocument或XWPFDocument对象来实现。这个过程涉及到对Word文档结构的理解,以及对库提供的API的熟练掌握。在实际项目中,根据需求...

    java中对象和对象引用的区别!

    在Java中正确地区分对象与对象引用是非常重要的,这不仅关系到程序的正确性,也影响到资源管理和性能优化。理解了这些基本概念之后,开发者能够更加灵活地运用Java进行开发工作,避免常见的错误和陷阱。

    JAVA类与对象及数组习题

    下面是关于JAVA类和对象及数组的习题,涵盖了构造方法、继承、多重继承、变量声明、数组初始化等方面的知识点。 1. 构造方法的调用方式: 构造方法是类的特殊方法,用于初始化对象的状态。调用构造方法的方式有很多...

    Java-面向对象设计-类和对象.docx

    Java面向对象设计类和对象 Java面向对象设计类和对象是面向对象程序设计的基础,它将现实世界模型自然延伸到程序设计中。类和对象是面向对象设计的核心概念,类描述对象的属性和行为,对象是类的实例,是一个实实在...

    JAVA读取环境变量

    ### JAVA读取环境变量 #### 知识点概述 在Java程序中,有时我们需要根据不同的运行环境(如Windows或Linux)来获取系统环境变量。这些环境变量包含了操作系统配置的重要信息,比如路径设置、用户信息等。本文将...

    java 常量与变量

    在Java编程语言中,常量和变量是两个基础且重要的概念。它们是程序中存储数据的容器,理解它们的性质和用法对于编写高效的代码至关重要。 ### 常量 常量是固定不变的值,一旦被定义就不能再更改。在Java中,我们...

    Java面向对象基础练习题

    通过对上述练习题的分析,我们可以加深对Java面向对象编程中类和对象、实例变量、方法重载、构造方法、引用和this关键字的理解和应用。这些知识点对于日后进一步学习面向对象的高级特性,比如继承和多态,打下了坚实...

    配置Java 环境变量

    Java环境变量的配置是安装和使用Java开发工具(如JDK,Java Development Kit)的基础步骤,这对于运行Java程序、编译Java源代码以及使用各种Java开发工具至关重要。下面将详细解释如何配置Java环境变量,以及这些...

    java变量数据类型运算符

    了解并熟练运用Java中的变量、数据类型和运算符是编写高效代码的基础,而面向对象编程则让代码结构更加清晰,易于维护和扩展。在实际编程中,开发者需要根据需求选择合适的数据类型,合理使用运算符,以及设计符合...

    Java中对象与引用

    2. **多个引用可以指向同一个对象**: 多个引用变量可以同时指向同一个对象,这意味着可以通过不同的引用变量来访问同一对象的属性和方法。 ```java Student stu1 = new Student(); Student stu2 = stu1; // stu2...

    java 子类对象赋值给父类对象的使用

    这一过程是自动且安全的,因为子类对象包含了父类的所有属性和方法。下面我们将深入探讨这个主题,包括它的原理、示例代码以及相关的知识点。 首先,理解向上转型的基本概念。在Java中,子类是父类的一个特例,这...

    java类与对象实例

    在 Java 中,类可以分为预定义类和自定义类,变量可以分为四种:类变量、实例变量、局部变量和块变量。理解这些概念对于学习 Java 语言非常重要。 Java 语言是一种面向对象的语言,它提供了许多有用的功能和特性,...

    Java面向对象编程思想.pdf

    类是 Java 面向对象编程的基本单元,它是变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。对象是类的实例,每个对象都有其自己的状态和行为。 五、实例化 实例化是将类生成多个对象的...

    java面向对象测试题含答案.docx

    本资源摘要信息涵盖了 Java 面向对象编程的基础知识点,包括类和对象之间的关系、类的声明、方法的声明和使用、构造方法、面向对象编程的基本概念等。 1. 类和对象之间的关系:类和对象之间存在抽象和具体的关系,...

Global site tag (gtag.js) - Google Analytics