2.Java基础知识:语法

1、Java中的关键字

关键字说明
abstract表明类或者成员方法具有抽象属性
assert用来进行程序调试
boolean基本数据类型之一,布尔类型
break提前跳出一个块
byte基本数据类型之一,字节类型
case用在switch语句之中,表示其中的一个分支
catch用在异常处理中,用来捕捉异常
char基本数据类型之一,字符类型
class
const保留关键字,没有具体含义
continue回到一个块的开始处
default默认,例如,用在switch语句中,表明一个默认的分支
do用在do-while循环结构中
double基本数据类型之一,双精度浮点数类型
else用在条件语句中,表明当条件不成立时的分支
enum枚举
extends表明一个类型是另一个类型的子类型,这里常见的类型有类和接口
final用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变
finally用于处理异常情况,用来声明一个基本肯定会被执行到的语句块
float基本数据类型之一,单精度浮点数类型
for一种循环结构的引导词
goto保留关键字,没有具体含义
if条件语句的引导词
implements表明一个类实现了给定的接口
import表明要访问指定的类或包
instanceof用来测试一个对象是否是指定类型的实例对象
int基本数据类型之一,整数类型
interface接口
long基本数据类型之一,长整数类型
native用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
new用来创建新实例对象
package
private一种访问控制方式:私用模式
protected一种访问控制方式:保护模式
public一种访问控制方式:共用模式
return从成员方法中返回数据
short基本数据类型之一,短整数类型
static表明具有静态属性
strictfp用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范
super表明当前对象的父类型的引用或者父类型的构造方法
switch分支语句结构的引导词
synchronized表明一段代码需要同步执行
this指向当前实例对象的引用
throw抛出一个异常
throws声明在当前定义的成员方法中所有需要抛出的异常
transient声明不用序列化的成员域
try尝试一个可能抛出异常的程序块
void声明当前成员方法没有返回值
volatile表明两个或者多个变量必须同步地发生变化
while用在循环结构中

2、标识符

在编程过程中,经常需要在程序中定义一些符号来标记一些名称,如包名,类名,方法名,参数名,变量名等.这些符号被称为标识符。

2.1、组成成分:

  • 任意顺序的大小写字母. a_z, A_Z
  • 数字. 0_9
  • 下划线. _
  • 美元符号. $
  • 标识符不能以数字开头
  • 标识符不能是Java中的关键字

2.2、规范 :

为了增加代码的可读性,在定义标识符还应该遵守以下规则 :

  • 包名所有字母一律小写。例如 : com.test
  • 类名和接口名每个单词的首字母都要大写。例如 : ArrayList, Iterator
  • 常量名所有字母都大写.单词之间用下划线连接。例如 DAY_OF_MONTH
  • 变量名和方法名的第一个单词首字母小写.从第二个单词开始每个单词的首字母大写。例如: lineNumber, getLineNumber
  • 在程序中,应该尽量使用有意义的英文单词来定义标识符.使得程序便于阅读。例如使用 userName 表示用户名、password 表示密码

3、注释

3.1、特点:

1.不会被编译器去编译,编译器会忽略注释中所有的内容。

2.注释是给人看的,不是给编译器看的。

3.2、分类:

1.单行注释: // 后面的这一行内容就是注释。

2.多行注释: /* */ 里面的所有内容都会被当作注释,无论多少行,多行注释是不能嵌套的。

3.文档注释: /** */ 用于生成java开发文档的注释。

4、常量

常量就是在程序中固定不变的值,是不能改变的数据。

分类:

  • 整型常量

生活中最常用的十进制,还有二进制,八进制,和十六进制

  • 浮点型常量

就是在数学中用到的小数。分为float单精度浮点数和double双精度浮点数两种类型。

float单精度存储数据时保留8位有效数字,例如:将常量12345.123456789f赋值个float变量,其存储的实际值为12345.123;

