java 一切都是对象
1. 用引用操纵对象
在Java中一切皆对象,我们平常在对java中的类进行操作时,其实操作的不是对象本身而是对象的引用。我们可以将这想象成用遥控器(引用)操作电视机(对象),只要握住这个遥控器,就能保持与电视机的连接,当想换频道时,实际操作的是遥控器(引用),然后再由遥控器操作电视机(对象)。如果想在房间里面走走,并且想操作电视机,这时候只需要带上遥控器(引用)就可以了,并不需要电视机(对象)。
此外,即使没有电视机,遥控器也可以单独存在,也就是说,你拥有一个引用,并不一定需要有一个对象与它关联。
如果想操作一个词或者句子,可以创建一个String引用,String s; tip: 这里创建的只是一个引用,并不是对象,如果现在向 S 发送一个消息,就会返回一个运行时错 误。
在使用任何引用前,必须为其指定一个对象,如果想使用还是一个 null 的引用,在运行时将会报错
2. 对象存储在什么地方
寄存器:这是最快的存储区,因为它位于不同于其他其他存储区的地方---处理器内部。但是寄存器的数量有限,所以寄存器根据需求进行分配。寄存器不能直接控制, 也不能在程序中感觉到任何存在的迹象
堆栈: 位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得支持。堆栈指针若向下移动,则分配新的内存,若向上移动,则释放那些内存,这是 一种快速有效的分配存储方式,仅次于寄存器。创建程序时,java系统必须知道存储在堆栈内所有项的确切声明周期,以便上下移动堆栈指针。这个约束限制了 程序的灵活性,所以虽然某些java数据存储在堆栈中,特别是对象引用,但java对象并不存储在堆栈中。
堆: 一种通用的内存池,用于存放所有的Java对象,堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间,因此,在堆里分配存储有很大的灵活 性。当需要 一个对象时,只需要用 new 写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配 。但是,用堆进行存储分配和清理可能比堆栈进行存 储分配需要更多的时间
常量存储: 常量池
3. 特例:基本类型
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 | 字节 |
byte | 8 bits | -128 | 127 | Byte | 1 字节 |
short | 16 bits | -2的15次方 | 2的15次方减1 | Short | 2字节 |
int | 32 bits | -2的31次方 | 2的31次方减1 | Integer | 4字节 |
long | 64 bits | -2的63次方 | 2的63次方减1 | Long | 8字节 |
float | 32 bits | 2的-149次方 | 2的128次方减1 | Float | 4字节 |
double | 64 bits | 2的-1074次方 | 2的1024次方减1 | Double | 8字节 |
boolean | -- | -- | -- | Boolean | 1字节 |
char | 16 bits | -- | -- | Character | 2字节 |
4. 永远不需要销毁对象
在java中由new创建的对象,只要需要就会一直存在,但是如果让对象继续存在,就会造成对象填满内存空间,进而影响程序的运行。所以在Java中有一个垃圾回收器,用来监视所有用new创建的对象,并识别出不再使用的对象,随后,释放这些对象的内存空间,供其他对象使用。
5. 创建新的数据类型:类
基本类型 | 默认值 |
boolean | false |
char | '\uooo'(null) |
byte | (bye)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
当变量作为类的成员使用时,java会赋给基本类型一个默认值,确保他们会执行初始化。但是这个方法不适用于局部变量。如果在某个方法中定义了一个局部变量X; 那么X得到的可能是任意一个值,并且不会被自动初始化。所以在使用局部变量前,应该先赋予一个适当的值。
6. 方法、参数和返回值
方法的参数列表指定要传递给方法什么样的信息,这些信息像java中其他信息一样,采用的都是对象形式,因此在参数列表中必须指定每个所传递对象的类型和名字。 并且像java中任何传递对象的场合一样,这里传递的也是引用。
值传递:就是在方法调用的时候,实参是将自己的一份拷贝赋给形参,在方法内对参数的值进行修改不影响原来实参的值
引用传递:就是在方法调用的时候,实参将自己的地址传递给形参,在方法内对参数的修改实际上是对该实参的实际操作。