一切都是对象
通过引用操作对象
1 | String s = "abc"; |
对象”abc”在堆中,s是对其的一个引用。
new创造对象
1 | ArrayList<Integer> list = new ArrayList<Integer>(); |
基本数据类型(primitive type)
由于基本数据类型经常用到,如果将其变为类,通过new 在堆上分配的话,开销太大,所以java将基本数据类型在栈上分配。且与c/c++不同,这些类型的大小固定。
不需要销毁对象
对象作用域
1 | { |
在上面的语句中,引用s的作用域在{}之间,而对象”abc”在堆上分配,在{}之外仍然存在,知道被垃圾回收器回收之前,一直存在。
所以与c++不同,java中new 出的对象不需要自己手动释放,垃圾回收器(garbage collector)会通过引用计数等方法自动判断某个对象不再被使用,释放内存。
类成员变量默认值
类内的基本类型成员变量,会默认初始化。1
2
3
4
5
6public class A{
int x;
public void f(){
int y;
}
}
上段代码中,x会被默认初始化为0,而y的值和c/c++中相同,可能是任意值,但是java会在编译期报错,c/c++会警告。
操作符
== equals
对于对象来说, == 是判断两个对象的引用是否相同。
如:1
2
3
4
5public static void main(String[] args){
Integer n1 = new Integer(1);
Integer n2 = new Integer(2);
System.out.println(n1 == n2);
}
上段代码输出为false
,为了实现自己的对象比较,需要用equals方法,默认的equals是比较引用,需要进行覆盖。
java没有sizeof
c/c++中的sizeof主要是为了方便移植,因为同一个类型在不同的机器上占用的字节大小不同。但是java的基本数据类型是固定大小的。