Skip to content

☕ ​Javase


一、引入


1.1 什么是 JDK、JRE


  • JDK (Java Development Kit):是 Java程序开发工具包,包含JRE 和开发人员使用的工具。
  • JRE (Java Runtime Environment) :是 Java程序的运行时环境,包含JVM 和运行时所需要的核心类库

如下是 Java 8.0 Platform

JDKJRE

小结:

JDK = JRE + 开发工具集(例如 Javac 编译工具等)

JRE = JVM + Java SE 标准类库



1.2 JDK 版本选择


  • 高斯林说话:
image-20220428151952049
  • Spring框架说话:

    在 Java 17 正式发布之前,Java 开发框架 Spring 率先在官博宣布,Spring Framework 6和Spring Boot 3计划在2022年第四季度实现总体可用性的高端基线:

    • Java 17 + (来自 Spring Framework 5.3.x 线中的 Java 8-17)

    • Jakarta EE 9 +(来自Spring框架5.3.x 线中的 Java EE 7-8)

Spring 官方说明:https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-now-available

image-20220527155439683


1.3 JDK 的下载


  • 官网下载:下载网址(Oracle公司官网):www.oracle.com

  • 百度网盘
txt
1. JDK 8 : 通过网盘分享的文件:jdk-8u271-windows-x64.exe
链接: https://pan.baidu.com/s/1qBtLxBvtALgWjQwBvCNxTg?pwd=6v52 提取码: 6v52 

2. JDK 17:通过网盘分享的文件:jdk-17.0.2_windows-x64_bin.exe
链接: https://pan.baidu.com/s/1Q6WTc69GyMECw-SRdssm5g?pwd=n9tv 提取码: n9tv



1.4 IDEA 下载



  • 百度网盘:
txt
IntelliJ IDEA 2022.1.2 : 
通过网盘分享的文件:ideaIU-2022.1.2.exe
链接: https://pan.baidu.com/s/1GQZ26N-VudejB9sS33uvSw?pwd=mpgp 提取码: mpgp



1.5. Hello World


  • 在无 IDEA 的情况下(理解原理) :
    • Java 程序开发三步骤:编写编译运行
      • 将 Java 代码 编写 到扩展名为 .java 的源文件中
      • 通过 javac.exe 命令对该 java 文件进行 编译,生成一个或多个字节码文件
      • 通过 java.exe 命令对生成的 class 文件进行 运行

image-20220310230210728


  • IDEA 的情况下 :

选择 "New Project" :

image-20221019174051967

指名工程名、使用的 JDK 版本等信息。如下所示:

image-20221019174355370

接着创建 Java 类:

image-20221019174505876

编写代码:

java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello,World!");
    }
}

运行:

image-20221019174716442

控制台输出:

image-20221019174801370


二、 变量与运算符


2.1 关键字 (Keyword)


  • 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(或单词)

    • HelloWorld 案例中,出现的关键字有 classpublic staticvoid 等,

      这些单词已经被 Java 定义好了。

  • 特点:全部关键字都是 小写字母

  • 关键字比较多,不需要死记硬背,学到哪里记到哪里即可。

  • 官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html


说明:

  1. 关键字一共 50个,其中 constgoto保留字 (reserved word)。
  2. truefalsenull 不在其中,它们看起来像关键字,其实是字面量,表示特殊的布尔值和空值。

image-20220310234557454
image-20220801143635356

2.2 标识符( identifier)


  • Java中 变量、方法、类等要素命名时使用的字符序列,称为 标识符

    技巧:凡是自己可以起名字的地方都叫标识符。


  • 命名规则 (硬性规则):
txt
> 由26个英文字母大小写,0-9 ,_或 $ 组成  
> 数字不可以开头。
> 不可以使用关键字和保留字,但能包含关键字和保留字。
> Java中严格区分大小写,长度无限制。
> 标识符不能包含空格。

  • 命名规范(软性要求):
txt
> 包名:多单词组成时所有字母都小写:xxxyyyzzz。
  例如:java.lang、com.atguigu.bean
  
> 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
  例如:HelloWorld,String,System等
  
> 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
  例如:age,name,bookName,main,binarySearch,getName
  
> 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
  例如:MAX_VALUE,PI,DEFAULT_CAPACITY



