1.1.1 什么是Java编程语言
语言是人类进行沟通交流的各种表达符号,方便人与人之间进行沟通与信息交换;而计算机编程语言则是人与计算机之间进行信息交流沟通的一种特殊语言,也有语法规则、字符、符号等等。常见的计算机编程语言有C、C++、Python、JAVA等。
1.1.2 Java语言历史
James Gosling及其团队于1990年开始“绿色计划”,后来发展一套语言叫做“Oak”( 以高斯林办公室外的一棵橡树命名),后更名为Java。Java 最初是为交互式电视设计的,但它对于当时的数字有线电视行业来说太先进了;随着发展,Sun Microsystems 于 1996 年发布了Java 1.0,截止2023年6月,Java 20是最新的版本。
1.1.3 Java语言应用领域
Java语言被广泛应用于各类应用的开发:
根据JetBrains公司于2021年组织的开发语言调研,在中国有约47%的开发者使用Java语言。在全世界范围内,Java语言主要被应用于网站开发。
1.1.4 Java编程语言的构成
JDK – Java Development Kit (Java开发工具包),是开发Java程序使用的工具包,可以编译运行Java程序。JDK主要包括:
其中,JRE主要包含:
因此,可以简单理解为:运行Java程序需要使用 JRE,开发Java程序需要使用 JDK。
1.1.5 经典面试题目:JDK JRE JVM关系
JDK(Java Development Kit)是用于Java应用程序开发的软件包,包括JRE(Java Runtime Environment)和开发工具,而JRE是运行Java程序所需的运行时环境,JVM(Java Virtual Machine)是在JRE中执行Java字节码的虚拟机。
1.2.1 什么是集成开发环境(IDE)
集成开发环境(Integrated Development Environment,简称IDE)是一种软件工具,提供了一套集成的功能和工具,用于开发、编写、测试和调试软件应用程序。
IDE通常包括以下核心组件:代码编辑器、编译器/解释器、调试器、构建工具、版本控制系统集成、图形用户界面设计器、项目管理工具。
通过集成这些功能和工具,IDE可以提高开发人员的生产力,简化开发过程,并提供更好的代码质量和可维护性。IDE通常与特定的编程语言或开发平台相关,例如Java开发中常用的Eclipse、IntelliJ IDEA和NetBeans等。
企业中一般采用集成开发环境软件作为Java开发平台使用,其自动化程度好、编程效率高,可以大大简化开发流程,提高开发效率。
目前比较常用的集成开发环境有:
1.2.2选择Java的版本
Java的版本管理中,短期支持版(Short-Term Support,STS)和长期支持版(Long-Term Support,LTS)是不同类型的发布版本。
短期支持版(STS):短期支持版是每六个月发布一次的版本,这些版本通常包含新的功能、改进和修复。它们提供了最新的技术和特性,但支持周期相对较短。
长期支持版(LTS):长期支持版是每三年发布一次的版本,这些版本被认为是稳定和可靠的,并具有更长的支持和维护周期。LTS版本提供了更长时间的支持,包括安全修复和错误修复,以确保应用程序的稳定性和兼容性。
目前的Java版本情况如下:
Java 8:Java 8是Java平台的第一个LTS版本,于2014年3月发布。它引入了重要的特性,如Lambda表达式、Stream API等。Java 8的LTS支持于2025年停止,现在被广泛使用。
Java 11:Java 11是Java平台的第二个LTS版本,于2018年9月发布。作为LTS版本,它提供长达八年的公共支持。Java 11引入了局部变量类型推断、HTTP/2客户端等功能。
Java 17:Java 17是Java平台的最新LTS版本,于2021年9月发布。作为LTS版本,它将获得长达八年的公共支持。Java 17带来了一些新特性和改进,如弱引用支持、垃圾回收器的改进等。
除了LTS版本外,Java还有一系列的短期支持版(STS),如Java 12、13、14、15和16等。这些版本提供了最新的功能和改进,但支持周期相对较短。
开发者可以根据自己的需求和情况选择适合的Java版本。对于企业和长期项目,LTS版本通常是更好的选择,而对于那些需要最新功能的开发者,可以选择短期支持版。
1.2.3 安装Java开发环境步骤
目前企业中主流采用Java 8但是在JetBrain 2022年调查数据中Java 17占有率提升很快,因此以Java 17为例讲解Java开发环境安装步骤:
一、下载安装配置JDK 17
二、下载安装IDEA
1.2.4【案例】安装及配置Java 开发环境 JDK 17
在Oracle网站中找到JDK 17的下载页面:
如果是苹果电脑,请下载对应macOS版本的JDK。
下载JDK 17到本地后,安装JDK 17 ,并执行JDK安装程序,选择n个下一步完成安装。然后配置Java环境变量(在新版Java中这些环境变量都是可选参数了,可以省略):
1、配置JAVA_HOME
PS C:\Users\Liu> java -version
java version "17.0.7" 2023-04-18 LTS
Java(TM) SE Runtime Environment (build 17.0.7+8-LTS-224)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.7+8-LTS-224, mixed mode, sharing)
PS C:\Users\Liu> javac -version
javac 17.0.7
1.2.5【案例】安装及配置Java 集成开发环境 IDEA
在JetBrains网站中找到IDEA的下载页面:
然后下载IDEA Community版到本地,并安装IDEA:双击下载好的安装文件,启动安装程序,按照提示选择“下一步”直到IDEA安装完毕。
1.3.1 Hello World
编程语言学习的传统习惯是从HelloWorld开始:
1、Hello World 是最编程语言中最简单的程序
2、你第一次使用编程语言控制计算机的运行
3、编写第一个Java程序,测试Java开发环境工作是否正常
第一个 Java 的 HelloWorld 程序,源码如下所示:
1.3.2 注释
在计算机编程中,注释是计算机程序源代码中程序员可读的解释或注释。 添加它们的目的是使源代码更易于人类理解,并且通常被编译器和解释器忽略。
Java中常用的注释有三种,分别是单行注释、多行注释和文档注释,语法如下:
// 这是单行注释
/* 这是多行注释 */
/** 这是文档注释 */
2.1.1 Java程序执行过程
程序员所编写的代码保存为以.java为后缀的文件,此文件操作系统不能正确识别,因此,首先要经过编译,生成所谓的字节码文件(.class),而字节码文件需要JVM来提供运行环境的支持。
JVM安装在操作系统中,建立在操作系统之上,为字节码文件提供运行环境,效果如下图所示:
Java官方提供了针对不同平台的JVM软件,即:不同平台的JVM是不同的。但这些JVM遵循着相同的标准,即:只要是标准的.class文件,就可以在不同的JVM上运行,而且运行的效果相同。这样,就实现了所谓的“一次编程到处使用”:
Java程序遵循着先编译、后执行的原则。首先,通过javac命令将JAVA源程序(.java文件)编译为JAVA字节码(.class文件),而后,通过java命令启动JVM,由JVM来加载.class文件并运行.class文件。效果如下图所示:
因此,可以将其运行执行过程,简单总结为:
1、Java源代码编译以后生成字节码
2、字节码在Java虚拟机上执行
3、Java虚拟机(JVM)将字节码翻译为目标平台可以执行的指令
3.1.1 标识符
标识符是指用来标识某个实体的一个符号。在Java语言中,主要是指在编程时使用的名字。标识符的使用须遵循一定的规则:Java中的标识符由字母、数字、下划线或美元符号组成,且必须以字母、下划线(_)或美元符号($)开头。规则总结如下:
不合法的标识符,如下图所示:
虽然Java的语法允许使用下划线(_)和美元符号($)作为标识符的开始,但是在很多企业的开发规范中约定,不能使用这两者作为标识符的开始,以达到统一标识符格式,减少歧义的效果。
企业的开发规范也称为编程规约,是企业在生产实践过程中总结出来的编程规则或建议,主要起到提高代码规范性和安全性,减少程序异常和漏洞的作用。后续在介绍Java标准语法的同时,也会适当加入对企业编程规约的介绍,作为实际编码的行为参考。
3.1.2 关键字和保留字
关键字和保留字是Java语言中具有特殊含义的单词或符号。关键字是Java语言本身定义的,用于表示特定的语法结构和操作,不能用作标识符(如变量名、类名等)。Java语言共有50个关键字,如下所示:
abstract continue for new switch
assert default if package synchronized
boolean do goto private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
这些关键字具有固定的语法含义,不能被用作变量名或其他标识符。保留字是指被保留但目前未被使用的关键字,它们在Java语言中没有特定的功能,但为了保留未来可能使用的关键字而被保留。开发者在编写代码时应避免使用关键字作为标识符,以免引发编译错误或语法混淆。
3.2.1 变量的声明
变量是Java程序中的基本存储单元,它的作用是用来存储数据。变量本质上代表了内存中的一个存储的区域,这个区域里的数据在同一数据类型中可以不断的变化。通过变量可以方便的读取和操作该区域中的数据。变量的内存示意图如下所示:
因此,可以理解为:变量就是指代在内存中开辟的存储空间,用于存放运算过程中需要用到的数据。
在Java中,需要先声明一个变量,才能使用这个变量。变量的声明包含两点:变量的数据类型和变量名,语法格式如下:
数据类型 变量名;
数据类型可以是Java的任意数据类型之一;变量名即变量的名称,用于存储变量值。
例如:
int a;
char b;
上述代码中的第一行声明了一个变量a,它的数据类型是int;第二行声明了一个变量b,它的数据类型是char。关于数据类型,将在下一小节中详细介绍。
变量的声明主要注意:
可以同时声明多个同一数据类型的变量,变量之间用“,”隔开,例如:
int c,d,e;
等同于:
int c;
int d;
int e;
在上述操作中,并没有声明变量的值,这里相当于没有指定该变量代表的存储空间,如下图所示:
3.2.2 变量的初始化
Java语法规定:变量在使用之前必须初始化,即必须给该变量赋予特定的值。
变量的第一次赋值即对变量的初始化。在Java中,使用等号(=)实现变量的赋值。
变量的初始化有以下两种方式:
1、在声明变量时,同时对变量进行初始化,语法如下:
数据类型 变量名 = 初始值;
例如:
int f = 5;
2、第一次使用变量前,对变量进行初始化,语法如下:
数据类型 变量名;
……
变量名 = 初始值;
例如:
int sum; // 声明变量sum
System.out.println(sum); // 报错,不能使用未赋值的变量
sum = 100; // 给变量sum赋值
System.out.println(sum); // 正确,输出100
3.2.3 变量的访问
变量在声明和初始化后,可以对变量进行访问,包括读取变量的值和修改变量的值。代码如下:
int sum = 100; // 声明变量sum
System.out.println(sum); // 输出变量的值 -> 100
sum = 200; // 修改变量sum的值
System.out.println(sum); // 再次输出变量的值 -> 200
变量的访问应注意以下几个方面:
1、变量的操作必须与类型匹配
变量在声明时指定了类型,Java编译器会检测对该变量的操作是否与其他类型匹配,如果对变量的赋值或者操作与其类型不匹配,会产生编译错误,例如:
//编译错误,变量a的类型为int整型,不能赋值为浮点类型的值
int a = 3.14;
2、变量的数据类型只写一次
变量在第一次声明的时候写数据类型,再次使用时不写数据类型,例如:
int n;
n = 5; // 正确,再次使用变量n时不写数据类型
int n = 10; // 再次指定变量的数据类型会出现编译错误
3、未经声明的变量不能使用
变量必须先声明,否则会出现编译错误,例如:
k=5;
System.out.println(p); // 编译错误,变量没有声明
4、变量初始化后才可以使用
声明一个变量,必须初始化后才能使用,例如:
int t;
System.out.println(t); // 变量t没有初始化,出现编译错误
3.3.1数据类型分类
Java是一门强类型的编程语言,所有的变量必须显示声明数据类型,在Java中定义了许多数据类型,根据数据的特点,Java的数据类型分为两大类:基本数据类型和引用数据类型。
Java中数据类型分类如下图所示:
Java基本数据类型包括4类8种。4类分别是整数类型、浮点数类型、字符类型和布尔类型。
引用类型是指除基本数据类型以外的所有类型,包括类、接口、数组、枚举等,会在后续的章节中具体介绍。
3.3.2 整数类型
Java中整数类型包括:byte、short、int 和long型,它们之间的区别仅仅是宽度和范围的不同。
例如,一个byte类型的变量代表的值占用1个字节的内存空间(8位),能够表示的10进制整数数据范围是负128到正127,包含0。一个int类型的变量代表的值占用4个字节的内存空间(32)位,能够表示的10进制整数数据范围是负2147483648到正2147483647,包含0。一个int类型的变量的值也可以是负128到正127的任意整数,但是相对于使用byte类型的变量,会额外占用3个字节的内存空间。示意图如下所示:
整型数据使用时必须先声明,在声明时也可以赋初值。如果例如:
byte a = 7;
short b= 128;
int c = 7;
在内存资源非常有限或对计算效率要求非常高的应用场景中,根据准备存储的数据的大小,选择占用内存空间最小的数据类型是很有意义的。反之,在资源较为充裕的应用场景中,一般使用int类型来存储整数,仅当需要存储超过int访问的整数时,再使用long类型。
整数类型的宽度和范围如下所示:
3.3.3 浮点类型
浮点类型主要用来储存小数数值,也可以用来储存范围较大的整数。它分为单精度浮点数(float)和双精度浮点数(double)两种,双精度浮点数比单精度浮点数所使用的内存空间更大,可表示的数值范围与精确度也比较大。
这里需要注意,Java中的浮点型底层使用IEEE 754(二进制浮点算术标准)来存储变量的值。因此,虽然float和int都是占用4个字节的内存空间,但是float能表示的整数范围远大于int类型。
浮点类型的宽度和范围如下所示:
浮点类型需使用float和double关键字,也可以在声明时赋初值。例如:
float a = 7.5F;
double b= 123.6D;
3.3.4 字符类型
字符类型表示单个字符,Java中的字符类型变量使用char关键字进行声明,而字符型字面量必须用单引号括起来,例如:char c = 'A';
Java字符采用双字节Unicode编码,占两个字节(16位),最高位不是符号位,没有负数的char。可用十六进制编码形式表示,它们的表现形式是\un,其中n为16位十六进制数,例如:'A'字符也可以用Unicode编码'\u0041'表示,前缀u表示Unicode编码。双字节Unicode的存储范围在\u0000~\uFFFF,char类型取值范围0~216 -1(0~65535)。
有些字符(例如回车换行符)不能通过键盘输入到字符串或程序中,这时就需要使用转义字符常量来表示一些特殊字符,前面要加上反斜杠(\)。常见的转义符的含义如下所示:
3.3.5 布尔类型
布尔类型在Java语言中使用关键字boolean 声明,它只有两个字面量:true和false。与C语言不同,Java不允许使用0或非0的整数来代替true和false,也不能将其他基本数据类型的值直接转换为布尔类型。布尔类型用于判断逻辑条件的结果,通常在程序的分支和循环控制语句中使用,根据逻辑判断的结果来决定程序的执行流程。
例如:
boolean isBig = true;
boolean isSmall = false;
如果试图给它们赋值true 和false之外的常量,如下所示:
boolean isBig = 1;
boolean isSmall = 'a';
则将发生类型不匹配的编译错误。
3.3.6 字符串类型
字符串类型是Java中用于存储多个字符的数据类型,使用String关键字声明字符串变量。例如:
String str = "abc";
String不是基本数据类型,而是Java中的引用数据类型。理解String的概念、原理和使用方法需要一些面向对象的知识,因此对String的详细介绍通常在后续文章中进行。在这里简要介绍String是因为字符串字面量是程序中最常见的字面量类型之一,初学者容易将字符串类型与基本数据类型char混淆。需要强调两点:
3.3.7 字面量
字面量(Literal)是计算机科学中用于表示源代码中固定值的表示法。几乎所有的编程语言都支持基本值的字面量表示,例如整数、浮点数和字符串。同时,很多编程语言也支持布尔类型和字符类型的字面量表示。甚至一些语言还支持枚举类型的元素以及复合类型(如数组、结构体和对象)的字面量表示。
在Java中,字面量指的是直接出现在源代码中的值。例如:
int c = 7; // 其中7是一个字面量
System.out.println(128); // 其中128是一个字面量
3.3.8 字面量的数据类型
在Java中,整数型字面量默认为int类型。如果在整数型字面量后面显式添加大写字母L(推荐)或小写字母l,则该字面量的类型为long。例如:
System.out.println(128L); // 其中128是一个`long`类型的字面量
在Java中,浮点型字面量的默认类型为double。如果想要表示一个float类型的字面量,需要在字面量后面显式添加大写字母F或小写字母f。例如:
System.out.println(3.14F); // 其中3.14是一个`float`类型的字面量
字符串字面量使用双引号引用,字符字面量使用单引号引用。在引号中只能包含一个字符。例如:
String str = "Hello"; // "Hello"是一个字符串字面量
char ch = 'A'; // 'A'是一个字符字面量
字面量是编程中常见且重要的概念,它们直接表示了固定的值。在编写代码时,我们经常使用字面量来初始化变量、传递参数等。
3.3.9【案例】测试最大最小值
新建类,并编写代码,测试不同数据类型的最大最小值:
案例示意代码如下:
package day01;
public class Scope {
public static void main(String[] args) {
//整型测试 byte short int long
//定义变量记录最大值 最小值
//数据类型 数据名 数据值
byte max = Byte.MAX_VALUE;
byte min = Byte.MIN_VALUE;
System.out.println(max);//127
System.out.println(min);//-128
short smax = Short.MAX_VALUE;
short smin = Short.MIN_VALUE;
System.out.println(smax);//32767
System.out.println(smin);//-32768
int imax = Integer.MAX_VALUE;
int imin = Integer.MIN_VALUE;
System.out.println(imax);//2147483647
System.out.println(imin);//-2147483648
long lmax = Long.MAX_VALUE;
long lmin = Long.MIN_VALUE;
System.out.println(lmax);//9223372036854775807
System.out.println(lmin);//-9223372036854775808
//浮点型 float double
float fmax = Float.MAX_VALUE;
float fmin = Float.MIN_VALUE;
System.out.println(fmax);//3.4028235E38
System.out.println(fmin);//1.4E-45
double dmax = Double.MAX_VALUE;
double dmin = Double.MIN_VALUE;
System.out.println(dmax);//1.7976931348623157E308
System.out.println(dmin);//4.9E-324
//布尔类型boolean
boolean b = false;
boolean b2 = true;
//字符型char
char c = 'a';//可以存一个字符
char c2 = 128;//可以存一个数字
char c3 = '中';//可以存一个汉字
System.out.println(c);
//char类型可以存数字,但是在打印时,会去查ascii码表,把这个数字对应着的字符是什么拿出来使用。
//ascii码表里只规定过来数字0-127对应着的字符,128-65535默认按照字符空格处理
System.out.println(c2);//输出一个空格
System.out.println(c3);
}
}
程序运行结果,如下图所示:
3.3.10【案例】存储输出学生信息
下面是一个使用基本类型存储学生信息并输出的Java案例:
public class StudentInformation {
public static void main(String[] args) {
// 学生信息
int studentId = 12345;
String studentName = "赵镇";
int age = 20;
double score = 92.5;
char gender = '男';
boolean isMarried = false;
// 输出学生信息
System.out.println("学生信息:");
System.out.println("学号:" + studentId);
System.out.println("姓名:" + studentName);
System.out.println("年龄:" + age);
System.out.println("成绩:" + score);
System.out.println("性别:" + gender);
System.out.println("婚否:" + isMarried);
}
}
在这个案例中,我们使用了基本类型来存储学生的学号、姓名、年龄、成绩、性别和婚否信息。性别使用了char类型来表示,而婚否使用了boolean类型来表示。然后通过使用System.out.println方法来输出学生的各项信息。请根据实际情况修改学生信息的值,然后运行程序,即可输出相应的学生信息。
3.3.11 经典面试问题:Java基本类型
Java的基本数据类型可以分为以下四类八种:
3.4.1 自动类型转换
在Java中,将小范围数据转换为大范围数据的过程称为自动数据类型转换,也被称为"隐式数据类型转换"。这种转换是自动发生的,不需要明确的语法说明。
由于大范围类型的取值范围覆盖了小范围类型,所以小类型的数据可以自动转换为大范围的数字。这就好比将小物体放入大口袋中一样。Java支持以下类型的自动类型转换:
这些自动类型转换的规则是Java编译器根据数据类型的取值范围来判断的。当进行自动类型转换时,编译器会自动将小范围类型的数据转换为大范围类型,保证数据不会丢失。char类型比较特殊,char自动转换为int、long、float和double,但byte和short不能自动转换为char,而且char也不能自动转换为byte或short。
自动类型转换是Java语言中一个重要的特性,它方便了数据的处理和计算,减少了类型转换的繁琐工作。
3.4.2【案例】测试自动类型转换
编写代码,测试自动类型转换。代码如下所示:
int i = 5;
long l = i; //自动类型转换 int -> long
float f = 3.4F;
double d = f;
double x = 3+4.5; //整数3自动转换为double类型
3.4.3强制类型转换
在Java中,当我们需要将一个变量从大范围转换为小范围时,无法自动完成类型转换,需要使用强制类型转换运算符来完成。由于大类型的范围超过小类型,大类型在小类型范围内的数据可以成功转换,但是超过小类型范围的数据转换时会发生溢出和精度损失。因此,在进行强制类型转换时存在一定的风险。
强制类型转换可以通过将要转换的变量放在括号后,并在括号加上目标类型来实现。例如:
double d = 3.14159;
int i = (int) d; // 强制将double类型转换为int类型
需要注意的是,由于强制类型转换可能导致数据溢出和精度损失,因此在进行转换之前,需要合理评估数据的范围,确保转换不会导致数据丢失或失真。
强制类型转换应该谨慎使用,只在确保转换不会导致数据问题的情况下使用。在实际编程中,建议尽量避免过于频繁地进行强制类型转换,保持数据的准确性和精度。
3.4.4【案例】测试强制类型转换
编写代码,测试强制类型转换。代码如下所示:
package day01;
public class ForcedConversion {
public static void main(String[] args) {
short s1 = 120;
byte b1 = (byte)s1; // 范围内的数据,可以转换成功
System.out.println(b1);
short s2 = 150;
byte b2 = (byte)s2; //超过有效范围,会发生溢出问题
System.out.println(b2);
long l1 = 12389;
int i1 = (int)l1; // 范围内的数据,可以转换成功
System.out.println(i1);
long l2 = 238923332233L;
int i2 = (int)l2; //超过有效范围,会发生溢出问题
System.out.println(i2);
double d1 = 2.5;
float f1 = (float)d1;// 范围内的数据,可以转换成功
System.out.println(f1);
double d2 = 1.0/3;
float f2 = (float)d2; //会发精度损失
System.out.println(f2);
double d3 = 4333.28832;
long l3 = (long)d3; //保留整数部分
System.out.println(l3);
}
}