- Java是基于C++的。
- Java是混合型语言。Java程序先编译成字节码,然后再通过JVM解释执行。
- Java只能进行面向对象的程序设计(OOP)。
1 用引用操作对象
- Java中一切被视为对象,操纵的标识符则是对象的一个引用(reference)。
- 引用独立存在,并不一定需要有一个对象与它关联。但安全的做法是创建一个引用的同时便进行初始化。
- 字符串可以用带引用的文本初始化。
2 必须由你创建所有对象
- new操作符用于创建对象。
2.1 存储到什么地方
- 寄存器。 最快的存储区,位于处理器内部,数量极其有限,不能直接控制。
- 堆栈。 又称栈,速度仅次于寄存器,位于RAM(随机访问存储器,如计算机内存)中,通过堆栈指针可以从处理器那里获得直接支持。
堆栈内所有项的生命周期都必须是确定的。对象引用存储于堆栈,对象不存储于其中。 - 堆。 速度比堆栈慢,也位于RAM内,用于存放所有的Java对象。
编译器不需要知道存储的数据的生命周期。 - 常量存储。 常量值通常直接程序代码内部。在嵌入式系统中,可以选择将其存放在ROM(只读存储器)中。
- 非RAM存储。 存活于程序之外的数据,在程序没有运行时也可以存在。把对象转化成可以存放在其他媒介上的事物。
在流对象中,对象转化成字节流,通常被发送给另一台机器。
在“持久化对象”中,对象被存放于磁盘上。
2.2 特例:基本类型
- 基本类型是程序设计中经常用到的一系列类型,存储在堆栈中。
- Java每种基础类型存储空间大小是确定的,不随机器硬件架构变化。
| 大小 | 最小值 | 最大值 | 包装器 |
---|---|---|---|---|
boolean | - | - | - | Boolean |
char | 16 bits | Unicode 0 | Unicode 216−1 | Character |
byte | 8 bits | -128 | +127 | Byte |
short | 16 bits | −215 | +215−1 | Short |
int | 32 bits | −231 | +231−1 | Integer |
long | 64 bits | −263 | +263−1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
void | - | - | - | Void |
- boolean类型大小没有明确指定,仅定义为能够取字面值true或false
- 基本类型具有包装器类,可以在堆中创建一个对象来表示对应的基本类型。基本类型和对应的包装器类型可以相互自动转换。
- BigInteger支持任意精度的整数,BigDecimal支持任意精度的定点数。必须以方法调用方式取代运算符方式来实现。
2.3 Java中的数组
- Java确保数组会被初始化,且不能在它的范围之外被访问。这种范围检查,是以每个数组上少量的内存开销及运行时的下标检查为代价的。
3 永远不需要销毁对象
3.1 作用域
- 在Java中,作用域由花括号的位置决定。作用域决定了在其内定义的变量名的可见性和生命周期。
- 在作用域里定义的变量只可用于作用域结束之前。
- Java中不允许将一个较大作用域的变量“隐藏”起来的做法。
3.2 对象的作用域
- Java对象的生命周期和基本类型不一样,由new创建的对象,只要你需要,就会一直保留下去。
- Java有一个垃圾回收器,监听用new创建的所有对象,负责辨别不再被引用的对象并回收其内存空间。
4 创建新的数据类型:类
- class关键字用来定义了一个新类型。
class ATypeName { /* Class body goes here */ }
4.1 字段和方法
- 在Java中你所做的全部工作就是定义类,产生类的对象,以及发送消息给对象。
- 类中可以设置两种元素:字段(又称数据成员)和方法(又称成员函数)。
- 字段可以是任何类型的对象,也可以是基本类型中的一种。字段是对象引用必须初始化。
- 每个对象都有用来存储其字段的空间,普通字段不能在对象间共享。
- 字段赋值:在对象引用的名称之后紧接着一个句点,然后再接着是对象内部的成员名称。也可以给位于对象所包含的其他对象的字段赋值。
objectReference.member
基本成员默认值
- 类的成员是基本类型时,即使没有初始化,也会获得一个默认值。当变量作为类的成员使用时,Java才确保给定其默认值。
- 非类的字段不会进行初始化,可能是任意值。使用未初始化变量,编译会报错。
| 默认值 |
---|---|
boolean | false |
char | ‘\u0000’(null) |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
5 方法、参数和返回值
- 方法的基本组成:名称、参数、返回值和方法体。
ReturnType methodName( /* Argument list */ ) {
/* Method body */
}
-
- 返回类型描述在调用方法之后从高方法返回的值。
- 参数列表给出要传给方法的信息的类型和名称。
- 方法名和参数列表(称为“方法签名”)唯一地标识出某个方法。
- 方法只能作为类的一部分来创建,只有通过对象才能被调用。调用方法时,需要先列出对象名,紧接着是句点,然后是方法名和参数列表。
objectName.methodName(arg1. arg2. arg3);
- 调用方法的行为通常被称为发送消息给对象。
5.1 参数列表
- 参数列表传递的实际是引用,并且引用的类型必须正确。
- return关键字代表离开此方法,如果此方法产生一个值,这个值要放在return语句后面。
- 返回值可以为空(void),此时return关键字仅用来退出方法。
6 构建一个Java程序
6.1 名字可见性
- 为了给一个类库生成不会与其他名字混淆的名字,Java希望程序员使用反转的个人域名,来做为包的开头命名,保证它们肯定是独一无二的。反转域名后,句点就是用来代表子目录的划分。
- 约定整个包名都使用小写。
6.2 运用其他构件
- 如果想在自己的程序里使用预先定义好的类,那么编译器就必须知道怎么定位它们。
- import指示编译器导入一个包,也就是一个类库。
- import可以指定具体的类名导入,也可以使用通配符“*”来导入前缀包内的所有类。
6.3 static关键字
- 通常,创建类时,只是在描述那个类的对象的外观和行为。执行new创建对象时,数据存储存储空间才被分配,其方法才供外界调用。
- static关键字放在字段或方法定义之前,意味着这个域或方法不会与包含它的类的任何对象关联在一起。
- static字段或方法,可以通过一个对象去定位它,也可以通过其类名直接引用。使用类名引用是首选方式。
- static作用于某个字段时,肯定会改变数据创建的方式。作用于某个方法,差别却没有那么大。
- static方法可以创建或使用与其类型相同的被命名对象,因此static方法经常负责看护与其隶属同一类型的实例群。
7 你的第一个Java程序
- java.lang是默认导入到每个Java文件中的,它的所有类都可以被使用。
- System.out.println()方法将参数数据打印到控制台。
-
- 文件名必须和某个类的名字相同,这个类必须包含一个名为main()的方法。
public static void main(String[] args)
- args用来存储命令行参数。
7.1 编译和运行
- 编译和运行程序,首先要有一个Java开发环境。如JDK(Java Developer’s Kit,Java开发人员工具包)开发环境。
- 在设定好的路径上,javac指令编译文件,java执行程序字节码。
8 注释和嵌入式文档
-
- 多行注释,以“/”开始,以“/”结束,/和/之间的所有东西都会被忽略。
/* This is a comment
<ul><li>that continues</li>
<li>across lines</li>
<li>/
-
- 单行注释,以一个“//”起头,直到句末的所有东西都会被忽略。
//This is a one-line comment
8.1 注释文档
- Java将代码同文档“链接”起来,通过特殊的注释语法来标记文档。
-
- javadoc是用于提取注释的工具,是JDK安装的一部分。
- javadoc输出的是一个HTML文件。
- 可以编写“doclets”的javadoc处理器来对信息执行特殊的操作。
8.2 语法
- 所有javadoc命令都只能在“/*”注释中出现,结束于“/”。
-
- 使用javadoc的方式主要有嵌入HTML和“文档标签”。
- 独立文档标签是以“@”开头的命令,且置于注释行的最前面。
- 行内文档标签是以“@”开头,并且括在花括号内,可以出现在javadoc注释中的任何地方。
- 有三种类型的注释文档:类注释位于类定义之前,域注释位于域定义之前,方法啊注释位于方法定义之前。
- javadoc只能为public和protected成员进行文档注释,private和包内可访问成员的注释会被忽略掉。
8.3 嵌入式HTML
- javadoc通过生成的HTML文档传送HTML命令,主要目的是为了对代码进行格式化。
- 在文档注释中,位于每一行开头的星号和前导空格都会被javadoc丢弃。
- 不要在嵌入式HTML中使用标题标签。
8.4 一些标签示例
- @see 引用其他类的文档。
- {@link package.class#member label} 与@see类似,用于行内,用label作为超链接文本。
- {@docRoot} 产生到文档根目录的相对路径
- {#inheritDoc} 从当前这个类的最直接的基类中继承相关文档到当前的注释文档中。
- @version 产生版本说明中的重要信息。
- @author 产生作者信息。
- @since 指定程序代码最早使用的版本。
- @param 描述方法参数列表中的参数信息。
- @return 描述返回值的含义。
- @throws 描述异常出现的原因。
- @deprecated 指出一些旧特性已由改进的新特性所取代。
9 编码风格
- 驼峰风格:类名的首字母要大写,多个单词并在一起,每个单词的首字母都采用大写。
- 方法、字段和对象引用名称,也使用驼峰风格,只是标识符的第一个字母采用小写。
- 代码摆开放、闭花括号。
疑问和解答
1. 标识符存储到什么地方?
- 网上搜索不到相关资料,根据自己的知识猜测,标识符在解释执行时会被转换成分配到的内存地址。
2. boolean存储空间大小是多少?
- boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。这其实是运算效率和存储空间之间的博弈,两者都非常的重要。
- 参考文章
3. 导入一个包,是否会导入该包的子包中的类?
- 不会。
4. 导入的类库中,具有同名类时,会发生什么?
- 如果在包内类和导入类有歧义时,默认使用包内类。
- 如果多个导入类有歧义时,编译器会报错,必须在类名前加上包的前缀来指定使用哪个包的类。
5. 对象方法存储在哪?静态字段和普通字段存储位置有什么区别?
- stack 区存放函数参数和局部变量;
- heap 区存放对象;
- data 区存放static 的变量或者字符串常量;
- code 区存放类中的方法;
- stack 栈 –>放方法的参数 和局部变量.就像这样
void test(String[] args){ int xx = 0;// args和 xx在jvm load class时存放在栈中 }
- heap 堆 –> 堆要比栈要大得多.
- 当一个对象对new出来时,该对象放在heap中,对象引用放在栈中.
- data 区,也就是数据区 –>静态的变量 和 string的常量.
- code 代码区 —>classloader类加载器加载该class时存放类中的方法.
6. java.lang含有哪些类?可以做什么?
- java.lang是提供利用Java编程语言进行程序设计的基础类。
- 最重要的类是Object(它是类层次结构的根)和 Class(它的实例表示正在运行的应用程序中的类)。
7. 收获
- package声明要放在代码最前面,import导入包要放在所有的类之前。