double变量存储数据时,保留16位有效数字,例如:12345.123456789l,最后的字符为l,默认可以不写。double类型可以进行完整的存储.

  • 字符常量

用于表示一个字符

  • 字符串常量

用于表示一串连续的字符

  • 布尔常量

两个值true (真) 或 false(假),该常量用于区分一个事物的真与假

  • null 空常量型

空常量只有一个值,即null,表示对象的引用为空。

5、变量

变量是内存中的一个存储区域.在内存中,每一块空间都有其独一无二的地址。

该区域有自己的名称(变量名)通过名称就可以找到这块内存地址和类型(数据类型)决定了开辟空间的大小。

该区域的数据可以在同一数据类型范围内不断变化。

5.1、定义变量的格式

数据类型 变量名 = 值;

5.2、数据类型 数据类型

数据类型内存所占字节
byte1 字节
char2 字节
short2 字节
int4 字节
long8 字节
float4 字节
double8 字节
boolean1 bit. 取值 true 或者 false

5.3、使用三步骤:

  1. 定义
  2. 初始化
  3. 使用
public class Demo {

 public static void main(String[] args) {
     // 变量

     // 变量使用的三部曲
     // 1. 定义
     int num;
     // 2. 初始化
     num = 200;
     // 3. 使用
     System.out.println("num=" + num);

     // 格式:  数据类型变量名 = 初始值;
     // 1. byte 1个字节 -128 ~ 127
     // 说明: 变量在定义的同时进行了初始化操作
     byte num1 = 127;

     // 2. short 2个字节 -32768 ~ 32767
     short num2 = 32767;

     // 3. int 4个字节 -2147483648 ~ 2147483647 (默认类型)
     int num3 = 2147483647;

     // 4. long 8个字节 -9223372036854775808 ~ 9223372036854775807
     long num4 = 9223372036854775807l;// 注意: 最后一个字符是 l,代表此数值为 long类型

     // 5. float 4个字节单精度浮点数 (8位有效位数)
     float f1 = 12345.123456789f;// f1=12345.123

     // 6. double 8个字节双精度浮点数 (16位有效数)
     double d1 = 12345.12345678988;

     // 7. char 2个字节字符类型,用于存储单个字符 ''
     char ch = '中';

     // 8. boolean 1比特位 true / false
     boolean bool = false;

     System.out.println("bool=" + bool);// + 在输出语句中代码拼接一个变量值
 }
}

5.4、数据类型转换

自动类型转换 (隐式类型转换)

  • 条件1: 两种类型彼此兼容。
  • 条件2: 目标类型的取值范围大于源类型的取值范围。
  public class Demo {
    public static void main(String[] args) {
      byte b = 4;
      int x = 3;
      x = x + b;// 系统为 b 做了自动类型的提升
      System.out.println("x=" + x);
    }
   }
数据类型转换

强制类型转换 (显示类型转换)

1.当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。

2.类型按照精度从低到高排列:

byte short char int long float double

当把级别高的变量的值赋值给级别低的变量时,需要使用类型转换运算.

/**
  强制类型转换:它一般容易产生有数据的丢失。
  格式:(数据类型 )( 表达式/变量);
*/
public class Demo {
    public static void main(String[] args) {
        byte b = 4;
        int x = 3;
        //强制类型转换
        b = (byte) (x + b);
        System.out.println("b=" + b);
    }
}

// float -> int
public class Demo {
    public static void main(String[] args) {
        float f = 10.88f;
        //强制类型转换
        int x = (int) f;
        System.out.println("x=" + x); // x = 10
    }
}

// int -> byte
public class Demo {
    public static void main(String[] args) {
        int num = 298;
        byte a = (byte) num;
        // 298 -> 0000 0000 0000 0000 0000 0001 0010 1010
        // byte-> 0010 1010
        System.out.println("a=" + a);// a=42
    }
}

5.5、表达式类型自动提升

