Thinking in java(二)

1.函数执行是JVM的内存加载问题:
使用javac 启动编译器,检查源代码中是否有语法错误,没有错误会编译之后生成class文件。
使用java 命令启动JVM,然后JVM会分配内存,把class文件加载内存中。class文件加载完成之后,开始在class文件中找main方法运行。

2.注意:所有的函数都必须在栈内存中运行。
而jvm只会运行处于栈内存顶部的函数。
函数被加载到栈内存的动作,称为函数的压栈(入栈、进栈)。
函数执行完之后就会从栈中消失(函数的弹栈,或者叫做出栈)

3.一个函数没有返回值可以写return吗? 可以,为了快速结束函数;
函数传参方式:按值传递和按引用传递;
值的传递和引用的传递区别:在程序中如果把具体的一个值传递给其他的方法,那么在方法中只能操作传递过来的那个值。在程序中如果把某个地址传递给了其他的方法,这是在其他方法中获取到的是地址,那么通过地址就可以找到真实存放数据的空间,这是通过地址去操作同一个空间。

4.函数的重载:一个类中的多个同名函数;参数列表不同(参数列表不同,主要针对的参数的个数,类型,顺序不同。)并且,重载和返回值类型没有关系。
函数的重写:父类子类之间;子类中的方法具有父类中方法的相同的名称和参数类型;又被称为方法层面的多态.

5.数组:数组表示的一串连续的存储空间;是一类容器
数据类型[] 数组名 = new 数据类型[长度] ;
Int [] arr = new int[10]; 如果不定义,整数数组默认值是0
数据类型[] 数组名 = {值,值,值…….};

二维数组:
a) 格式:
数据类型[][] 数组名 = new 数据类型[行的个数][每行中列的个数];
b) 格式二:
数据类型[][] 数组名 = {
{值,值,值……..},
{值,值,值……..},
…….
};
c) 格式三:如
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[3];
arr[2] = new int[4];

多维数组:…
6.JVM把内存划分成5片区域:(TODO:这一部分再JVM中回顾)
栈内存:主要是用来运行函数的,函数定义的所有变量,在此内存开辟空间。
在栈内存中定义的变量,不初始化,是不能直接使用的。
注意:所有的函数都必须在栈内存中运行。
而jvm只会运行处于栈内存顶部的函数。
堆内存:在程序中使用new 关键字创建的所有东西,保存在堆内存中。
堆内存中开辟的空间,不赋值,都会有默认的初始化数据。
整数:默认是0
小数 默认0.0.
boolean 默认是false
char 默认是 ‘u0000’

方法区:JVM在加载class文件的时候,所有的class文件就要加载在这个内存中。
本地方法区:主要是保存native关键字标注的方法
寄存器:是给CPU使用的。

7.数组常见问题:
a) 数组下标越界:ArrayIndexOutOfBoundsException
b) 空指针异常:NullPointerException;null常量,不能赋值给基本类型变量空间,可以赋值给引用类型变量空间。
c) ClassCastException(类型转换异常)。多态
注意:在Java中当被new出来的堆中的内存,没有任何一个引用指向它的时候,这时它就是一个垃圾,JVM就使用gc把当前这片内存清理。

原文地址:https://www.cnblogs.com/DiZhang/p/12545098.html