目录

注释
数据类型
变量
常量
运算符
字符串
输入与输出
控制流程
大数
数组

附录

[ 笔记记录顺序参考<Java核心技术 卷1> . 部分叙述参考Java文档 , Java语言规范 ]


Java应用编程接口(API) : 每一个API的注释都以类名开始 , 如 java.lang.String
点号 ( . ) 用于调用方法

object.method(parameters)

注释

注释不会出现在可自行程序中

//单行注释
/*
 *多
 *行
 *注
 *释
*/

JavaDoc注释 : 可自动生成文档

/**
  */

数据类型

( 原始类型和引用类型 ) primitive types and reference types
引用类型的值是对对象的引用。所有对象,包括数组,都支持类的方法 Object

以下摘自Java文档

原始类型由语言预定义并由保留关键字命名 . 原始值不与其他原始值共享状态 .

已声明但未初始化的字段将由编译器设置为合理的默认值 . 一般而言 , 此默认值将为零或 null , 具体取决于数据类型 . 局部变量略有不同 : 编译器永远不会为未初始化的局部变量分配默认值 . 如果无法在声明它的地方初始化局部变量,请确保在尝试使用它之前为其分配一个值 . 访问未初始化的局部变量将导致编译时错误 .

null 文字可以用作任何引用类型的值 . null 可以分配给任何变量 , null经常在程序中用作标记 , 表示某些对象不可用 .

整型

Java没有任何无符号 ( unsigned ) 形式的 int , long , short , 或 byte 类型

长整型数值有后缀Ll .

byte 类型用于底层的文件处理 , short 类型用于储存空间很宝贵时的大数据 .

如果使用不可能为负的整数值而且确实需要额外的一位 ( bit ) , 也可以把有符号整数值解释为无符号数 . --摘自<Java核心技术> P31

char类型

字符类型 char 用于表示 Unicode 编码的代码单元 .
码点指与一个编码表中的某个字符对应的代码值 . ( 建议不要在程序中使用 char 类型 , 除非需要处理 UTF-16 代码单元 )

浮点类型

float 类型的数值有后缀Ff , 没有后缀 F 的浮点数值默认为 double 类型 .
浮点数值不适用于无法接受舍入误差的金融计算 , 如果在数值计算中不允许有任何舍入误差 , 应使用 BigDecimal 类 (大数中的类)
特殊的浮点数值 : 正无穷大 , 负无穷大 , NaN ( 可用常量 Double.POSITIVE_INFINITY , Double.NEGATIVE_INFINITY , Double.NaN( 以及相应 Float 类型的常量 ) 分别表示 )

变量

声明变量

先指定变量的类型后指定变量名 , 声明以分号结束
变量名必须是以一个字母开头并由字母或者数字构成的序列 , 区分大小写 . 空格 , 单下划线 _ 不能作为变量名
$ 只用在 Java 编译器或其他工具生成的名字中

成员变量( 非静态字段即没有 static 关键字声明的字段 , 也叫作实例变量/对象变量 , 定义在类中 , 属于对象 , 只能对象(即类的实例)调用 , 堆内存 )

静态成员变量(也叫类变量 , 有 static 关键字声明 , 属于成员变量的一种 , 可以直接使用类名调用 , 可以对象调用 , 共享内存)

局部变量( 在方法体中定义 , 栈内存 , 生命周期只存在在方法中 , 方法结束后就会回收 )

Java没有全局变量 , 但可以用静态成员变量实现全局变量效果

变量种类 : 变量种类

以下摘自Java文档 :