所谓表达式是指由变量和运算符组成的一个算式。

变量在表达式中进行运算时,也有可能发生自动类型转换。

这就是表达式数据类型的自动提升。如一个byte型的变量在运算期间会自动提升为int型,short类型同理。

// 变量b1和b2都被自动提升为int型。表达式的运算结果也就成为int型。这时如果将该结果赋值给byte型的变量,需要进行强制类型转换。
public class Demo {
    public static void main(String[] args) {
        byte b1 = 3;
        byte b2 = 4;
        byte b3 = (byte) (b1 + b2);
        System.out.println("b3=" + b3);// b3 = 7
    }
}

public class Demo {
    public static void main(String[] args) {
        byte b1 = 3;
        byte b2 = 4;
        int b3 = b1 + b2;
        System.out.println("b3=" + b3); // b3 = 7
    }
}

6、运算符

在程序中经常出现一些特殊的符号,如+ - * / = >等。

这些特殊符号称作运算符.运算符用于对数据进行算术运算,赋值和比较操作。

在Java中,运算符可以分为算术运算符,赋值运算符,比较运算符,逻辑运算符位运算符.

6.1、算术运算符:

  • 算术运算符连接起来的式子, 就叫做算术表达式。
  • 算术运算符的优先级:先乘除模(取余) 后加减. 如果同级别,,就从左到右,依次的计算,有小括弧的就先计算小括弧里面的。

6.2、赋值运算符:

public class Demo {
    public static void main(String[] args) {
        int num = 10;
        int result = num + 5;
        System.out.println("num=" + num);// num = 10
    }
}
public class Demo {
    public static void main(String[] args) {
        int num = 10;
        num = num + 5;
        System.out.println("num=" + num);// num = 15
    }
}
赋值运算符1 赋值运算符2

6.3、复合赋值运算符:

要想让一个变量的值在自身的基础上做改变, 那么还可以有另外一种写法 : += -= *= /= %=

 public class Demo {
    public static void main(String[] args) {
        int num = 10;
        num += 5;
        System.out.println("num=" + num);// 15
        num -= 5;
        System.out.println("num=" + num);// 10
        num *= 5;
        System.out.println("num=" + num);// 50
        num /= 5;
        System.out.println("num=" + num);// 10
        num %= 5;
        System.out.println("num=" + num);// 0
    }
}

6.4、自增和自减(表达式)

  • 自增运算 (前自增运算 / 后自增运算):无论是前自增还是后自增,都是将自身的值加 1。
  • 自减运算.(前自减运算 / 后自减运算):无论是前自减还是后自减,都是将自身的值减 1。
  • ++i或者--i,不开辟临时空间,两值都一样。
  • i++或者i--,开辟临时空间,两值不一样。

6.5、比较运算符:

由比较运算符连接起来的表达式就是比较表达式。用于对两个数值或变量进行比较。其结果是一个布尔值.即true或false。

运算符运算范例结果
==相等于4 == 3false
!=不等于4 != 3true
<小于4 < 3false
>大于4 > 3true
<=小于等于4 <= 3false
>=大于等于4 >= 3true

6.6、逻辑运算符

  • 逻辑表达式 : 由逻辑运算符连接起来的表达式就是逻辑表达式.
  • 作用 : 判断多个条件的, 使用逻辑运算符来指定多个条件之间的关系.
  • 逻辑运算符用于对布尔型的数据进行操作。其结果仍是一个布尔型数据
运算符运算范例结果
&AND (与)false & truefalse
|OR (或)false | truetrue
^XOR (异或)true ^ falsetrue
!NOT (非)!truefalse
&&AND (短路)false && truefalse
||OR (短路)false || truetrue
  • 逻辑与 (&) 口诀: 一假即假
  • 逻辑与短路的问题 : (&&) 口诀:一假即假
  • 逻辑或 (|) 口诀:一真即真
  • 逻辑或短路的问题 : (||) 口诀: 一真即真
  • 逻辑非 ( ! ) 口诀: 真变假,假变真
  • 逻辑异或 ( ^ ) 口诀:相同为假,不同为真
