java值传递还是应用传递

来源:互联网 发布:林少华 知乎 编辑:程序博客网 时间:2024/06/03 18:05

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的内存模型吧。
几个常用的内存模型的概念。

  1. 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再开始执行。线程私有
  2. pc:程序计数器,用来记录当前线程执行到了什么位置,它会记录执行指令的位置。每一个线程私有。
  3. java堆:存放所有对象的实例,是java虚拟机最大的一部分,同时这部分实现了java自动内存管理,也就是gc。
  4. 方法区:它存储了java类的信息,可以这样理解,这里存储的是.class文件的一份副本。
  5. 运行时常量池:它是方法区的一部分,上文提到,方法区是.class文件的一个副本,都知道.class文件有很重要的一部分组成是java常量池,运行时常量池,就是java常量池的一份副本。
  6. 栈帧:就是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方法执行。
0 0