Java中一切皆是对象
1. 对象操纵
//创建String对象的引用
String s;
//创建String对象的引用及初始化
String str = "abc";
2. 对象创建
// 创建对象实例
String str = new String("abc");
数据存储
- 寄存器(Registers)最快的存储区域,位于 CPU 内部。然而,寄存器的数量十分有限,所以寄存器根据需求进行分配。我们对其没有直接的控制权,也无法在自己的程序里找到寄存器存在的踪迹(C/C++ 允许开发者向编译器建议寄存器的分配);
- 栈内存(Stack)存在于常规内存 RAM(随机访问存储器,Random Access Memory)区域中,可通过栈指针获得处理器的直接支持。栈指针下移分配内存,上移释放内存。这是一种仅次于寄存器的非常快速有效的分配存储方式。创建程序时,Java 系统必须知道栈内保存的所有项的生命周期。这种约束限制了程序的灵活性。因此,虽然在栈内存上存在一些 Java 数据(如对象引用),但 Java 对象本身的数据却是保存在堆内存的;
- 堆内存(Heap)这是一种通用的内存池(也在 RAM 区域),所有 Java 对象都存在于其中。与栈内存不同,编译器不需要知道对象必须在堆内存上停留多长时间。因此,用堆内存保存数据更具灵活性。创建一个对象时,只需用
new
命令实例化对象即可,当执行代码时,会自动在堆中进行内存分配。这种灵活性是有代价的:分配和清理堆内存要比栈内存需要更多的时间(如果可以用 Java 在栈内存上创建对象,就像在 C++ 中那样的话); - 常量存储(Constant storage)常量值通常直接放在程序代码中,因为它们永远不会改变。如需严格保护,可考虑将它们置于只读存储器 ROM (只读存储器,Read Only Memory)中;
- 非 RAM 存储(Non-RAM storage)数据完全存在于程序之外,在程序未运行以及脱离程序控制后依然存在。两个主要的例子:(1)序列化对象:对象被转换为字节流,通常被发送到另一台机器;(2)持久化对象:对象被放置在磁盘上,即使程序终止,数据依然存在;
基本数据类型
-
Java的基本数据类型并不使用GC功能也不是Object的导出类, 由于其占用空间过小, 直接存放如栈中, 通过值传递的方式进行发送
-
Java中的基本数据类型的范围以及大小并不依赖于物理机
基本类型 大小 最小值 最大值 包装器类型 自动初始值 boolean NA NA NA Boolean false char 16 bits Unicode 0 Unicode 2^16 - 1 Character 0x0000 byte 8 bits -128 +127 Byte 0 short 16 bits -2^15 +2^15 - 1 Short 0 int 32 bits -2^31 +2^31 - 1 Integer 0 long 64 bits -2^63 +2^63 - 1 Long 0 float 32 bits IEEE754标准 IEEE754标准 Float 0 double 64 bits IEEE754标准 IEEE754标准 Double 0 void NA NA NA Void NA -
Java中可以将基本数据类型直接使用等号转化为包装其类型, 也可以反向操作
-
Java中提供
BigInteger
和BigDecimal
进行高精度计算, 但是它们并不属于基本数据类型 -
Java对于基本数据类型在数组以及对象字段中会进行自动初始化, 但是对于局部变量并不会进行自动初始化
数组的存储
Java中对于对象数组的实现是通过引用数组的形式, 默认初始化每个应用为null
. 也可以使用基本数据类型数组, 其中所有数据都会被初始化为其自动初始值
Java中的对象标识符以及命名规则
- Java对于任何对象的标识符命名都遵循:
<包路径>.<标识符名称>
的形式. 在同一个包路径下不允许出现任何相同的标识符 - Java中使用import关键字引入其他的包, 每个包都是一个类库.
- 可以在引入路径的最后一位使用
*
进行批量引入 - Java默认的语法规则其实也有一个引入路径
java.lang
但是编译器在处理时自动引入了这个路径
Java中作用域
Java中作用域的概念仅针对存放于栈中的变量引用以及基本数据类型. 由于对象的析构是基于GC(垃圾处理器)的, Java通过限制对象的访问方式(引用该对象的变量的个数)来进行作用域的限制并进行动态的GC, 所以实际对象的析构时间并不遵循作用域.
String在Java和C++中的区别
Java中String对象是由一串Unicode char
组成的, 因此每个String中的字符都是16位或者说2字节(区别于C++的一个字节)
3. Java中的数值传递
- 所有的非基础类型变量都是地址引用
- 所有的函数参数都是值传递(虽然传递的是变量的引用地址)
4. Java推荐编程风格
Java要求使用大驼峰进行类以及文件的命名, 使用小驼峰对于其他任何标识符进行命名
使用javadoc进行文档的编写
- 在
.java
文件中编写代码与嵌入式文档 - 使用
javadoc -d <dir-for-doc> <.java file>
对于嵌入式文档进行提取 - 在目标文件夹中形成多个相互通过超链接连接的html文件, 通过浏览器进行查看
- javadoc只会生成访问权限为
public
或者protected
的对象的文档, 因为这个文档的目的是方便他人使用你的代码库
javadoc的基本语法以及常用标签
//: <path-from-project-home-to-current-file> (用于表明文件的开始)
import xxx; // 进行依赖的引入
/** 对于一个类的文档
* @author 进行作者信息的标明
* 其他更多用于标注类型的标签
*/
public class SampleClass {
/** 对于一个字段的文档 */
public int i;
/** 对于一个方法的文档
* @param ...
* @return ...
* @throws ...
* ... 更多用于标注方法功能的标签
*/
public void function(){
.... // 对于方法实现的注释 -- 不是文档
}
}/*
Notes: (这里是笔记部分不是文档)
对于本类型出现的问题, 需要的改进, 测试的结果进行记录
*/
//:~ (这个是作者的习惯, 用于标注本源文件的结束)
一些常用的javadoc标签
标签名称 | 标签格式 | 标签作用 |
---|---|---|
@see | @see | 在文档中生成一个名称为 See Also 的超链接用于指向你指定的类, 一般用于继承关系的文档 |
@link | {@link #} | 以的名字创建一个指向指定类的超链接 |
@docRoot | 产生当前文档在项目中的相对路径, 可以在文档树页面显示超链接 | |
@inheritDoc | 这个标签从当前类的直接基类的对应方法或者字段的文档中继承文档内容并先插入当前文档 | |
@version | @version | 用于在版本中进行了更改的位置进行标注, 这个标签会被提取为版本更新内容, 单独作为一个页面进行显示 |
@author | @author | 用于标记类或者方法或者字段的创建者, 用于在文档中显示更改者姓名以及联系方式 |
@since | 用于指定程序代码的最早版本, 例如jdk版本之类 | |
@param | @param | 用于进行方法参数含义的标注, 其中discription可以延续数行, 直到下一个@为止 |
@return | @return | 用于标注方法返回值的意义,同样也可以写多行 |
@throws | @throws | 标明会出现什么异常对象以及每个异常对象可能产生的原因, 可有多个该标签 |
@deprecated | @deprecated 或者写成 @Deprecated | 标明某个类或者方法即将被弃用, 建议程序员更换其他实现方式 |