true^truefalse
false^truetrue
true^falsetrue
false^falsefalse

6.7、位运算符

注:位运算符是针对二进制数的每一位进行运算的符号。它是专门针对数字0和1进行操作的。(运算效率最高)

运算符运算范例
<<左移3 « 2 = 12; 相当于 3 _ 2 _ 2 = 12;
>>右移3 » 1 = 1; 相当于 3 / 2 = 1;
>>>无符号右移3 »> 1 = 1; 相当于 3 / 2 = 1;
&与运算6 & 3 = 2;
|或运算6 | 3 = 7;
^异或运算6 ^ 3 = 5;

6.8、& 按位与 口诀: 全1才1, 否则0

19 & 1
    00000000 00000000 00000000 00100011
    00000000 00000000 00000000 00000001
    ------------------------------------
    00000000 00000000 00000000 00000001 == 奇数 (1)
    
30 & 1
    00000000 00000000 00000000 00011110
    00000000 00000000 00000000 00000001
    ------------------------------------
    00000000 00000000 00000000 00000000 == 偶数 (0)

6.9、|按位或 口诀: 有1就1

9 | 12
		00000000 00000000 00000000 00001001
		00000000 00000000 00000000 00001100
		--------------------------------------
		00000000 00000000 00000000 00001101

6.10、^按位异或 口诀: 相同为0, 不同为1

交互两个变量的值:

       int a = 10;
       int b = 20;

       a = a ^ b;
       b = a ^ b;
       a = a ^ b;
    
10       :  00000000 00000000 00000000 00001010
20       :  00000000 00000000 00000000 00010100
-------------------------------------------------
异或运算 :  00000000 00000000 00000000 00011110 == 30  a = a ^ b;
    
           00000000 00000000 00000000 00011110
           00000000 00000000 00000000 00010100
-------------------------------------------------
           00000000 00000000 00000000 00001010 == 10  b = a ^ b;
    
           00000000 00000000 00000000 00011110
           00000000 00000000 00000000 00001010
-------------------------------------------------
           00000000 00000000 00000000 00010100 == 20  a = a ^ b;

6.11、<<左移 口诀: 相当于乘法

# 意义 : 将一个二进制的数据向左移动指定的位数, 高位溢出的部分丢弃, 低位补0
# 注意点 : 
	有可能改变这个数的正负性.
	将一个数按位左移n位, 就相当于这个数乘以2的n次方
	
8 << 2
    |00000000 00000000 00000000 00001000| 8
    |000000 00000000 00000000 0000100000| 32 --> 8 * 2的2次方
    
40 << 3
    |00000000 00000000 00000000 00101000| 40
    |00000 00000000 00000000 00101000000| 320 --> 40 * 2的3次方

6.12、>>右移 口诀: 相当于除法

# 意义 : 将一个二进制的数据, 向右移动指定的位数, 低位溢出的部分丢弃, 高位不足的以符号位补齐.
# 注意点 : 
 向右移动不会改变这个数的正负性.
 一个数向右移动n位, 就相当于这个数除以2的n次方.
 
8 >> 2
    |00000000 00000000 00000000 00001000| 8
    |0000000000 00000000 00000000 000010| 2 --> 8 / 2的2次方
    
40 >> 3
    |00000000 00000000 00000000 00101000| 40
    |00000000000 00000000 00000000 00101| 5 --> 40 / 2的3次方

6.13、按位无符号右移 : >>>口诀: 相当于除法

6.14、位运算符和逻辑运算符的区别:

Q:如果在程序中 出现了  &   |  ^ 这时他们到底是逻辑运算还是位运算? 

判断运算符两侧的数据类型。如果是boolean类型,就是逻辑运算,如果是数值类型,他们都是位运算。

