章二 一切都是对象
用CSDN的markdown写的,中间丢失了两份更新,都无法恢复。总之,没有自动保存功能,手动保存还经常保存不下来(what the fuck),引以为戒吧:
- 一是在编辑这个博客时打开了另一个博客(更新一下内容),然后这个博客已经写的内容就白写了
- 二是不小心按到了什么键,直接就退出了,然后博客也白写了。
C++和Java都是混合/杂合型语言。相比之下,由于C++需要实现对C的向后兼容,显得更加复杂。而Java是纯面向对象语言,Java中(几乎)一切都是对象。
2.1 用引用操纵对象
操纵内存中元素方式:1.直接操纵元素,2.基于特殊语法进行间接表示(如指针)
在Java中,一切被视为对象,可以用单一语法进行操纵,Java选择用引用操作。
代码示例:String s = new String()
式中,String s
声明了一个对象引用,new String()
通过new关键字创建了一个**String对象实例,两者通过=
来连接。
2.2 必须由你创建所有对象
2.2.1 存储位置
Java中有5个不同的位置可以存储数据:
- 寄存器:位于CPU内部。速度最快,数量有限,无法直接控制
- 堆栈:位于通用RAM中,可以通过堆栈指针从处理器哪里获得直接支持。
堆栈指针向下移动则分配内存,向上移动则释放内存。系统必须知道堆栈中数据的确切生命周期
堆栈中存储对象引用和基本数据类型 - 堆:通用内存池,也位于RAM中,用以存放所有的Java对象。无需知道数据存活时间,更灵活
但是用堆进行存储分配和清理比用堆栈耗时更多 - 常量存储:通常直接存放于程序代码内部
- 非RAM存储:数据存货在程序之外,不受程序控制。主要有流对象和持久化对象
2.2.2 特例:基本数据类型
存在原因:Java中用new关键词创建对象并置于堆中,但用new创建小型,简单变量效果不佳。
于是创建并非是引用的自动变量,由这些变量直接存储值,并置于堆栈中,更高效。
Java中基本数据类型:
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
---|---|---|---|---|
boolean | —— | —— | —— | Boolean |
char | 16-bits | Unicode 0 | Unicode 65535 | Character |
byte | 8 bits | -128 | 127 | Byte |
short | 16 bits | -32768 | 32767 | 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 |
高精度数字:
Java支持两种用于高精度计算的类,类似包装器类,但没有对应的基本类型,能执行int和float所有操作,必须以调用方法形式->降低运算速度:
- BigInteger:支持任意精度整数
- BigDecimal:支持任意精度定点数
tips:
- Java中基本数据类型所存储空间具有不变性->可移植性
- Java中所有数值类型都有正负号,没有无符号类型
- Java中boolean类型只能取字面值true和false,存储空间大小未明确定义
- Java SE5后的自动包装功能能将基本类型转为包装器类型:
Character ch = 'x'
;
反向操作亦可:char c = ch;
- Java中字符串可以用带引号的文本初始化:
String s = "example"
2.2.3 Java中的数组
特性:
- Java确保数组中元素会被初始化
- 范围检查:Java确保其不能再范围外访问
- 数组对象中,数组中所有引用被初始化为null
基本数据类型数组中,数组所占内容会被置零
2.3 永远不需要销毁对象
变量生命周期的混乱往往会导致大量的bug。Java会自动完成清理工作,减少bug。
2.3.1 作用域(scope)
作用域决定了在其内定义的变量名的可见性和生命周期。
在C、C++和Java中,作用域由花括号{}的位置决定。
在作用域内定义的变量只可用于作用域结束之前
Java中,无法用同名变量隐藏一个更大作用域的变量
int x = 12;
{
int x = 43; //illegal in Java; legal in C/C++
}
2.3.2 对象的作用域
Java对象的生命周期与其基本类型不一样,可以存活在作用域之外
Java通过垃圾收集器GC来监视所有对象,并释放所有不被引用的变量的内存空间
2.4 创建新的数据类型:类
Java中通过class关键字引入新类型: Class Example { //nothing here }
创建新类型后,通过new关键字创建类型实例: Example e = new Example();
2.4.1 字段和方法
Java中全部工作即为定义类,产生类对象,给对象发送消息
定义完类后,可以在类中设置其两种类型的元素:
- 字段(数据成员):字段可以为1.基本数据类型,或2.对象引用
- 方法(成员函数)
字段(数据成员)默认值:
基本类型 | 默认值 |
---|---|
boolean | false |
char | ‘\u0000’(null) |
byte,short,int,long | 0(各种形式0) |
float,double | 0.0f, 0.0d |
对象引用 | null |
注意:此默认值仅在基本数据类型作为字段时有效,作为局部变量无效,
方法体中定义的局部变量最好赋初值
2.5 方法、参数和返回值
Java的方法决定了对象能够接收什么样的信息。
Java中方法只能作为类的一部分来创建,只能通过对象或类来调用。
方法的4个基本组成:
- 返回值:通过返回类型描述调用方法后从方法返回的值
- 名称:方法标识
- 参数:通过参数列表给出传递给方法的信息的类型和名称
- 方法体:具体实现
方法标签:由方法名和参数列表组成,唯一标识某个方法。
通过对象调用方法通常被成为发送消息给对象。面向对象程序设计通常简单地归纳为向对象发送方法
2.5.1 参数列表
Java中,参数列表传递的实际为引用,而不是对象本身。
return关键字有两个用途:1.表明事情已完毕,离开此方法;2.返回返回值
void关键字:若无任何返回值,则返回类型设为void
2.6 构建Java程序
2.6.1 名字可见性
名字管理对程序设计语言来说,是一个重要问题。
在C++中,通过将函数包于类内,避免与其他类的函数名冲突;通过命名空间避免全局数据和全局变量的冲突。在Java中,没有全局数据和全局变量,并通过域名反转的方式定义包名(小写),且每个类有唯一的标识符,杜绝了命名冲突问题。
2.6.2 运用其他构建
如果想在自己的程序里使用预先定义好的类(复用),编译器必须知道如何定位类。
两种情况:
1. 两个类在同一文件,可以直接使用,且没有向前引用问题。对于java.lang.*
包中类库也可直接使用
2. 在其他文件,用import关键字给编译器定位,如import java.util.ArrayList
,可用通配符‘*’来导入一整个类库,如上所述。
2.6.3 static关键字
static关键字用以声明事物与包含它的那个类的任何对象实例不关联。主要有以下两种用途:
static字段:用以声明该字段与具体实例对象无关
- static字段只有一份存储空间
- static字段可以通过对象和类两种途径来引用
- static方法:用以声明该方法与具体实例对象无关
- static方法可以通过对象和类两种途径来引用
- static方法中不能直接调用非static方法
- static方法可以创建或使用其同类型对象,通常用以看护实例群,示例:main()函数
2.7 第一个Java程序
程序示例:
import java.util.Date;
public class HelloDate {
public static void main(String[] args) {
System.out.println(new Date());
}
}
说明:
system类位于java.lang包中,无需import。out为system类的一个静态PrintStream对象,println()提供打印并换行服务。
类名必须与文件名相同,类中必须包含main()方法:public static void main(String[] args)
。
public关键字表示该方法可由外部调用,参数args为String对象数组,用以保存命令行参数。
这里的Date()对象给出当前时刻,语句结束后立即被垃圾收集器清理,输出结果:
Fri Oct 06 22:59:18 GMT+08:00 2017
注意:多查阅JDK文档,可在官网下载
2.7.1 编译和运行
安装和配置Java环境(百度可以轻易查到)
2.8 注释和嵌入式文档
同C++一样,Java也有两种注释风格:
1. 单行注释 : \\ This line is a comment
2. 多行注释: \* All the contents between is a comment *\
2.8.1 注释文档
Java中,可以通过使用javadoc来提取注释,生成文档。
javadoc输出HTML文件,可以用Web浏览器查看
2.8.2 语法
/**
This is a javadoc example
just another line
*/
使用javadoc的方式主要有两种:
1. 嵌入HTML
2. 文档标签
- 独立文档标签
- 行内文档标签
主要有三种类型的注释文档:
- 类注释:在类定义之前
- 域注释:在域定义之前
- 方法注释:在方法定义之前
注意:javadoc只可为public和protected成员做进行文档注释
2.8.3 嵌入式HTML
2.8.4 一些标签示例
JDK文档可以查阅javadoc参考,一些可用于代码文档的javadoc标签如下:
- @see:引用其他类的文档,通过该标签链接
- @link package.class#member label:与@see相似,但只用于行内
- ………………
2.9 编码风格
参考《阿里巴巴Java开发手册》