Java成长之路二
万物皆对象
对象操作
- Java利用万物皆对象的思想和单一一致的语法方式来简化问题;
- 虽万物皆可为对象,但我们所操作的标识符实际上是对对象的引用;
- 仅仅有一个“引用”并不意味着必然有一个与无关联的“对象”;(若
String s
无对象,只是创建了一个引用)
- 安全的作法是
String s = "adbc";
对象的创建
- 通过
new
操作符来创建一个新对象;
String s = new String("abcd");
数据存储
- 寄存器(Registers):最快的存储区域,位于cpu内部,寄存器数量十分有限,没发法直接控制,也无法在自己的程序里找到寄存器存在的痕迹;
- 栈内存(Stack):存在于常规内存(RAM——随机访问存储器,Random Access Memory)区域中,可通过栈指针获得处理器的直接支持。栈指针下移分配内存,上移释放内存。(速度仅次于寄存器);创建程序时,Java系统必须知道栈内的保存的所有项生命周期。这种约束也限制了程序的灵活性,因此虽然在栈内存上有些数据(如对象引用),但Java对象本身的数据却是保存在堆内存的;
- 推内存(Heap):这是一种通用的内存池(也在RAM),所有Java对象都存在其中,只需要
new
命令就可以实例化一个对象。当执行代码时,会自动在堆中进行内存分配。但分配和清理内存需要更多的时间。但随着时间上的对接,Java的堆内存分配机制已经非常快;
- 常量内存(Constant Storage)常量值永不改变,通常直接向在程序代码中,可将其置于只读存储器ROM(只读存储器,Read Only Memory)中;(一个例子是字符串常量池,所有文字字符串和字符串常量表达式都会放入静态存储中)
- 非RAM存储(Non-RAM Storage):数据安全存在于程序之外,在程序未运行以及脱离程序控制后依然存在。
- 序列化对象:对象别转化为字节流;通常发送到另一个机器;
- 持久化对象:对象被放在磁盘上,即使程序终止,数据依然存在,存储的方式都是将对象转入到一个介质中,并在需要时恢复成常规后,基于RAM的对象;
- Java为轻量级持久化数据提供了支持,而如JDBC和Hibernate库为使用数据库存储和检索对象提供更为复杂的支持;
基本类型的存储
- Java中的基本类型不是使用new创建变量,而是使用一个“自动”变量,这个变量直接存储“值”,并置于栈内存中;
- 基本类型的大小是固定的,不会变化也是Java具有可以移植性的原因之一;
- 最大值-1是因为十进制->二进制的关系
- 基本类型有自己对应的包装类型,如果你希望堆内存里表示基本类型的数据,就需要用到包装类;
高精度计算
- BigInteger & Bigdecimal 高精度但会消耗一些速度;
- BigInteger 高精度整数;Bigdecimal高精度定点数字,可用于货币计算;
数组的存储
- Java数组只能使用前需要被初始化,并且不能访问长度之外的数据。每个数组上消耗了少量的内存开销及运行中检查下标的额外时间为代价的,但换来的是安全性和效率的提高是值得的;
- 我们创建数组只是创建了一个数字引用,并每个引用的初始值为
null
。我们必须为每个引用指定一个对象;
对象的清理
- 作用域:是依靠”{}”的位置决定的
- 对象作用域:Java对象与基本类型具有不同生命周期,当我们使用new关键字来创建java对象是,他的生命周期将超出作用域;
{String s = new String("a string");}
- 引用 s 在作用域终点就结束了,引用是指向的字符串对象依然占用内存;
- Java会主动清理这些对象,当Java的垃圾收集器会检查所有new出来的对象并判断不再可达,继而再释放被占用的内存,供给其他新的对象使用;
类的创建
- 如果类的成员变量(字段)是基本类型,那么类初始化时,这些类型会被赋予一个初始值;但这种默认值的赋予并不适用于局部变量(那些不属于类的字段变量)
方法使用
- 在Java中,使用术语(method)来表示“做某事的方式”;
- 在Java中,方法决定对象能接收哪些消息;
- 方法的组成包括名称,参数,返回类型,方法体;
- 方法的返回类型表明了当你调用它时,会返回的结果类型;
- 参数列表表明了可被传递到方法内部的参数类型及名称;
- 方法名和参数列表统称为方法签名(signature of method)签名作为方法的唯一标识;
- Java中的方法只能作为类的部分创建;
参数列表
- 方法参数列表指定了传递给方法的信息;
- return有两个作用:1.方法执行结束;2.返回值;
- 如果我们不想返回数据,可用
void
方法来标识,来表明这是一个无需返回值的方法;
- 当返回类型为void时,return关键字仅用于退出方法。
- 若返回类型为非void,则编译器会强制我们返回相应类型的值;
命名可见性
- Java为一类库生成一个明确的名称,使用网络命名反向命名;(com.top.miaogodthink)
- 文件中的每个类都有唯一标识符;
使用其他组件
static关键字
- 类是对象的外观及行为方式的描述。通常只有再使用new创建那个类的对象后,数据存储空间才被分配。对象方法才能供外界调用;
static
:为了满足:1.有时只要为特定字段(注:也称为属性、域)分配一个共享存储空间;而不去考虑要创建多少对象甚至根本就不创建对象;2.创建任何一个与此类的任何对象无关的方法,没有创建对象也能调用方法;
- 静态方法在使用之前不需要创建对象,因此它们不能直接调用非静态的成员或方法;(因为非静态方法必须使用实例化对象才能被调用;)
- 我们可以通过类名直接引用它,而非静态变量成员则不行;(StaticTest.i++;)
- 使用类名直接引用静态变量是首选方法,强调了变量的静态属性;
- 同样的静态方法也适用,通过类直接调用而无需实例化;
static
修改时,允许我们无需创建对象就可以直接通过类的引用来调用这个方法;
- 每个Java源文件中允许有多个类,同时源文件的名称必须要和一个类名相同,否则编译器会报错;
- 每个独立的程序包含一个main()方法作为程序运行的入口;
- main()方法的参数是一个String数组(String[]),参数args并没有在当前程序中用到,但是java编译器要求必须要有用于接收从命令行输入的参数;