7、编码表

Unicode字符集:

Java语言使用Unicode标准字符集,该字符集由Unicode协会管理并接受其技术上的修改,最多可识别65536个字符。

Unicode字符集前128个字符刚好是ASCII码,大部分国家的“字母表” 的字母都是Unicode 字符集中的一个字符。

Java所谓的字母包括了世界上大部分语言中的“字母表”,因此,Java所使用的字母不仅包括通常的拉丁字母a, b, c等,也包括汉语中的汉字,日文,朝鲜文,俄文,希腊字母以及其他许多语言中的文字。

对于char型变量,分配2个字节内存,占16位, char型变量的取值范围是0~65535。

我们需要重点关注的是Unicode字符集中的ASCII表。

ASCII表

8、逗号表达式

逗号在Java语言中,是一个运算符, 由逗号连接起来的式子就叫做逗号表达式。

  • 语法 : 表达式1, 表达式2, 表达式3, ......表达式n;
public class Demo {
    public static void main(String[] args) {
        char ch1 = 97, ch2 = 65, ch3 = 48;
        int i1 = 'a', i2 = 'A', i3 = '0';
        System.out.println("ch1=" + ch1 + ", ch2=" + ch2 + ", ch3=" + ch3);
        System.out.println("i1=" + i1 + ", i2=" + i2 + ", i3=" + i3);
    }
}

9、三元运算符

  • 三元运算的语法 : 表达式 ? 值1 : 值2;
public class Demo {
    public static void main(String[] args) {
        // 三元运算符 
        // 格式:  表达式 ? 值1 : 值2;
        // 如果表达式的条件成立,为true,则返回值1
        // 如果表达式的条件不成立,为false,则返回值2
        int num = -10;
        int result = (num > 0) ? 100 : -100;
        System.out.println("result=" + result);
    }
}

10.条件语句

10.1、If 语法 :

 if (条件表达式) {  
    执行代码
 }
  • 图示: If语句

10.2、if - else 语法

if (条件表达式) {  
    执行代码1
}else{
    执行代码2
}
  • 图示: if-else语句

10.3、if – else if – else 语法

if (条件表达式1) {  
    执行代码1
}else if(条件表达式2){
    执行代码2
}else{
    执行代码3
}
  • 图示: if–else if–else语句

10.4、switch 语法:

 switch (表达式) { 
    case 常量1: 
        执行代码1
        break;
    case 常量2: 
        执行代码2 
        break;
     ...
    default: // 默认执行
        // 没有满足case条件后,执行该语句
        break;
}
  • 图示: switch语句

11、循环结构

11.1、while 循环结构

  • while 语法
while (条件表达式) { 	
    执行代码 	
}
  • 图示: while语句

11.2、do - while 循环结构

  • do - while 语法
do {
   // 语句 (循环体) 
} while (条件表达式);
  • 图示: do-while语句

11.3、for 循环结构

  • for 语法
for (初始化变量; 循环条件; 增量 (循环后的操作表达式)) {
    // 语句 (循环体)
 }
  • 图示: for语句

12、流程控制(break,continue)

12.1、break

在switch条件语句和循环语句中都可以使用break语句。

当它出现在switch条件语句中,作用是终止某个case并跳出switch结构。

当它出现在循环语句中,作用是跳出循环语句,执行后面的代码。

while(true){
  System.out.println("我喜欢你!");
  break;
  }

12.2、continue

continue 语句用在循环语句中,它的作用是终止本次循环,继续下一次循环。

public class Demo {
    public static void main(String[] args) {
        int i = 0;
        while (i < 10) {
            i++;
            if (i == 5) {
                continue;
            }
            System.out.println("i=" + i); // 输出的结果没有 5
        }

    }
}

注:break 用来结束这个循环,continue 只能用来结束当前循环,无论是break还是continue,只要遇到了,循环体后面的代码是不会执行的