2.3 变量


变量的概念:

  • 内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化
  • 变量的构成包含三个要素:数据类型变量名存储的值
  • Java中变量声明的格式:数据类型 变量名 = 变量值
image-20220311000744867
  • 变量的作用:用于在内存中保存数据。

  • 使用变量注意:

    • Java 中每个变量必须先声明,后使用。
    • 使用变量名来访问这块区域的数据。
    • 变量的作用域:其定义所在的一对 { } 内。
    • 变量只有在其 作用域 内才有效。出了作用域,变量不可以再被调用。
    • 同一个作用域内,不能定义重名的变量。

2.3.1 变量的数据类型


  • Java 中变量的数据类型分为两大类:

    • 基本数据类型: 包括 整数类型浮点数类型字符类型布尔类型
    • 引用数据类型: 包括 数组接口枚举注解记录
Java的数据类型

2.3.2 变量的声明


txt
格式:  数据类型  变量名;
java
//例如:
//存储一个整数类型的年龄
int age; 

//存储一个小数类型的体重
double weight;

//存储一个单字符类型的性别 
char gender;

//存储一个布尔类型的婚姻状态
boolean marry;

//存储一个字符串类型的姓名
String name;

//声明多个同类型的变量
int a,b,c; //表示a,b,c三个变量都是int类型。

注意:变量的数据类型可以是基本数据类型,也可以是引用数据类型。


2.3.3 变量的赋值


给变量赋值,就是把“值”存到该变量代表的内存空间中。

同时,给变量赋的值类型必须与变量声明的类型一致或兼容。


txt
格式: 变量名 = 值;

  • 已经声明的变量合适类型常量值 进行赋值:
java
age = 18;
weight = 109;
gender = '女';
  • 其他 变量 或者 表达式 给变量赋值:
java
int m = 1;
int n = m;
        
int x = 1;
int y = 2;
int z = 2 * x + y;
  • 变量可以 反复赋值
java
//先声明,后初始化
char gender;
gender = '女';

//给变量重新赋值,修改gender变量的值
gender = '男';
System.out.println("gender = " + gender);//gender = 男
  • 声明和赋值一起执行:
java
boolean isBeauty = true;
String name = "迪丽热巴";

内存结构如图:

image-20220514152216148

2.4 基本数据类型


2.4.1 整型类型


整型类型 : byte、short、int、long

image-20220520111756274
  • 各整数类型有固定的表数范围和字段长度,不受具体操作系统的影响,以保证 Java 程序的可移植性。
image-20220311001553945
  • 定义 long 类型的变量,赋值时需要以 "l"或"L" 作为后缀 。
  • Java程序中变量 通常 声明为 int 型,除非不足以表示较大的数,才使用 long。
  • Java的整型 常量默认为 int 型

补充:计算机存储单位
  • 字节(Byte): 是计算机用于 计量存储容量基本 单位,一个字节等于8 bit

  • 位(bit): 是数据存储的 最小 单位。二进制数系统中,每个 0或1 就是一个位,

    叫做bit(比特),其中 8 bit 就称为一个字节(Byte) 。

  • 转换关系:

    • 8 bit = 1 Byte
    • 1024 Byte = 1 KB
    • 1024 KB = 1 MB
    • 1024 MB = 1 GB
    • 1024 GB = 1 TB

2.4.2 浮点类型


浮点类型 : float、double

  • 与整数类型类似,Java 浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响。
image-20220311001749699
  • 浮点型常量有两种表示形式:
    • 十进制数形式。如:5.12 512.0f .512 (必须有小数点)
    • 科学计数法形式。如:5.12e2 (5.12×10的2次方) 512E2 (512×102) 100E-2 (100×10−2)

  • 两个类型:
    • float 单精度,尾数可以精确到 7 位有效数字。很多情况下,精度很难满足需求。
    • double双精度,精度是 float 的两倍。通常采用此类型。

  • 注意:
    • 定义 float 类型的变量,赋值时需要以 "f" 或 "F" 作为后缀。
    • Java 的浮点型 常量默认为double型

