java值传递还是应用传递

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值