二. 万物皆对象

1. 面向过程与面向对象

面向过程

就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

面向对象

是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

2. 对象操纵

在C/C++中,通过指针操纵对象。

在Java中,万物皆可为对象,但我们所操纵的标识符只是对对象的"引用"。一个"引用"不一定有对象与之关联,如:

String s;

只创建了一个String对象的引用,而非对象。

也可以创建一个引用的同时进行初始化,如:

String s = "abc";

3. 对象创建

“引用"用来关联"对象”。在Java中通常使用new关键字来创建一个新的对象实例,如:

String s = new String("abc");

数据存储

程序在运行时,有5个不同的地方可以存储数据:

寄存器 最快的存储区域,位于CPU内,寄存器数量十分有限,要按需分配,但我们对其没有直接的控制权(C/C++中允许开发者向编译器建议寄存器的分配)。

栈内存 存在于RAM中,可通过栈指针获得处理器的直接支持,指针下移分配内存,上移释放内存。创建程序时,Java系统必须知道栈内存的所有项的生命周期,这限制了程序的灵活性。因而,栈内存中存在一些Java数据(如对象引用),但Java对象本身的数据是保存在堆内存中。

堆内存 一种通用的内存池(也在RAM区域),所有Java对象都存在于此。与栈内存不同,编译器不需要知道对象必须在堆内存中停留多久(保存数据更灵活)。用new实例化来创建对象,当代码执行时,会自动在堆中进行内存分配。然而这种灵活性是有代价的:分配和清理堆内存要比栈内存需要更多的时间。不过随时间的推移,Java的堆内存分配机制已经非常快,无需关心。

常量存储 常量值通常直接放在程序代码中,如需严格保护,可考虑放到ROM中。

非RAM存储 数据完全存在于程序外,程序未运行及脱离程序控制后依然存在。如:序列化对象(对象被转换为字节流,通常被发到另一台机器),持久化对象(对象被放在磁盘上,程序终止,数据仍在)等。

基本类型的存储

基本类型是一组在Java中使用频率很高的类型,它们的创建不是通过new关键字产生。这些变量创建后直接存储"值",并置于栈内存中,因而更高效。Java中一共用8种基本类型:

4种整型(int “4字节”,short “2字节”,long “8字节”,byte “1字节”),

2种浮点型(float “4字节”,double “8字节”),

1种字符型(char “2字节”)

和1种表示真假的boolean类型(其大小没有明确规定)。

基本类型都有自己的包装类型,如果要在堆内存中表述基本类型的数据就要用到包装类。

char c = 'x';
Character ch = new Character(c);

或者:

Character ch = new Character('x');

基本类型自动转换成包装类(自动装箱):

Character ch = 'x';

包装类型转化为基本类型(自动拆箱):

char c = ch;

高精度数值

Java提供了两种类型的数据用于高精度计算:BigInteger和BigDecimal。

4. 对象作用域

Java对象与基本类型具有不同的生命周期。当我们使用new关键字来创建Java对象时,它的生命周期将会超出作用域。如:

{
	String s = new String("abc");
}

引用s在作用域终点就结束了。但是,引用s指向的字符串对象依然还在占用内存。(因为唯一对它的引用s已超出了作用域的范围,所以我们无法在这作用域之后访问此对象)

只要你需要,new出来的对象就会一直存活下去。(如果内存被填满,Java的垃圾回收器会判断哪些对象不可达,继而释放那些被占用的内存,供其他新的对象使用)

5. 基本类型默认值

如果类的成员变量(字段)是基本类型,那么在类初始化时,这些类型将会被赋予一个初始值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tv8Gby4o-1595160282441)(C:\Users\13615\AppData\Roaming\Typora\typora-user-images\image-20200719200055567.png)]

这些默认值仅在Java初始化类的时候才会被赋予。但这种默认值的赋予并不适用于局部变量——那些不属于类的字段的变量。 因此,若在方法中定义的基本类型数据,如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X5c8Nn9v-1595160282442)(C:\Users\13615\AppData\Roaming\Typora\typora-user-images\image-20200719200116744.png)]

这里的变量x不会自动初始化为0。

6. static关键字

类是对象的外观及行为方式的描述。通常只有在使用 new 创建那个类的对象后,数据存储空间才被分配,对象的方法才能供外界调用。这种方式在两种情况下是不足的。

有时你只想为特定字段(也称为属性、域)分配一个共享存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建对象。

创建一个与此类的任何对象无关的方法。也就是说,即使没有创建对象,也能调用该方法。

static关键字(从C++采用)就符合上述两点要求。当我们说某个事物是静态时,就意味着该字段或方法不依赖于任何特定的对象实例。即使我们从未创建过该类的对象,也可以调用其静态方法或访问其静态字段。相反,对于普通的非静态字段和方法,我们必须要先创建一个对象并使用该对象来访问字段或方法,因为非静态字段和方法必须与特定对象关联。

代码示例:

class StaticTest {
	static int i = 47;
}

现在,即使创建了两个StaticTest对象,但是静态变量i仍只占一份存储空间。两个对象都会共享相同的变量i。

StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();

st1.i和st2.i指向同一块存储空间,因此它们的值都是47。

StaticTest.i++;

此时st1.i和st2.i的值都变成了48。

参考资料:On Java 8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值