Java 编程语言定义了以下类型的变量:

  • 实例变量(非静态字段)从技术上讲 , 对象将它们各自的状态存储在“非静态字段”中 . 也就是说 , 没有声明 static 关键字的字段 . 非静态字段也被称为实例变量 , 因为它们的值对于类的每个实例 ( 换句话说 , 对于每个对象 ) 是唯一的 .
  • 类变量(静态字段)类变量是用静态修饰符声明的任何字段 . 这告诉编译器这个变量只存在一个副本,不管类被实例化了多少次 . 定义特定类型自行车齿轮数的字段可以标记为静态 , 因为概念上相同的齿轮数将应用于所有实例 . 代码静态 int numGears = 6; 会产生这样的静态磁场 . 此外 , 可以添加关键字 final 来表示齿轮的数量永远不会改变 .
  • 局部变量 类似于对象将状态存储在字段中 , 方法通常将其临时状态存储在局部变量中 . 声明局部变量的语法类似于声明字段 ( 例如,int count = 0; ) . 没有指定变量为局部的特殊关键字 . 这一判断完全来自于声明变量的位置——在方法的开始花括号和结束花括号之间 . 因此 . 局部变量只对声明它们的方法可见 .
  • 参数 main方法的签名是public static void main(String[] args)。这里 args 变量是这个方法的参数。参数总是被划分为“变量”而不是“字段” . 这也适用于其他接受参数的构造函数 ( 如构造函数和异常处理函数 ) .

变量初始化

声明变量后必须用赋值语句进行显式初始化
从Java10开始 , 对于局部变量 , 如果可以从变量的初始值推断出它的类型 , 就不需要声明类型 , 只需要使用关键字 var 而无需指定类型

常量

用关键字 final 指示常量 , 且只能被赋值一次 , 通常定义时即对其初始化 . 常量名使用全大写 , 不同字符使用下划线分隔 .

类常量

可以在一个类的多个方法中使用的常量 , 定义在 main 方法的外部 . 可使用关键字 static final 设置

枚举类型

可自定义枚举类型 , 包括有限个命名的值
Size 类型的变量只能储存这个类型声明中给定的某个枚举值 , 或者特殊值 null .

enum Size { SMALL,MEDIUM,LARGE,EXTRA_LARGE };
Size s = Siza.MEDIUM;

运算符

算数运算符

+ - * / % ++ --

  • 1./ 左右两端的类型需要一致 , 都为整数时表示整数除法 , 否则表示浮点除法
  • 2.%最后的符号和被模数相同
  • 3.前++;先+1,后运算 后++;先运算 , 后+1
  • 4、+:当String字符串与其他数据类型只能做连接运算 , 并且结果为String类型

例如 : 可以把 main 方法标记为 : public static strictfp void main(String[ ] args) , 那么 main 方法中的所有指令都将使用严格的浮点计算 .
如果将一个类标记为 strictfp , 这个类中的所有方法都要使用严格的浮点计算 .

比较运算符

== != < > <= >= instanceof 运算结果都为Boolean类型

赋值运算符

= += -= *= /= %=

逻辑运算符

& | ^ ! && ||

  • &:左边无论真假,右边都会进行运算;
  • &&:如果左边为假,则右边不进行运算;
  • ||| 的区别同上;在使用的时候建议使用&&||
  • ^与或|的不同之处是:当左右都为true时,结果为false。

位运算符

<< >> <<< & | ^ ~
(待补充)

三元运算符

(条件表达式)?表达式1:表达式2;

条件运算符 条件表达式为true时,运算后的结果是表达式1 条件表达式为false时,运算后的结果是表达式2

  • 1、表达式1与表达式2的类型必须一致;
  • 2、使用三元运算符的地方一定可以使用if…else代替,反之不一定成立

数学函数与常量

计算数值的平方根 : 使用Math 类中的 sqrt 方法
Math 类中的 sqrt 方法并不处理任何对象 , 这样的方法被称为静态方法

幂运算 : 使用Math 类中的 pow 方法
(将y的值设为x的a次幂)

double y = Math.pow(x,a);
//x和a都为double类型的参数,返回结果也为double类型

floodMod方法

括号与运算符级别

数值类型之间的转换

实线箭头表示无信息丢失的转换
虚线箭头表示可能有精度损失的转换

强制类型转换

