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);