引用
- 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。参数是原始类型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替换word字符串 附带jar;支持docx,doc
《Java面向对象编程》 练习题一、填空题 1.自从Sun推出Java以来,按应用范围可分为三个版本,分别是( JAVA SE )、( JAVA EE )、( JAVA ME )。 2.环境变量的设置,若JDK安装在“D:\JDK”,则应设置Path为(D:...
面向对象和面向过程的区别 成员变量与局部变量的区别 创建一个对象用什么运算符?对象实体与对象引用有何不同? 对象的相等和引用相等的区别 类的构造方法的作用是什么? 如果一个类没有声明构造方法,该程序能正确执行...
Java-面向对象设计-类和对象.docx
Java中对象与引用对象的关系 Java 对象 引用变量
定义长方体类Cuboid,要求如下:(1)私有成员变量包括长length、宽width和高height;(2)构造方法包括一个公共的空构造方法,一个能够初始化所有成员变量的构造方法;(3)包括所有的setter和getter方法,其中...
我自己整理的资料,供大家参考,两张,主要是介绍了java的技术,什么是java,它和.net的区别,局部变量和成员变量,还有很多
类变量是类中的静态变量,是用static修饰的变量;实例变量就是类中的成员...当实例变量修改后,只有当前对象的值被修改了,其他对象的依然不变,变的只是当前对象的实例变量的值。 局部变量,即定义在方法内部的变量。
java flex 对象定义 数据类型定义
net.sf.json.JSONObject ==> Java对象
本次实验进一步学习了Java的相关知识,深入理解了面向过程与面向对象语言的区别,了解了面向对象语言的三大特征,掌握类的声明和构造方法,掌握了对象的创建方法与创建机制,掌握了成员变量、类变量和局部变量区别,...
java 使用静态成员变量计算内存中实例化的对象数目
1.java基础的简介,包括类和对象,方法,变量 2.java面向对象,封装和隐藏,构造方法, 继承,多态,抽象类,接口,final,内部类 GC
有两个公有方法void getAge()和setAge(int age),其中setAge(int age)的功能是把参数age的值加到类中的变量age中(但要求age>0,否则抛出自定义异常MyException类的对象),getAge()方法返回age的值。编写应用程序。
在类中的位置不同 成员变量:在类中方法外 局部变量:在方法内或者方法声明处 在内存中的位置不同 成员变量:在堆内存中 局部变量:在栈内存中 ... 成员变量和局部变量的名称可以一致,方法调用的时候采取就近原则
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
Java实现运用上转型以及对象抽象方法计算圆形或圆锥的面积、周长等成员变量
通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想,了解类的封装方法,以及 如何创建类和对象,了解成员变量和成员方法的特性,掌握 OOP 方式进行程序设计的方法。 【实验原理】或 【实验任务】 ...