一、java中一切都被视为对象,但是操纵的标识符实际上是对象的一个“引用"(reference),可以想象成:遥控器(引用)操纵电视机(对象),若在房间里四处走动的同时能调控电 视机,那么只需要携带遥控器(引用)而不是电视机(对象)。即使没有电视机(对象),遥控器(引用)也可独立存在,所以,引用并不一定与一个对象关联,创建String 引用如下:
String s;//只是创建引用。并不是创建对象。
//若此时向 s发送一个消息,就会返回一个运行时错误,因为此时 引用 s 没有与任何事物相关联。
安全的做法:
创建一个引用的同时对其初始化:
String s="abc";
二、有5个不同的地方存放数据:
1.寄存器:不能直接控制,最快存储区。
2.堆栈:位于通用的RAM中,栈的指针向下移动(低地址),则分配新的内存;栈的指针向上移动(高地址),则释放内存。
3.堆:一种通用的内存池(也位于RAM中),用于存放所有的java对象。new生成一个对象,则在堆里进行存储分配。堆有很大的灵活性,但是用堆存储分配和清理可 能比栈需要更多时间。
4.常量存储
5.非RAM存储:数据存活于程序之外,在程序没有运行时也可以存在,例如:流对象和持久化对象。
三、Java不用new来创建基本类型的变量,而是创建一个 并非是引用 的 “自动”变量。这个变量直接存储“值”,并置于 堆栈 中。Java中基本类型所占的存储空间的大小是固定的,并不是像其他语言一样随硬件架构变化而变化,这种存储空间的不变性是 Java程序更具有 可移植性的原因之一。
基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,对来表示一个基本的类型,例: Character ch= new Character('x');
四、数组错误在Java中可以避免的原因:
Java中创建一个数组对象时,实际上就是创建了一个数组引用,并且每个引用都会自动被初始化为一个特定值,该值有自己的关键字null。一旦Java看到null,就知道这个引用还没有指向某个对象。在使用任何引用前必须为其指定对象;若 试图使用一个还是null的引用,在运行时会报错。
五、Java 对象不具备和基本类型一样的生命周期。new创建的一个Java对象,可以存活于作用域之外,例如:
{
String s = new String("a string");
}
引用 s 在作用域终点就消失了。然而 s指向的String对象仍然占据着 内存空间。Java有一个垃圾回收器,用来监视new创建的所有对象,并辨别和清理那些不会再被引用的对象。
六、若类的某个成员是基本数据类型,即使没有初始化,Java也会确保它获得一个默认值。当变量作为类的成员使用时,Java才确保给定其默认值。
然而上述确保初始化的方法并不适用于”局部“变量(即并非某个类的字段),因此,如果在某个方法定义中有:
int x ;
那么变量x可能为任意值,不会被自动初始化,所以在使用x前,应先对其赋值,若没有赋值,则 Java会在编译时 返回错误(Java优于C++的地方)。