1.用引用操作对象
操纵的标识符其实是对象的“引用”。如遥控器(引用)操作电视(对象)。
(1)创建一个String引用,这里创建的只是引用并不是对象(拥有一个引用并不需要有一个对象与它关联)。
String s;
(2)创建一个引用同时进行初始化。
String s="qwer";
(3)创建一个引用,并与一个新的对象相关联,用操作符new实现。
String s = new String("qwer");
2.存储数据
(1)寄存器:最快的存储,位于处理器内部,但寄存器的数量极其有限,根据需求进行分配,不能直接控制,在程序过程中也感受不到。
(2)堆栈:位于RAM(随机访问储存器)中。通过堆栈指针可以从处理器获得直接支持,若堆栈指针向下移动,分配新的内存,向上移动释放内存。必须知道堆栈内所有项目的生命周期,以便上下移动堆栈指针。某些JAVA数据存储于堆栈中,特别是对象引用,但JAVA对象并不存在其中。
(3)堆:一种通用的内存池,也位于RAM中,存放所有的JAVA对象。优点是不需要知道存储数据生命周期。缺点是存储分配和清理比堆栈存储分配需要更多时间。
(4)常量存储:常量值通常直接存放在程序代码内部。也可以存放在ROM(只读存储器)中
(5)非RAM存储:数据存活于程序之外,不受程序控制,程序没有运行时也存在。流对象和持久化对象。在流对象中,对象转化成字节流,通常发给另一台机器,持久化对象中,对象被存放在磁盘中。原理是把对象转化成可以存放在其他媒介上的事物,需要时可恢复成常规的,基于RAM的对象。
3.基本类型
不用new来创建变量,而是创建一个并非引用的“自动”变量,这个变量直接存储“值”,并置于堆栈中,更加高效。
| 基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
|---|---|---|---|---|
| boolean | -- | -- | -- | Boolean |
| char | 16 bits | Unicode 0 | Unicode 2^16 -1 | Character |
| byte | 8 bits | -128 | 127 (2^7 -1) | Byte |
| short | 16 bits | -2^15 | 2^15 -1 | Short |
| int | 32 bits | -2^31 | 2^31 -1 | Integer |
| long | 64 bits | -2^63 | 2^63 -1 | Long |
| float | 32 bits | 1.4E - 45 | 3.4028235E38 | Float |
| double | 64 bits | 4.9E - 324 | 1.7976931348623157E308 | Double |
| void | -- | -- | -- | Void |
基本类型拥有的包装器类,可以在堆中创建一个非基本对象,用来表示对应的基本类型。
//方式一
char c='x';
Character ch = new Character(c);
//方式二
Character ch = new Character('x');
//方式三(自动包装功能,可以自动地把基本类型转化为包装器类型)
Character ch = 'x';
//反向转换
char x = ch;
高精度数字:
BigInteger,BigDecimal ,属于包装器类型,但是没有对应的基本类型。能作用于int、float的功能也能作用于BigInteger、BigDecimal,不过必须以方法调用的方式取代运算符的方式来实现,这样复杂了很多,速度更慢,用速度换取了精度。
数组:
Java保证初始化数组,而且不能在它的范围之外被访问。
当创建一个数组对象时,就是创建一个引用数组,并且每个引用都会自动被初始化成一个特定值,该值拥有自己的关键字null。在使用任何引用前,必须为引用指定一个对象。
还可以创建用来存放基本数据类型的数组,编译器也能保证这种数组的初始化,因为它会将这种数组所占的内存全部置零。
4.对象的作用域
在C和C++中将一个较大作用域的变量隐藏起来的做法,在JAVA中是不允许的,如:
{
int x=12;
{
int x=96;
}
}
Java对象不具备和基本类型一样的生命周期,当用new创建一个对象时,它可以存活于作用域之外。用new创建的对象,只要你需要,就可以一直保留下去。我们无法在作用域之外访问这个对象,因为对它的唯一引用已超出了作用域范围。
5.创建新的数据类型:类
可以在类中创建两种类型额元素,字段和方法。字段可以是任何类型的对象,可以通过其引用与其通信;也可以是基本类型。
若成员变量是基本数据类型,Java会确保给其默认值,即使没有初始化,也会有默认值,如果是局部变量(并非某个类的字段)则不成立。
方法名和参数列表(称为方法签名)唯一标识出某个方法。
参数传递的其实是引用。
static关键字:当声明一个事物是static时,这个域或方法不会与包含它的类的任何对象实例产生关联。