JAVA学习笔记
本篇文章将作为编程语言 JAVA 的学习笔记,供以后查阅与复习使用。
此 JAVA 学习笔记参考自 菜鸟 JAVA 教程 。
本学习笔记以 查询和复习 为主要功能,文章内容应 短小精悍 。
Java 主要特性
查看Java 主要特性
关于 Java 特性的介绍的文字可能比较多
- Java 语言是简单的:
Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。 - Java 语言是面向对象的:
Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java 语言是一个纯的面向对象程序设计语言。 - Java 语言是分布式的:
Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。 - Java 语言是健壮的:
Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。 - Java 语言是安全的:
Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了 Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。 - Java 语言是体系结构中立的:
Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。 - Java 语言是可移植的:
这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。 - Java 语言是解释型的:
如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。 - Java 是高性能的:
与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。 - Java 语言是多线程的:
在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。 - Java 语言是动态的:
Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
Java 基础语法
查看Java 基础语法
此处对 Java 的基础语法只作简单的介绍,以便对 Java 语法有一个整体的印象,Java 语法的详细讲解在后面相应部分。
一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。
- 对象:对象是类的一个实例,有状态和行为。例如狗是一个类,而小狗包弟是类的一个实例。
- 类:类是一个模板,它描述一类对象的行为和状态。
- 方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。
- 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。
第一个 Java 程序,分析主函数的构成
基本语法
编写 Java 程序时应注意一下几点:
- 大小写敏感:Java 是大小写敏感的,这就意味着标识符
Hello
与hello
是不同的。 - 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如
MyFirstJavaClass
。 - 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
- 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java 。(如果文件名和类名不相同则会导致编译错误)。
- 主方法入口:所有的 Java 程序由
public static void main(String[] args)
方法开始执行。
Java标识符
Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
关于 Java 标识符,有以下几点需要注意:
- 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始
- 首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合
- 关键字不能用作标识符
- 标识符是大小写敏感的
- 合法标识符举例:age、$salary、_value、__1_value
- 非法标识符举例:123abc、-salary
一言蔽之:即标识符可由字母,美元符,下划线和数字组成,其中数字不能放在标识符的开头。
Java修饰符
像其他语言一样,Java 可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:
- 访问控制修饰符 :
default
,public
,protected
,private
- 非访问控制修饰符 :
final
,abstract
,static
,synchronized
Java变量
Java 中主要有如下几种类型的变量
- 局部变量
- 类变量(静态变量)
- 成员变量(非静态变量)
Java数组
数组是储存在堆上的对象,可以保存多个同类型变量。在后面的章节中,我们将会学到如何声明、构造以及初始化一个数组。
Java枚举
Java 5.0 引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的 bug。
例如,我们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。
注意:枚举可以单独声明或者声明在类里面。方法、变量、构造函数也可以在枚举中定义。
Java关键字
下面列出了 Java 关键字。这些保留字不能用于常量、变量、和任何标识符的名称。
类别 | 关键字 | 说明 |
---|---|---|
访问控制 | private | 私有的 |
protected | 受保护的 | |
public | 公共的 | |
default | 默认 | |
类、方法和变量修饰符 | abstract | 声明抽象 |
class | 类 | |
extends | 扩充,继承 | |
final | 最终值,不可改变的 | |
implements | 实现(接口) | |
interface | 接口 | |
native | 本地,原生方法(非 Java 实现) | |
new | 新,创建 | |
static | 静态 | |
strictfp | 严格,精准 | |
synchronized | 线程,同步 | |
transient | 短暂 | |
volatile | 易失 | |
程序控制语句 | break | 跳出循环 |
case | 定义一个值以供 switch 选择 | |
continue | 继续 | |
do | 运行 | |
else | 否则 | |
for | 循环 | |
if | 如果 | |
instanceof | 实例 | |
return | 返回 | |
switch | 根据值选择执行 | |
while | 循环 | |
错误处理 | assert | 断言表达式是否为真 |
catch | 捕捉异常 | |
finally | 有没有异常都执行 | |
throw | 抛出一个异常对象 | |
throws | 声明一个异常可能被抛出 | |
try | 捕获异常 | |
包相关 | import | 引入 |
package | 包 | |
基本类型 | boolean | 布尔型 |
byte | 字节型 | |
char | 字符型 | |
double | 双精度浮点 | |
float | 单精度浮点 | |
int | 整型 | |
long | 长整型 | |
short | 短整型 | |
变量引用 | super | 父类,超类 |
this | 本类 | |
void | 无返回值 | |
保留关键字 | goto | 是关键字,但不能使用 |
const | 是关键字,但不能使用 |
注意:Java 的 null 不是关键字,类似于 true 和 false,它是一个字面常量,不允许作为标识符使用。
Java注释
类似于 C/C++、Java 也支持单行以及多行注释。注释中的字符将被 Java 编译器忽略。
Java空行
空白行或者有注释的行,Java 编译器都会忽略掉。
继承
在 Java 中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性或方法,那么你可以将新创建的类继承该类。
利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(sub class)。
接口
在 Java 中,接口可理解为对象间相互通信的协议。接口在继承中扮演着很重要的角色。
接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。
Java源程序与编译型运行区别
区别如下图所示:
Java 对象和类
查看Java 对象和类
对象和类的定义
- 类(class):类是一个模板,它描述一类对象的行为和状态。
- 对象(object):对象是类的一个实例,有状态和行为。
一个类可以包含以下类型的变量:
- 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
- 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。
语句块:用一对{}包括起来的有着相同的变量作用域的相关一组语句的集合。
构造方法
每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
下面是一个构造方法示例:
创建对象
对象是根据类创建的。在 Java 中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:
- 声明:声明一个对象,包括对象名称和对象类型。
- 实例化:使用关键字 new 来创建一个对象。
- 初始化:使用 new 创建对象时,会调用构造方法初始化对象。
下面是一个创建对象的例子:
输出结果为:
访问实例变量和方法
通过已创建的对象来访问成员变量和成员方法,如下所示:
源文件声明规则
在本节的最后部分,我们将学习源文件的声明规则。当在一个源文件中定义多个类,并且还有 import 语句和 package 语句时,要特别注意这些规则。
- 一个源文件中只能有一个 public 类
- 一个源文件可以有多个非 public 类
- 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为 Employee.java。
- 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。
- 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。
- import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
类有若干种访问级别,并且类也分不同的类型:抽象类和 final 类等。这些将在访问控制章节介绍。
除了上面提到的几种类型,Java 还有一些特殊的类,如:内部类、匿名类。
Java 包
包主要用来对类和接口进行分类。当开发 Java 程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。
import 语句
在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类。
例如,下面的命令行将会命令编译器载入 java_installation/java/io 路径下的所有类
Java 基本数据类型
查看Java 基本数据类型
变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。
内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。
Java 的两大数据类型:
- 内置数据类型
- 引用数据类型
内置数据类型
Java 语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
1byte(字节)=8bit(比特)
byte:
- byte 数据类型是 8 位(1byte)、有符号的,以二进制补码表示的整数;
- 取值范围:
-128(-2^7)~127(2^7-1)
; - 默认值是
0
;
short:
- short 数据类型是 16 位(2byte)、有符号的以二进制补码表示的整数;
- 取值范围:
-32768(-2^15)~32767(2^15 - 1)
; - 默认值是
0
;
int:
- int 数据类型是 32 位(4byte)、有符号的以二进制补码表示的整数;
- 取值范围:
-2,147,483,648(-2^31)~2,147,483,647(2^31 - 1)
- 默认值是
0
;
long:
- long 数据类型是 64 位(8byte)、有符号的以二进制补码表示的整数;
- 取值范围:
-9,223,372,036,854,775,808(-2^63)~9,223,372,036,854,775,807(2^63 -1)
; - 默认值是
0L
;
float:
- float 数据类型是单精度、32 位、符合 IEEE 754 标准的浮点数;
- 默认值是
0.0f
; - 浮点数不能用来表示精确的值,如货币;
double:
- double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
- 浮点数的默认类型为 double 类型;
- double 类型同样不能表示精确的值,如货币;
- 默认值是
0.0d
;
boolean:
- boolean 数据类型表示一位的信息;
- 只有两个取值:true 和 false;
- 这种类型只作为一种标志来记录 true/false 情况;
- 默认值是
false
;
char:
- char 类型是一个单一的 16 位 Unicode 字符;
- 最小值是
\u0000(十进制等效值为 0)
; - 最大值是
\uffff(即为 65535)
; - char 数据类型可以储存任何字符;
引用数据类型
在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
对象、数组都是引用数据类型。
所有引用类型的默认值都是null。
一个引用变量可以用来引用任何与之兼容的类型。
例子:
Site site = new Site("Runoob")。
Java 常量
常量在程序运行时是不能被修改的。
在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似:
Java 语言支持一些特殊的转义字符序列。
符号 | 字符含义 |
---|---|
\n | 换行 (0x0a) |
\r | 回车 (0x0d) |
\f | 换页符(0x0c) |
\b | 退格 (0x08) |
\0 | 空字符 (0x0) |
\s | 空格 (0x20) |
\t | 制表符 |
\" | 双引号 |
\' | 单引号 |
\\ | 反斜杠 |
\ddd | 八进制字符 (ddd) |
\uxxxx | 16进制Unicode字符 (xxxx) |
自动类型转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级。
数据类型转换必须满足如下规则:
- 不能对 boolean 类型进行类型转换。
- 不能把对象类型转换成不相关类的对象。
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
- 转换过程中可能导致溢出或损失精度,例如:
- 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
自动类型转换
必须满足转换前的数据类型的位数要低于转换后的数据类型,例如: short 数据类型的位数为 16 位,就可以自动转换位数为 32 的 int 类型,同样 float 数据类型的位数为 32,可以自动转换为 64 位的 double 类型。
运行结果为:
强制类型转换
- 条件是转换的数据类型必须是兼容的。
- 格式:
(type)value
type 是要强制类型转换后的数据类型 实例:
运行结果:
隐含强制类型转换
- 整数的默认类型是 int。
- 小数默认是 double 类型浮点型,在定义 float 类型时必须在数字后面跟上 F 或者 f。
Java 变量类型
查看Java 变量类型
在 Java 语言中,所有的变量在使用前必须声明。声明变量的基本格式如下:
以下列出了一些变量的声明实例。注意有些包含了初始化过程。
Java 语言支持的变量类型有:
- 类变量:独立于方法之外的变量,用 static 修饰。
- 实例变量(成员变量):独立于方法之外的变量,不过没有 static 修饰。
- 局部变量:类的方法中的变量。
Java 局部变量
- 局部变量声明在方法、构造方法或者语句块中;
- 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
- 访问修饰符不能用于局部变量;
- 局部变量只在声明它的方法、构造方法或者语句块中可见;
- 局部变量是在栈上分配的;
- 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
Java 实例变量
- 实例变量声明在一个类中,但在方法、构造方法和语句块之外;
- 当一个对象被实例化之后,每个实例变量的值就跟着确定;
- 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
- 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
- 实例变量可以声明在使用前或者使用后;
- 访问修饰符可以修饰实例变量;
- 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
- 实例变量具有默认值。数值型变量的默认值是 0,布尔型变量的默认值是 false,引用类型变量的默认值是 null。变量的值可以在声明时指定,也可以在构造方法中指定;
- 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:
ObjectReference.VariableName
。
Java 类变量(静态变量)
- 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
- 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
- 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变。
- 静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
- 静态变量在第一次被访问时创建,在程序结束时销毁。
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
- 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
- 静态变量可以通过:ClassName.VariableName 的方式访问。
- 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。
实例:
运行结果:
Java 修饰符
查看Java 修饰符
Java 语言提供了很多修饰符,主要分为以下两类:
- 访问修饰符
- 非访问修饰符
修饰符用来定义类、方法或者变量,通常放在语句的最前端。我们通过下面的例子来说明:
访问控制修饰符
Java 支持 4 种不同的访问权限:default & public
:使用对象:类、接口、变量、方法。private & protected
:使用对象:变量、方法。(PS:不过二者都能修饰内部类)
访问控制
修饰符 | 当前类 | 同一包内 | 子孙类(同一包) | 子孙类(不同包) | 其它包 |
---|---|---|---|---|---|
public | Y | Y | Y | Y | Y |
protected | Y | Y | Y | Y/N | N |
default | Y | Y | Y | N | N |
private | Y | N | N | N | N |
default
:接口里的变量隐式声明为:public static final
,接口里的方法默认访问权限为:public
。protected
:被 protected 修饰的成员对于本包和其子类可见。
- 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问。
- 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的 protected 方法。
(PS:在判断java.lang
包中的clone()
等方法是需要注意方法的来源,到底来自于当前包还是java.lang
包。)
请注意以下方法继承的规则:
- 父类中声明为
public
的方法在子类中也必须为public
。 - 父类中声明为
protected
的方法在子类中要么声明为protected
,要么声明为public
,不能声明为private
。 - 父类中声明为
private
的方法,不能够被子类继承。
非访问修饰符
static 修饰符
- 静态变量:static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
- 静态方法:static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
对类变量和方法的访问可以直接使用classname.variablename
和classname.methodname
的方式访问。
final 修饰符
final 变量:final 表示”最后的、最终的”含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。final 修饰符通常和 static 修饰符一起使用来创建类常量。
final 方法:父类中的 final 方法可以被子类继承,但是不能被子类重写。声明 final 方法的主要目的是防止该方法的内容被修改。
final 类:final 类不能被继承,没有类能够继承 final 类的任何特性。
abstract 修饰符
抽象类:抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
抽象类可以包含抽象方法和非抽象方法。
抽象方法:抽象方法是一种没有任何实现的方法,该方法的具体实现由子类提供。
抽象方法不能被声明成 final 和 static。
任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
抽象方法的声明以分号结尾,例如:public abstract sample();
。
synchronized 修饰符
synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。
transient 修饰符
序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。
volatile 修饰符
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
一个 volatile 对象引用可能是 null。
Java 运算符
查看Java 运算符
Java 运算符方面与其他编程语言基本一致,故简单讲述。
算数运算符
Java 中基本的算数运算符为+,-,*,/,%,++,--
。
关系运算符
Java 中基本的关系运算符为==,!=,>,<,>=,<=
。
位运算符
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
逻辑运算符
Java 支持的逻辑运算符有&&,||,!
。
赋值运算符
Java 支持的赋值运算符有=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
。
条件运算符
instanceof运算符
Java 循环结构
查看Java 循环结构
while 循环
do…while 循环do...while
循环与while
循环的区别在于do..while
循环至少会执行一次。
注意do...while
结尾有;
。
for 循环
for 循环语句基本格式与 C 语言完全一致。
Java 增强for 循环
通过 Java 增强 for 循环可快速便利数组元素。
break 关键字break
关键字用于跳出当前的循环语句或者switch
语句。
continu 关键字continue
关键字用于直接进入下一次循环。
Java 条件语句
查看Java 条件语句
Java 中的if-else
条件语句与 C 语言中完全相同,故只做简单示例。
Java switch case 语句
查看Java switch case 语句
Java 中switch case
语句与 C 语言完全相同,故只做简单示例。
switch case
的语法格式如下
switch 语句中的变量类型可以是byte,short,int,char
。从 Java SE 7 开始,支持字符串String
类型,同时case
标签必须是字符串常量或字面量。
Java Number&Math 类
查看Java Number&Math类
Java 为每个内置数据类型提供了对应的包装类,与Number
类和Object
类的关系如下图。
当内置数据类型被当作对象来使用时,编译器会把内置数据类型装箱为包装类,反之,编译器也可以把一个对象拆箱为内置类型。
举例如下
Java Math类
Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。
Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。
Number&Math 类方法
- Number 类的
xxxValue()
方法:将 Number 对象转换为 xxx 数据类型的值并返回。例:x.byteValue()
- Number 类的
compareTo()
方法:该方法用于将 Number 对象与方法的参数进行比较,只能用于比较相同的两个数据类型。例:x.compareTo(3)
。大于返回1
,小于-1
,等于0
。 - Number 类的
equals()
方法:判断 Number 对象与参数是否相等。例:x.equals(y)
,相等返回true
,否则返回false
。 - Number 类的
valueOf
方法:返回一个 Number 对象指定的内置数据类型。例:Integer b = Integer.valueOf("444",16);
即444
的十六进制表示。 parseInt()
:将字符串解析为 int 类型。abs()
:返回参数的绝对值。ceil()
:返回大于等于给定参数的最小整数,类型为双精度浮点型。floor()
:返回小于等于给定参数的最大整数,类型为双精度浮点型。rint()
:返回与参数最接近的整数。返回类型为 double。round()
:表示四舍五入,数字+0.5
后再向下取整。min()
:返回两个参数中的最小值。max()
:返回两个参数中的最大值。exp()
:返回自然数底数 e 的参数次方。log()
:返回参数的自然数底数的对数值。pow()
:返回第一个参数的第二个参数次方。sqrt()
:求参数的算数平方根。sin()
:求指定 double 类型参数的正弦值。cos()
:求指定 double 类型参数的余弦值。tan()
:求指定 double 类型参数的正切值。asin()
:求指定 double 类型参数的反正弦值。acos()
:求指定 double 类型参数的反余弦值。atan()
:求指定 double 类型参数的反正切值。atan2()
:将笛卡尔坐标转变为极坐标,并返回极坐标的角度值。toDegrees()
:将参数转化为角度。toRadians()
:将角度转化为弧度。random()
:返回一个随机数。
Java Character 类
查看 Java Character类
同样的,内置数据类型char
同样有它的包装类Character
,同样也有装箱和拆箱操作。
Number&Math 类方法
前面有反斜杠(\)
的字符代表转义字符,它对编译器来说是有特殊含义的。
下面列表展示了 Java 的转义序列:
转义序列 | 描述 |
---|---|
\t | 在文中该处插入一个tab键 |
\b | 在文中该处插入一个后退键 |
\n | 在文中该处换行 |
\r | 在文中该处插入回车 |
\f | 在文中该处插入换页符 |
\' | 在文中该处插入单引号 |
\" | 在文中该处插入双引号 |
\\ | 在文中该处插入反斜杠 |
Character 类方法
isLetter()
:是否是一个字母。isDigit()
:是否是一个数字字符。isWhitespace()
:是否是一个空白字符。isUpperCase()
:是否是大写字母。isLowerCase()
:是否是小写字母。toUpperCase()
:指定字母的大写形式。toLowerCase()
:指定字母的小写形式。toString()
:返回字符的字符串形式,字符串的长度为 1。
Java String 类
查看Java String 类
字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
创建字符串String
直接创建的字符串对象在公共池中,而对象创建的字符串对象在堆上:
String
类有 11 种构造方法,这些方法提供不同的参数来初始化字符串。String
类是不可更改的,一旦创建就不可修改。
字符串长度
用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是length()
方法,它返回字符串对象包含的字符数。
连接字符串
String 类提供了连接两个字符串的方法:
更常用的是使用+
操作符来连接字符串,如:
创建格式化字符串String
类的format()
方法能用来创建可复用的格式化字符串,而不是仅仅用来一次打印输出。
String 类方法
String
类方法较多,请查看api 文档。
Java StringBuffer
查看Java StringBuffer
当对字符串进行修改的时候,需要使用StringBuffer
和StringBuilder
类,二者的对象能被多次修改,并且不产生新的未使用对象。
由于StringBuilder
相较于StringBuffer
有速度优势,所以多数情况下建议使用StringBuilder
类,然而StringBuilder
的方法不是线程安全的(不能同步访问)。
StringBuffer 类的方法:
Java 数组
查看Java 数组
声明数组变量
Java 有两种声明数组变量的语法
创建数组
Java 使用new
操作符来创建数组,数组是通过索引来访问的,索引值从0
~arrayRefVar.length-1
。
Arrays 类
java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
具有以下功能:
- 给数组赋值:通过
fill
方法。 - 对数组排序:通过
sort
方法,按升序。 - 比较数组:通过
equals
方法比较数组中元素值是否相等。 - 查找数组元素:通过
binarySearch
方法能对排序好的数组进行二分查找法操作。
Arrays 类还有很多方法,详情查看Java Api 文档
Java 日期时间
Java 日期时间
Date
类提供了两个构造函数来实例化Date
对象。
序号 | 方法和描述 |
---|---|
1 | boolean after(Date date) 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。 |
2 | boolean before(Date date) 若当调用此方法的Date对象在指定日期之前返回true,否则返回false。 |
3 | Object clone( ) 返回此对象的副本。 |
4 | int compareTo(Date date) 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。 |
5 | int compareTo(Object obj) 若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException。 |
6 | boolean equals(Object date) 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。 |
7 | long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 |
8 | int hashCode( ) 返回此对象的哈希码值。 |
9 | void setTime(long time) 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。 |
10 | String toString( ) 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 |
获取当前日期时间
日期比较
Java 使用以下三种方法来比较两个日期:
- 使用
getTime()
方法获取两个日期(自 1970 年 1 月 1 日经历的毫秒数值),然后比较这两个值。 - 使用方法
before()
,after()
和equals()
。例如,一个月的 12 号比 18 号早,则new Date(99, 2, 12).before(new Date (99, 2,18))
返回 true。 - 使用
compareTo()
方法,它是由Comparable
接口定义的,Date
类实现了这个接口。
使用 SimpleDateFormat 格式化日期
SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。例如:
有的格式大写,有的格式小写,例如MM
是月份,mm
是分;HH
是 24 小时制,而hh
是 12 小时制。
日期和时间的格式化编码
时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:
Calendar 类Calendar
类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance
方法创建即可。
GregorianCalendar 类
Calendar 类实现了公历日历,GregorianCalendar 是 Calendar 类的一个具体实现。
Calendar 的 getInstance()方法返回一个默认用当前的语言环境和时区初始化的 GregorianCalendar 对象。GregorianCalendar 定义了两个字段:AD 和 BC。这是代表公历定义的两个时代。
Java 正则表达式
Java 正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个”规则字符串”,这个”规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
- 给定的字符串是否符合正则表达式的过滤逻辑(称作”匹配”)。
- 可以通过正则表达式,从字符串中获取我们想要的特定部分。
正则表达式的特点是:
- 灵活性、逻辑性和功能性非常的强。
- 可以迅速地用极简单的方式达到字符串的复杂控制。
Java 正则表达式的知识点较为繁琐,详情见Java 正则表达式
Java 方法
查看Java 方法
方法的定义
可变参数
可变参数,即参数的个数可变。方法的可变参数的声明如下所示:
在方法声明中,在指定参数类型后加一个省略号(…) 。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
Java Stream, File, IO
查看Java Stream
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
读取控制台输入
Java 的控制台输入由System.in
完成。
为了获得一个绑定到控制台的字符流,你可以把System.in
包装在一个BufferedReader
对象中来创建一个字符流。
下面是创建BufferedReader
的基本语法:
BufferedReader 对象创建后,我们便可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。
从控制台读取多字符输入
从 BufferedReader 对象读取一个字符要使用 read() 方法,它的语法如下:
每次调用 read() 方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回 -1。该方法抛出 IOException。
从控制台读取字符串
从标准输入读取一个字符串需要使用BufferedReader
的readLine()
方法。
基本格式:
基本示例:
控制台输出
在此前已经介绍过,控制台的输出由print()
和println()
完成。这些方法都由类PrintStream
定义,System.out
是该类对象的一个引用。PrintStream
继承了OutputStream
类,并且实现了方法write()
。这样,write()
也可以用来往控制台写操作。PrintStream
定义write()
的最简单格式如下所示:
该方法将 byteval 的低八位字节写到流中。
读写文件
如前所述,一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图。
FileInputStream与FileOutputStream
两种创建方法:
使用实例
Java Scanner 类
查看Java Scanner 类
使用next
方法:
输出结果:
使用nextLine
方法:
输出结果为:
Java 异常处理
查看Java 异常处理
Exception 类的层次
捕获异常
实例:
throws/throw关键字