1.数组
1.
<span style="white-space:pre"> </span><span style="font-size:18px;">int[] arr=new int[5];
System.out.println(arr[5]);
//编译通过,发生运行时异常(数组越界异常) </span>
2.二维数组:要理解二维数组的内存存储结构,数组是引用数据类型,因此是堆中开辟空间
<strong><span style="white-space:pre"> </span><span style="font-size:18px;">int[][] arr=new int[2][3];
//int[2] 这块空间存储的是两个int[3]的内存地址
//注意!!两个int[3] 内存的地址是不连续的</span></strong>
注意!!由于内存的地址是不连续的,这也就解释了为什么
int[ ][ ] arr=new int[2][ ]; //编译通过
int[ ][ ] arr=new int[ ][3]; //编译不通过
2.静态代码块
随着.class的加载执行,优先main函数的执行,且只执行一次
<strong> class Testw{
static int num;
static {
System.out.println(num);
}
}
public class Test01 {
static {
System.out.println("a");
}
public static void main(String[] args) {
Test f=null;
}
}
/*output*/
a 只输出a
应为在Test01的main函数中并没有加载 Testw.class文件,因此Testw的静态代码块不会执行</strong>
3.构造代码块
在构造函数之前执行,每新建一个对象就会执行构造代码块
<strong><span style="white-space:pre"> </span>class Test{
{
System.out.println("first construct");
}
public Test(){
System.out.println("second construct");
}
}
/*output*/
first construct
second construct</strong>
4.对象创建过程
1.首先加载.class文件创建对象
2.如果有静态代码块先执行静态代码块
3.堆中开辟内存为成员变量赋默认值
4.堆中开辟内存为成员变量赋初始值
5.执行构造代码块
6.执行构造函数
7.对象在堆中的地址传给栈中的引用
5.super和this的对比
1.this是指向当前的对象的引用,表示当前对象
2.super表示超类意思
3.当成员函数中(非静态)的局部变量与成员变量同名时,使用this解决同名问题
eg: public void setName(String name){
this.name=name; }
4.super是为了解决子类覆盖父类的成员函数或者成员方法,解决被屏蔽的问题使其可见。
5.在子类构造函数中,首先要调用构造函数(super() 调用可以省略)但是有一点一定要注意!
当父类的构造函数已经被显示声明时候(也就是说默认构造函数已经消失),必须要显示声明父类的默认构造函数
否则子类在构造函数时候如果不显示声明时,就会报错。
6.System.out.println(this); //输出的是当前对象的地址
System.out.println(super); //编译报错不通过