补充:关于浮点型精读的说明

  • 并不是所有的小数都能可以精确的用二进制浮点数表示。

    二进制浮点数不能精确的表示 0.1、0.01、0.001 这样 10 的负次幂。

  • 浮点类型 float、double 的数据不适合在 不容许舍入误差 的金融计算领域。

    如果需要 精确 数字计算或保留指定位数的精度,需要使用 BigDecimal类

  • 测试:

java
//测试1:
System.out.println(0.1 + 0.2);//0.30000000000000004

//测试2:
float ff1 = 123123123f;
float ff2 = ff1 + 1;
System.out.println(ff1); // 1.2312312E8
System.out.println(ff2);  // 1.2312312E8
System.out.println(ff1 == ff2); // true

2.4.3 字符类型:char


  • char 型数据用来表示通常意义上 “字符”(占2字节)

  • Java 中的所有字符都使用 Unicode 编码,故一个字符可以存储一个字母,一个汉字,

    或其他书面语的一个字符。

  • 字符型变量的三种表现形式:

    • **形式1:**使用单引号 ('') 括起来的 单个字符

      例如:char c1 = 'a'; char c2 = '中'; char c3 = '9';

    • **形式2:**直接使用 Unicode值 来表示字符型常量:‘\uXXXX’。其中,XXXX代表一个十六进制整数。

      例如:\u0023 表示 '#'

    • **形式3:**Java 中还允许使用 转义字符‘\’ 来将其后的字符转变为特殊字符型常量。

      例如:char c3 = '\n'; // '\n'表示换行符


  • 常见转义字符:
转义字符说明Unicode表示方式
\n换行符\u000a
\t制表符\u0009
\"双引号\u0022
\'单引号\u0027
\\反斜线\u005c
\b退格符\u0008
\r回车符\u000d

  • 注意 : char 类型是可以进行运算的。因为它都对应有 Unicode 码,可以看做是一个数值。

2.4.4 布尔类型:boolean


  • boolean 类型用来判断逻辑条件,一般用于流程控制语句中:
    • if 条件控制语句;
    • while 循环控制语句;
    • for 循环控制语句;
    • do-while 循环控制语句;

  • boolean类型数据只有两个值:true、false,无其它

    • 不可以使用 0或非 0 的整数替代 false 和 true,这点和C语言不同。

    • 拓展:Java 虚拟机中没有任何供 boolean 值专用的字节码指令,Java语言表达所操作的 boolean 值,在编译之后都使用 java 虚拟机中的 int 数据类型来代替:

      true 用 1 表示,false 用 0 表示。——《java虚拟机规范 8版》


经验之谈:

Less is More!建议不要这样写:if ( isFlag = = true ),只有新手才如此。

关键也很容易写错成 if(isFlag = true),这样就变成赋值 isFlag为true 而不是判断!

老鸟的写法 是 if (isFlag) 或者 if ( !isFlag) 。


2.5 基本数据类型变量间运算规则


在Java程序中,不同的基本数据类型(只有7种,不包含 boolean 类型)变量的值经常需要进行相互转换。

转换的方式有两种:自动类型提升强制类型转换


2.5.1 自动类型提升


  • 规则:将取值范围小(或容量小)的类型自动提升为取值范围大(或容量大)的类型 。
image-20220523162200891
  • 基本数据类型的转换规则如图所示:
image-20220311002543688
  • (1)当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时
java
int i = 'A';//char 自动升级为 int,其实就是把字符的编码值赋值给i变量了
double d = 10;// int 自动升级为 double
long num = 1234567; //右边的整数常量值如果在 int 范围呢,编译和运行都可以通过,这里涉及到数据类型转换

//byte bigB = 130;//错误,右边的整数常量值超过 byte 范围
long bigNum = 12345678912L;//右边的整数常量值如果超过int范围,必须加L,显式表示long类型。否则编译不通过
  • (2)当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时,会按照其中最大的类型运算。
java
int i = 1;
byte b = 1;
double d = 1.0;

double sum = i + b + d;//混合运算,升级为double
  • (3)当 byte,short,char 数据类型的变量进行算术运算时,按照 int 类型处理。
java
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2; //编译报错,b1 + b2自动升级为int , 则左边声明了byte是错误的

char c1 = '0';
char c2 = 'A';
int i = c1 + c2; //至少需要使用int类型来接收
System.out.println(c1 + c2); //113

2.5.2 强制类型转换