java编程思想笔记(二)、(三):对象和操作符

一切都是对象

通过引用操作对象

1
String s = "abc";

对象”abc”在堆中,s是对其的一个引用。

new创造对象

1
ArrayList<Integer> list = new ArrayList<Integer>();

基本数据类型(primitive type)

由于基本数据类型经常用到,如果将其变为类,通过new 在堆上分配的话,开销太大,所以java将基本数据类型在栈上分配。且与c/c++不同,这些类型的大小固定。

不需要销毁对象

对象作用域

1
2
3
{
String s = "abc";
}

在上面的语句中,引用s的作用域在{}之间,而对象”abc”在堆上分配,在{}之外仍然存在,知道被垃圾回收器回收之前,一直存在。

所以与c++不同,java中new 出的对象不需要自己手动释放,垃圾回收器(garbage collector)会通过引用计数等方法自动判断某个对象不再被使用,释放内存。

类成员变量默认值

类内的基本类型成员变量,会默认初始化。

1
2
3
4
5
6
public class A{
int x;
public void f(){
int y;
}
}

上段代码中,x会被默认初始化为0,而y的值和c/c++中相同,可能是任意值,但是java会在编译期报错,c/c++会警告。

操作符

== equals

对于对象来说, == 是判断两个对象的引用是否相同。
如:

1
2
3
4
5
public 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的基本数据类型是固定大小的。