Java基础知识
对象的存储
在java 编程思想中,java有五个不同的地方可以存储数据:
1. 寄存器
这是最快的存储区,因为它位于处理器内部。但是由于寄存器数量有限,所以它是根据需求进行分配,无法手动干预的。
2. 堆栈
位于通用RAM(随机访问存储器)中,通过堆栈指针可以从处理器那里获得直接支持。堆栈指针向下移,则分配新的内存,向上移则释放那些内存。其速度仅次于寄存器,但是必须知道存储项的大小和生命周期,这一限制会限制程序的灵活性,所以在堆栈中只存储引用,而不存储对象。
3. 堆
通用内存池,用于存放所有的java对象
4. 常量存储
常量值通常直接存放在程序代码内部,这样做是安全的,因为他们永远不会被改变。
5. 非RAM存储
如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。
基本的例子是:流对象和持久化对象。在流对象中,对象转化为字节流,通常发送给另一台机器。持久化对象则将对象存放于磁盘上。
java的基本类型
java的基本类型有以下几种
基本类型 | 大小 | 最小值 | 最大值 | 默认值 | 对象类型 |
---|---|---|---|---|---|
boolean | - | - | - | false | Boolean |
char | 16 bits | Unicode 0 | Unicode 216 -1 | ‘\u0000’(null) | Character |
byte | 8 bits | -128 | 127 | (byte)0 | Byte |
short | 16 bits | −215 | 215−1 | (short)0 | Short |
int | 32 bits | −242 | 231 -1 | 0 | Integer |
long | 64 bits | −263 | 263 -1 | 0L | Long |
float | 32 bits | 3.4e-45 | 1.4e38 | 0.0f | Float |
double | 64 bits | 4.9e-324 | 1.8e308 | 0.0d | Double |
void | - | - | - | - | Void |
由于其生命周期以及大小都可以确定,java的基本类型值在创建后被直接存储在栈中,因此更加高效.
对象的创建
java的对象通过new关键字创建
如:Integer ten = new Integer(10);
这里就创建了一个内容为10的Integer对象,而前面的ten则是对后面创建对象的一个引用。
但是对于基本类型,我们可以直接引用它的值
如:int ten = 10;
因为java的基本类型直接存储在栈中,而栈中的生命周期和大小都是确定的,所以不管执行多少次,这里的10指向的内存地址都是同一个。
方法,参数和返回值
java中的函数成为方法,方法的基本组成如下:名称,参数,返回值和方法体。
其基本形式如下:
ReturnType methodName(ArgumentList ... ){
MethodBody
}
通过对象调用方法时,需要先列出引用名称,后面是句点,方法名称和参数,示例如下:
objectName.methodName(argument1,argument2);
java数组
当创建一个对象数组时,实际上就是创建了一个引用数组,每个引用都会被初始化为null。
还可以创建基本数据类型的数组,编译器会确保这种数组的初始化,它会将这种数组所占的内存全部置成零。
java注释
java的注释分为单行注释和多行注释
单行注释:
//单行注释
多行注释
/**
*多行注释
*/
注释中的标签
java中用标签和注释的形式来加注文档
@see 允许用户引用其他类的文档,以超链接的形式生成See Also 条目
@link 同@see,但是生成的是label
@docRoot 文档树页面的显式超链接
@inheritDoc 从基类继承相关文档
@version 版本信息
@author 作者
@since 指定最早使用的版本
@param 参数
@throws 抛出异常
@deprecated 已过期不再维护的对象或方法
Java 自动装箱与拆箱
基本数据类型含有自动装箱(autoboxing)和拆箱(unboxing)的功能
一般情况下,创建一个Integer对象是这样的:
Integer nine = Integer(9);
但是,事实上,我们可以这样创建:
Integer nine = 9;
实际运行的代码则是:
Integer nine = Integer.valueOf(9);
这种将基本类型自动转化成封装对象的功能成为自动装箱。
而当我们引用基本类型时,我们可以这样:
Integer nine = 9;//自动装箱
int basicNine = nine;
这里直接将nine的值转化为basicNine对应的基础int值,实际运行的代码如下:
int basicNine = nine.intValue();
值得注意的是valueOf的方法中有如下实现:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
当int大于等于-128并且小于等于127时,自动从缓存中获取,并返回对象。
所以当运行以下代码时
Integer a1 = 100;
Integer a2 = 100;
if(a1 == a2){
System.out.println("a1与a2地址相同");
}
执行后会打印出信息
但是如果以下代码
Integer a1 = 200;
Integer a2 = 200;
if(a1 == a2){
System.out.println("a1与a2地址相同");
}
则不会打印。