强制类型转换 ( cast ) 通过截断小数部分将浮点值转换为整形
圆括号中给出想要转换的目标 , 后面紧跟待转换的变量名

double x = 9.997;
int nx = (int) x;

如果想对浮点数进行舍入运算 , 使用 Math.round 方法
当调用 round 的时候 , 仍然需要使用强制类型转换 , 原因是 round 方法返回的结果为 long 类型 , 由于存在信息丢失的可能性 , 只有使用显式的强制类型转换才能将 long 类型转换成 int 类型

double x = 9.997;
int nx = (int) Math.round(x);

字符串

子串

String 类的 substring 方法可以从一个较大的字符串提取出一个子串

String greeting = "Hello";
String s = getting.substring(0,3);

拼接

Java允许用 + 号连接(拼接)两个字符串
当一个字符串与一个非字符串的值进行拼接时 , 后者会转换成字符串 . 任何一个Java对象都可以转换成字符串 .

不可变字符串

String 类对象是不可变的
不可变字符串有一个优点 : 编译器可以让字符串共享

检测字符串是否相等

使用 equals 方法检测两个字符串是否相等 .
s.equals(t) s与t可以是字符串变量或字符串字面量
检测两个字符串是否相等而不区分大小写 , 使用 equalsIgnoreCase 方法

==equals() 的区别

检测两个字符串是否相等而不区分大小写可以使用 equalsIgnoreCase 方法
或使用 compareTo 方法或 strcm 函数

参考文章 : <Java语法 : Java中equals和==的区别>Java语法----Java中equals和==的区别

空串与Null串

空串 " " 是长度为0的字符串 , 是一个Java对象 , 有自己的串长度 (0)和内容(空)
String变量还可以存放一个特殊的值 null

构建字符串

拼接字符串 : 使用 StringBuilder 类 . 允许采用多线程的方式添加或删除字符
如果需要用许多小段的字符串来构建一个字符串 : 首先构建一个空的字符串构建器 , 在字符串构建完成时就调用 toString 方法 , 可以得到一个 String 对象

StringBuilder builder = new StringBuilder();
String completedString = builder,toString();

转义字符

支持一些特殊的转义序列charString文字:

String.contains()方法不需要转义

\a(响铃) \b( 退格) \f(换页) \n(换行) \r(回车) \t(制表符)\v (垂直制表 ) \\(反斜杠) \'(单引号) \"(双引号) \0 (空字符) \ddd (1到3位八进制所代表的任意字符) \xhh (1到2位十六进制所代表的任意字符)

分隔符

  • ;分号 用来终止一个语句
  • {}花括号、大括号 用来包括自动初始化的数组的值,也用来定义程序块、类、方法以及局部范围
  • []方括号、中括号 用来声明数组的类型,也用来表示撤消对数组值的引用
  • , 逗号 在变量声明中,区分变量说明的各个变量。在for控制语句中,用来将圆括号内的语句连接起来
  • . 原点 用来将软件包的名字与它的子包或类分隔。也用来将引用变量与变量或方法分隔
  • () 圆括号 在定义和调用方法时用来容纳参数表。在控制语句或强制类型转换组成的表达式中用来表示执行或计算的优先权

输入与输出

读取输入

标准输入流 System.in
Scanner对象
详情 : Scanner类

Scanner类不适用于从控制台读取密码 . Java6引入了 Console 类来实现这个目的 , 将返回的密码存放在一个字符数组中

Console cons = System.consloe();
String username = cons.readLine("User name:");
char[] passwd = cons.readPassword("Password:");

格式化输出

Java5沿用了C语言函数库中的 printf 方法 : 会以一个字段宽度打印x

System.out.printf("%8.2f",x);

文件输入与输出

读取文件需要构造Scanner对象 :
写入文件需要构造PrinWriter对象 . 在构造器中需要提供文件名和字符编码 :

Scanner in = new Scanner(Path.of("myfile.txt"),StandardCharsets.UTF_8);

