第2章一切都是对象
对象的定义(类型)、创建、存储、操纵、销毁、组成,引用(基本变量名)的初始化
2.1 用引用操纵对象
·编程语言操纵内存中元素的方式:
·C、C++:基于特殊语法的间接表示—指针
·Java:操纵对象引用 ->对象
·创建引用
·创建对象
·关联:“=”
·String类型:用带引号的文本初始化
·对引用的初始化
2.2 必须由你创建所有对象
·存储位置
·寄存器:最快;CPU内;数量有限;按需分配;无法直接控制;觉察不到存在(C、C++允许向编译 器建议寄存器的分配方式);【谁在操控寄存器?】
·堆栈:速度仅次于寄存器;RAM中;堆栈指针控制;
·堆栈指针:{向下移动:分配内存;向上移动:释放内存}
·灵活受限:统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动指针;
·{对象引用:堆栈;new出的对象:堆}
·堆:比栈慢;RAM中;用于存放所有的Java对象
·和堆栈相比:
·好处:编译器不需要知道存储的数据在堆里存活多长时间,更灵活
·坏处:进行存储分配和清理比堆栈要更多时间
·常量存储:通常放在程序代码内,安全,永不改变
·嵌入式系统:同代码分离,存放在ROM中
·非RAM存储:流对象 & 持久化对象——完全存活于程序之外;不受程序的 任何控制
·流对象(序列化 - 轻量级持久化):对象转化成字节流,通常被发送给另一台机器
·持久化对象:存在磁盘上;需要时可恢复成基于RAM的对象
·严格持久化:JDBC、Hibernate机制
·特例:基本类型:并非是引用的“自动”变量,直接存“值”,堆栈中
·占据存储空间的大小不变
·boolean类型~存储空间(大小):没有明确指定,仅定义为能够取字面量true或false
·void是基本类型(返回类型)但没有值,有包装器类型
·什么是拆箱比较?
·BigInteger & BigDecimal:大体上属于“包装器类”,但没有对应的基本类型
·方法调用方式 而非运算符方式
·速度换取了精度
·Java中的数组
·C、C++中的数组 = 内存块:
·问题:
1.可能在初始化前被使用(内存);
2.访问自身内存块之外的数组
·Java:
·确保数组会被初始化后才能使用——每个数组上少量的内存开销
·不能在它的范围之外被访问——运行时的下标检查
·Java有时可以优化以上操作
·Java KO. C、C++:更安全,效率更高
·Java编译器初始化数组:
·引用数组:null
·基本数据类型数组:0
2.3 永远不需要销毁对象
·作用域决定变量名的可见性、生命周期
·(作用域内的)代码(一般)存在于堆栈中
·Java对象:和基本类型生命周期不同——new出来的对象在堆中,可以存活于作用域之外
·存活于作用域之外:也就是说,作用域内的东西被清理后,垃圾回收器会在任意时间回收它
·Java垃圾回收器监视new创建的对象,辨别不会再被引用的对象,随后【什么时候?】释放这些对象的内存空间~消除了“内存泄漏”
·不用new创建对象的方式:
·Class或Constructor类的newInstance()方法
·clone()
·反序列化
·那么问题来了,这些对象怎么清理?finalize()?
2.4 创建新的数据类型:类
·类[字段不是局部变量,方法]
·基本类型成员默认值
2.5 方法、参数和返回值
·方法[名称,参数,返回值,方法体]
·方法签名[方法名,参数列表]
·发送消息给对象 = 调用方法的行为
·参数列表:传递对象时,传递的是对象引用或基本类型值
·字符串中每个字符(2字节):来支持Unicode字符集
2.6 构建一个Java程序
·名字(可见性):反转域名
·运用其他构件:使用import定位文件
·static关键字:
·为某特定域分配单一存储空间
·创建不与对象关联的方法
2.7 你的第一个Java程序
·编译,运行
2.8 注释和嵌入式文档
·注释文档
·javadoc:提取注释的工具
·语法:
·javadoc命令只能在"/**----*/"中出现
·使用方式:
1.嵌入HTML
2.使用“文档标签”:以“@”开头
·三类注释文档位置:类、域、方法之前
·只有public、protected成员的文档注释才能被输出(可用-private进行标记输出private注释)
·不要嵌入html标题标签:如<h1>或<hr>
·提取注释:javadoc
2.9编码风格
·驼峰风格