用引用操纵对象
尽管Java是基于C++的,但相比之下,Java是一种更“纯粹”的面向对象程序设计语言。
每种编程语言都有自己得操纵内存中元素的方式。例如c和c++里面的指针
在Java这里得到了简化。一切被视为对象,因此可以采用单一固定的语法。尽管一切都看做对象,但操纵的标识符实际上是对象的一个“引用”(reference)
而且引用可以独立存在,并不一定需要有一个对象与它关联。
String s;
这里只是创建引用,并不是对象
必须有你创建所有对象
一旦创建了一个引用,就希望它能与一个新的对象相关联。通常用new操作符来实现这一目的。new关键词的意思是“给我一个新对象”
String s = new String("洛小白");
存储到什么地方呢?
- 寄存器。这是最快的存储区,因为它位于不同与其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以 寄存器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象
- 堆栈。位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内容;若向上移动,则释放哪些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈内所有项的声生周期,以便于上下移动栈堆指针,这一约束限制了程序的灵活性,所有虽然某些Java数据存储于堆栈中——特别是堆栈引用,但是Java对象并存储在其中
- 堆。一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因此。在堆栈分配存储有很大的灵活性。当需要一个对象时,只需用new写一行简单的代码,当执行的这行代码时,会自动在堆栈里进行存储分配。当然,为这种灵活性必须付出相应的代价;用堆栈进行存储分配和清理可能比用堆栈进程存储分配需要更多的时间。
- 常量存储。常量值通常直接存在程序的代码内部,这样做是安全的,因为他们永远不会被改变。
- 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子就是流对象和持久化对象。在流对象中,对象转换成字节流,通常被发送给另一台机器。在“持久化对象”中,对象被存放于磁盘上,因此,即使程序终止,他们仍可以保持自己的状态。这种存储方式的技巧在于:把对象转换成可以存放在其他媒介上的事物,在需要时,可恢复成常规的,基于RAM的对象。Java提供了轻量级持久化支持,而诸如JDBC和Hibernate这样的机制提供了更加复杂的对于在数据库中存储和读取对象信息的支持。
基本类型
Java要确定每种基本类型所占存储空间的大小。它们大小并不像其他大多数语言那样随机器硬件架构的变化而变化。
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
---|---|---|---|---|
boolean | —— | —— | —— | Boolean |
char | 16-bit | Unicode 0 | Unicode 2^16-1 | Character |
byte | 8 bits | -128 | +127 | Byte |
short | 16 bits | -2^15 | +2^15-1 | Short |
int | 32 bits | -2^31 | +2^31-1 | Integer |
long | 64 bits | -2^63 | +2^63-1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
void | —— | —— | —— | Void |
所有的数值类型都有正负
boolean类型所占用存储空间大小没有明确指定,仅定义为能够取字面值true或false
基本类型具有包装类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型
char c = 'x';
Character ch = new Character(c);
高精度数字
Java提供了两个用于高精度计算的类:BigInteger和BigDecimal
BigInteger : 支持任意精度的整数。
BigDecimal:支持精任何度的定点数,例如进行精密的货币计算
永远不需要销毁对象
作用域
作用域大多数过程行语言都有作用域(scope)的概念。作用域决定了在其内定义的变量名的可见性和生命周期。
以下代码在c和c++中是合法的,但是在JAVA总却不能这么写
示例编译器将会报告变量x已经定义过
对象的作用域
java对象不具备和基本类型一样的生命周期。当用new创建一个java对象时,它可以存活于作用域之外。
示例引用s在作用域终点就消失了,而已s指向的String对象仍继续占据内存空间。
事实证明,由new创建的对象,只要你需要,就会一直保留。
那么怎么防止对象填满内存呢?
java有一个垃圾回收器,用来监视new创建的所有对象,并辨别那些不会再被引用的对象。随后释放这些对象的内存空间,以便其他新的对象使用。
创建新的数据类型:类
大多数面向对象的程序设计语言习惯用关键字class来表示“我准备告诉你一种新类型的对象看起来像什么样子”
class这个关键字之后紧跟着的是新类型的名称。例如:
尽管你还不能用这个类做太多事情,然而,你已经可以用new来创建这种类型的对象
案例
字段和方法
一旦定义了一个类,就可以在类中设置两种类型的元素:字段(也被为称作数据成员)和方法(也被称作成员函数)
字段:可以是任何类型的对象,也可以是基本类型中的一种。
如果字段是对某个对象的引用,那么必须初始化该引用,以便其与一个实际的对象相关联。
每个对象都有用来存储起字段的空间,普通的字段不能再对象间共享:列如:
案例
这个类出来存储数据外什么事都不能做,但是仍然可以创建它的一个对象:
案例
那么如何给字段赋值呢?
在对象引用的名称后面接着一个句号,然后接着的是对象内部的成员名称。
案例
基本成员默认值
若类的某个成员是基本数据类型,即使没有进行初始化,java也会确保他获得一个默认值
但是这些初始值对你的程序来说,可能是不正确的,甚至不合法的。所以最好明确地对变量进行初始化。
基本类型 | 默认值 |
---|---|
boolean | false |
char | '\u0000'(null) |
byte | (byte)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
然而上述确保初始化的方法并不适用了“局部变量”(即并非某个类的变量)
因此如果在某个方式中定义int x; 那么变量x可能是任意值,而不会被初始化为零。
所以在使用x的时候,先赋一个适当的值,如果忘了这么做,java在编译时就会返回一个错误
方法,参数,和返回值
许多程序设计语言用函数这个术语来描述命名子程序,而且在java里却用方法这个术语来表示“做某些事情的方式”。
java的方法决定了一个对象能够接收什么样的信息。
方法的基本组成部分包括:
1. 名称
2. 参数
3. 返回值
4.方法体
java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用。而且对象必须能执行这个方法调用。
如果试图在某个对象上调用它不具备的方法,那么在编译时就会得到一条错误信息。
方法的调用类似于字段的调用:例如
参数列表
在参数列表中必须指定每个所传递对象的类型及名称,这里传递的对象实际上也是引用。
return·的用法有两个方面
- 代表已经做完,离开此方法
- 如果此方法得到一个值需要返回,这个值放在return后面
如果返回类型是void,那么return只是用来退出方法
如果返回类型不是void,那么无论在何处返回,编译器都会强制你返回一个正确类型的返回值
网友评论