1.寄存器(register).位于CPU中,所以它是存取速度最快的存储区.但是由于CPU中寄存器的数量是非常有限的,所以寄存器的使用是由CPU按需进行分配.编程的时候我们没有必要去对它进行直接控制.并且在程序中也没办法找到到底什么时候使用了寄存器的依据.
2.栈(stack).它位于随机存取存储器(RAM)中,并通过由CPU直接支持的栈指针(stack pointer)来进行操作.栈指针通过向下移动来分配新的存储空间,并通过向上移动来释放存储空间.这是仅次于寄存器的另一种高速有效地分配存储空间的方式.在创建程序期间,Java编译器必须知道存储在栈上的所有数据的准确大小和它们的生命周期.这样它才能够产生代码来让栈指针上下地移动.但这种约束限制了代码的灵活性,所以当某些Java存储区在栈上的时候——特别是,对象引用(object reference)――而Java对象本身并不被存储在栈上.
3.堆(heap).这是存储Java所有对象的内存池(同样在RAM区域中).堆的优点是,它不像栈一样,编译器并不需要知道它应该从堆中分配多大的存储空间,或者存储空间应该在堆上存在多久.因此,在堆上分配多大的存储空间具有很大的灵活性.无论你何时需要创建对象,你只需要简单的在代码中使用关键字 new来创建它就行了.在这段代码被执行时候就在堆(heap)上面分配相应的存储空间.当然,为这样的灵活性也需要付出一定的代价:在堆上分配存储空间比在栈上分配存储空间要更加耗时(如果你能够在Java中像在C++一样,在stack上创建对象的话).
4.静态存储区(static
storage).”静态(static)”在这里表示”在一个固定的位置”(尽管它同样在RAM中).静态存储区包括:对于程序的整个运行期间都有效的
数据.你能够使用关键字static来指定特殊的对象为静态的.但是Java对象自身却从来不放置在静态存储区中.
5.常量存储区(constant
storage).常量通常被直接放置在程序代码当中.这是安全的。
基本类型存放在堆栈中,每种基本类型所占存储空间的大小都是确定的。基本类型具有包装器类,可以在堆中创建一个非基本对象,用来表示对应的基本类型。
基本成员默认值
若类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值。如下表所示:
基本类型 默认值
boolean
false
char
‘\u0000’ (null)
byte
(byte)0
short
(short)0
int
0
long
0L
float
0.0f
double
0.0d
然而上述确保初始化的方法并不适用于“局部”变量(即并非是某个类的属性)。因此,如果在某个方法中有这样定义:
int x;
那么变量x得到的可能是任意值,而不会被自动初始化为零。
Static的数据和方法不会与包含它的类的任何对象实例关联在一起。非static数据和方法必须知道它们一起运作的特定对象。
通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。
Java中,类构造器由编译器调用,无返回值。如果没有写构造器,编译器会自动创建一个构造器,如果写了构造器,编译器就不会自动创建缺省构造器。
this编译器把所操作对象的引用作为第一个参数传递给成员函数。在方法内部获得当前对象的引用。this关键字只能在方法内部使用,表示对调用方法的那个对象的引用。
static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来却可以。
“this通常指代当前对象,super通常指代父类”。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this 来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数。如果你想引用父类的某种东西,则super。
最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某个成员,使用方法是“this.成员名”,而不带this的那个便是形参。另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。
在构造函数中,this和super不再是像以前那样用“.”连接一个方法或成员,而是直接在其后跟上适当的参数,因此它的意义也就有了变化。在构造器中,this只能调用一个构造器,且必须将构造器调用置于最起始处。super后加参数的是用来调用父类中具有相同形式的构造函数。this后加参数则调用的是当前具有相同参数的构造函数。
final成员:当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对
于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能
选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。
如果不加访问权限,则默认为包访问权限,即包内的类对其有访问权限。
protected:继承访问权限。基类通过protected把访问权限赋予派生类而不是所有类,
另外,protected也提供包访问权限,也就是说,相同包内的其他类可以访问protected元素。
对于类访问权限来说,
仅有两个选择:包访问权限或public。
类既不可以是private的,也不可以是protected的,但内部类是个特例,一个内部类可以是private或protected的。
每个.java文件只能有一个public类。这么做的意思是,每个编译单元只能有一个公开的接口,而这个接口就由其public类来表示。你可以根据需要,往这个文件里面添加任意多个提供辅助功能的package权限的类。但是如果这个编译单元里面有两个或两个以上public类的话,编译器就会报错。