控制流程

块作用域

块确定了变量的作用域

条件语句

if

if (条件) {
    声明
}

if-else

if(条件){
    代码块1
}else{
    代码块2
}

if-else-if

if(条件){
    代码块1
}else if(条件2){
    代码块2
}else if(条件3){
    代码块3
}else {
代码块4
}




循环

while

在最前面检测循环条件 , 循环体中的代码可能不执行

while (条件) {
声明
}

do-while

do-while 块内的语句 do 总是至少执行一次

do
{
声明 
}
while (条件);

for

支持迭代的一种通用结构 .
for 语句第一部分通常是对计数器初始化 , 第二部分给出每次新一轮循环执行前要检测的循环条件 , 第三部分指定如何更新计数器
如果在 for 语句内部定义一个变量 , 这个变量就不能在循环体外使用 .
可以在不同的 for 循环中定义同名的变量 .

for (int i=1;i<=10;i++){
System.out.println(i);
}

泛型for循环(for each循环)

可用来依次处理数组 , 循环变量将会遍历数组中的每一个元素 .
定义一个变量用于暂存集合中的每一个元素 , 并执行相应的语句或语句块 . 集合表达式必须是一个数组或一个实现了 Iterable 接口的类对象 (例如 ArrayList )
(打印数组中的所有值 : Arrays类 的 toString 方法 )

for ( 变量 : 集合 ) 声明 ;

不能自动处理二维数组中的每一个元素 , 会循环处理行 , 这些行本身就是一维数组 . 访问二位数组中的所有元素需要使用两个嵌套的循环

for (double[] row : a)
    for (double value : row)
        do something with value

多重选择 : switch语句

选择器表达式 : 当需要对某个表达式的多个值进行检测时使用

switch( ){
      case 1:
      break;
      case 2:
      break;
      default;
}

以下摘自Java文档 :

if-thenif-then-else 语句不同,switch 语句可以有许多可能的执行路径。switch 适用于 byteshortcharint 基元数据类型。
它还适用于枚举类型 ( 在 Enum 类型中讨论 ) 、String 类和一些封装某些基本类型的特殊类 : CharacterByteShortInteger (在 Numbers 和 String 中讨论)

编译代码时可以考虑加上 -Xlint:fallthrough 选项 , 如果某个分支最后缺少一个 break 语句 , 编译器会给出一个警告信息 . 如 :

javac -Xlint:fallthrough Test.java
//Dos命令

中断流程控制

break

用于跳出多重嵌套的循环语句

continue

continue 语句将控制转移到最内层循环的首部
带标签的 continue 语句将调到与标签匹配的循环的首部

大数

能够表示任意精度的算术包 . 属于Java对象
java.math 包中的类 : BigInterBigDecimal . 可以处理包含任意长度数字序列的数值 . 不能使用算数运算符处理大数 , 而需要使用大数类中的 addmultiply 方法 .

数组

数组是一种数据结构 , 存储相同类型值的序列 .
使用 new 操作符创建数组 , 不能改变数组的长度 , 仅可改变单个的数组元素 .
如果程序运行中需要经常扩展数组的大小 , 应该使用另一种数据结构 : 数组列表 .

创建数组对象并同时提供初始值的简写形式 :
不使用 new , 不指定长度 , 最后一个值后允许有逗号用于不断为数组增加新值

int [] smallPrimes = {2,3,5,7,11};

声明匿名数组 :

new int[] {17,19,23};

创建长度为0的数组 : new elementType[0]new elementTyoe[] {}

数组拷贝

( Arrays类的copyOf方法 )

数组排序

( Arrays类中的sort方法 )

不规则数组

附录

<Java核心技术 卷1>链接整理

核心Java核心Java

JavaFX JavaFX

JmolJmol

EclipseEclipse

Java语言规范Java语言规范

bug42525394252539

Java虚拟机规范Java虚拟机规范

API文档API文档

关键字


Empty spaces,fill the pages.