数组
1、Java数组是静态的:Java语言是典型的静态语言,即当数组被初始化之后,该数组的长度是不可变的,java中的数组必须经过初始化才能使用。所谓初始化就是为数组对象的元素分配内存空间,并为每个数组元素指定初始值。
2、基本数据类型的数组,元素直接存储到数组中
引用类型数组的数组元素依然是引用类型的,因此数组里存储的元素还是引用,它指向另一块内存,这块内存里存储了该引用变量所引用的对象。
对象
1、局部变量的作用时间很短暂,它们都被存储在方法的栈内存中。
2、使用static修饰的成员变量是类变量,属于该类本身;没有使用static修饰的成员变量是实例变量,属于该类的实例。在同一个JVM内,每个类只对应一个class对象(JVM对一个java类(类本身,不是只对象)只初始化一次),但每个类可以创建多个java对象。
3、从另一个角度来看,类也是对象,所有类都是class的实例。每个类初始化完成之后,系统都会为该类创建一个对应的class实例,程序可以通过反射来获取某个类所对应的实例。
4、java允许用类对象来访问类成员(static),但底层仍然是通过类名来调用的。
5、当类初始化完成后,类变量也随之初始化完成,以后不管程序创建多少个对象,系统都不再为类变量分配内存,但每次都会为实例变量(对象)分配新的内存。
6、java对象的3种初始化方式:构造器(构造方法)、初始化代码块、定义变量时指定初始值。
初始化代码块总是优先与构造方法执行(其实三种方法的初始化完全类似,都是用于对实例变量的初始化,经过编译器处理之后,它们对应的赋值语句都被合并到构造器中。合并后的初始化语句总是位于构造方法的所有语句之前)
7、JVM对一个(static)java类只初始化一次,程序可以在2个地方对类变量执行初始化
a)、定义类变量是指定初始值
b)、静态初始化块中对类变量指定初始值
8、关于子父类的初始化顺序(构造方法的执行顺序):
super调用用于显式调用父类的构造方法,this调用用来显式调用本类中另一个重载的构造器。super调用和this调用都只能在构造器中使用,而且都必须作为构造器的第一行,因此构造器中
只能出现一个super或 this。
当没有显式调用(super/this)时,系统会在执行子类构造方法之前隐式调用父类无参的构造方法。(都是从顶层父类开始初始化直到本类(子类
)的初始化,返回本类实例)
9、对于一个引用类型(类)的变量而言,当通过该变量访问它所引用的的对象的实例变量(成员变量)时,该实例变量的值只取决于声明该变量时的值(赋的初始值);当通过该变量来调用它所引用的对象的方法时,该方法行为取决于它所实际引用的对象类型。
10、final修饰符
a)、final可以修饰变量,被final修饰的变量被赋初始值,不能对它重新赋值。
b)、final可以修饰方法,被final修饰的方法不能被重写。
c)、final可以修饰类,被final修饰的类不能派生子类(不能被继承)
注意1:在定义final修饰的变量时直接赋初始值,会将该变量变成“宏变量”(系统中出现该变量的地方都会变成这个值),而在构造方法或者初始化代码块中赋值就不会有这种效果。
注意2:java要求所有被内部类访问的局部变量都使用final修饰的原因是:对于普通局部变量而言,它的作用域就是停留在该方法内,当方法执行结束时该局部变量也随之消失;但内部类则可能产生隐式的“闭包(Closure)”,闭包将使得局部变量脱离它所
在的方法继续存在。
11、java会缓存所有曾经用过的字符串直接量到常量池中,如果之后又用到这个直接量就会直接指向常量池。