java值传递还是应用传递
2015-10-18 16:33
288 查看
1java数据类型
java数据类型分为基本数据类型和应用数据类型。进一步划分,基本数据类型有8中:byte,boolean,short,int,float,long,double。
应用数据类型有:数组类型,类类型,接口类型。当然每一种基本类型都有对应的引用数据类型:Byte,Boolean,Short,Integer,Float,Long,Double。
其中数组类型又有一些特点:为了了方便使用数组我们又对数组划分出了,组件类型和元素类型。例如:int[][][] array=new int[][][],对于array来说它的组件类型int[][]。同时注意int[10][10][10]的组件类型和int[0][0][0]的组件类型相同。
import java.lang.reflect.Array; public class TestArray{ public static void main(String[] argv){ int[][][] array=new int[10][10][10]; System.out.println(array.getClass().getComponentType()); int[][][] array1=new int[1][1][1]; System.out.println(array.getClass().getComponentType()==array1.getClass().getComponentType()); } }
2java对象的创建
说实话写这部分我犹豫了好久,一直担心自己写不好,但最终觉得自己还是献丑吧。首先说一下java的内存模型吧。
几个常用的内存模型的概念。
java栈:与方法调用有关,可以这样理解,a方法是当前线程的其实方法,a方法又调用了b方法。b方法又调用了c方法。那么java栈是这样执行的。首先给a方法创建一个栈帧(就是java栈的一个元素),让a帧入栈执行,在a执行的时候调用到了b,这是给b方法建立一个栈帧,让b帧入栈执行。当b执行的时候,调用到了c,这时给c创建一个栈帧,让c帧入栈执行。当c执行完毕之后,将返回值传递给b帧,c帧出栈。然后b开始执行。当b执行完毕之后,将返回值传递给a帧,然后出栈。这时a再开始执行。线程私有
pc:程序计数器,用来记录当前线程执行到了什么位置,它会记录执行指令的位置。每一个线程私有。
java堆:存放所有对象的实例,是java虚拟机最大的一部分,同时这部分实现了java自动内存管理,也就是gc。
方法区:它存储了java类的信息,可以这样理解,这里存储的是.class文件的一份副本。
运行时常量池:它是方法区的一部分,上文提到,方法区是.class文件的一个副本,都知道.class文件有很重要的一部分组成是java常量池,运行时常量池,就是java常量池的一份副本。
栈帧:就是java栈的组成部分,它呢,我们理解为对方法的一个抽象好了,一个方法,它会有自己的方法变量,例如下面MyData中的num,还有参数n,所以栈帧包含一个局部变量表用来存储这些变量。同样在方法中可以调用属于类的字段,比如下面的i,因此,栈帧中还有一个对运行时常量池的引用,通过这个引用,可以访问到类的一些成员。
我拿一段具体的代码来讲解
public class MyData{ int i=1; public MyData(int n){ int num=100; i=n; } public static void main(String[] argv){ MyData mydata=new MyData(10); } }
java编译器将.java文件编译之后,生成了.class文件,接着让MyData.class去执行。java虚拟机(JVM),通过类加载器将MyData.class的内容加载到jvm中,对MyData.class文件的信息进行解析,比如将类的信息按照对应的格式存放到方法区中,接着建立一个线程,首先让Main方法执行。也就是在当前线程的栈中建立一个Main的栈帧。在执行Main的时候遇到了
MyData mydata=new MyData(10);
这时,jvm从方法区中取出类的各种信息,然后在堆上分配一块区域用来建立一个MyData对象。从上面代码可以看到,MyData有一个int类型的变量i,jvm便建立一个四个字节大小的空间,将它的值赋值为0(如果这个变量是应用类型的话,就会建立一个值为null的引用),之后再按照初始化的要求,将i的值初始化为1.然后执行MyData的构造函数,同时为这个构造函数分配一个栈帧,让它入栈执行。然后出栈。再让Main方法执行。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统