第1章 Java概述
1.1 Java语言发展历史(记关键点)
Java诞生于SUN(Stanford University Network),09年SUN被Oracle(甲骨文)收购。
Java之父是詹姆斯.高斯林(James Gosling)。
1996年发布JDK1.0版。大约26年。
目前最新的版本是Java21。
1.2 Java语言特点(后面需要关注和体会)
(1)优点
-
面向对象:Java语言支持封装、继承、多态,面向对象编程,让程序更好达到
高内聚
,低耦合
的标准。 -
支持分布式:Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
-
健壮型:Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。
-
安全性高:Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。如:安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查。
-
跨平台性:Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。
(2)缺点
-
语法过于复杂,严谨,对程序员的约束比较多,与python和php等相比入门相对较难。但是一旦学会了,就业岗位需求量大,而且薪资待遇节节攀升。
-
一般适用于大型网站开发,整个架构会比较重,对于初创公司开发和维护人员的成本比较高(即薪资高),选择用Java语言开发网站或应用系统的需要一定的经济实力。
1.3 Java语言跨平台原理
1、Java语言跨平台原理
很多时候,我们写的程序可能要在**多个**操作系统运行,这个时候就要求我们的程序需要在尽可能**不改动**的情况下完实现这个目标。不同的语言实现**跨平台**的方式不同。Java语言实现跨平台是建立在“**虚拟机**”基础之上的。 Java设计了一套简洁的虚拟指令集,也就是**字节码**。如果我们想要在一台机器上运行Java程序,只需要将Java程序**编译**成字节码就可以了。**编写**一个将Java程序翻译成Java字节码的**编译器**,比起编写一个将Java程序翻译成x86_64指令集的编译器来说,要简单得多。可是这里产生了一个问题,难道我们的机器可以直接执行字节码这样的虚拟指令集吗?当然是不能的。我们需要针对不同的指令集,开发对应的字节码解释器。这个工作同样比较简单。
Java虚拟机(JVM,Java Virtual Machine)是由软件技术**模拟**出计算机运行的一个**虚拟**的计算机,它负责解释执行字节码指令集。也就是说,只要一台机器可以运行Java的虚拟机,那么就能运行Java语言编写的程序。而不同的平台,需要安装不同的**Java虚拟机程序**。那么我们**编写**完Java程序之后,需要先将.java的源文件**编译**为.class的字节码文件,然后在Java虚拟机中来**执行**这些字节码文件。
Java虚拟机的设计不仅仅解决了Java程序跨平台的问题,同时解决了很多语言的跨平台问题。
-
.NET(C#,VB等语言)也有虚拟机,也能实现跨平台,但是只能在Windows操作系统下安装.NET环境。
-
C++不受虚拟机的限制,但是需要用不同平台的编译器重新编译一次。需要编写n个版本的编译器。
-
Java虚拟机可以配置在MacOS,Windows(PC操作系统),Linux等上,但是不能配置在WP(Windows Phone),IOS(移动操作系统)上,只能配置在android(移动操作系统)。Java程序可以实现一次编译处处运行。
2、JVM、JRE、JDK的关系
-
JVM(Java Virtual Machine ):Java虚拟机,是运行所有Java程序的假想计算机,是Java程序的运行环境之一,也是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在JVM 之上。
-
JRE (Java Runtime Environment) :是Java程序的运行时环境,包含
JVM
和运行时所需要的核心类库
。 -
JDK (Java Development's Kit):是Java程序开发工具包,包含
JRE
和开发人员使用的工具。
我们想要运行一个已有的Java程序,那么只需安装JRE
即可。
我们想要开发一个全新的Java程序,那么必须安装JDK
,其内部包含JRE
。
1.4 Java语言开发环境
1、JDK的下载
-
下载网址:www.oracle.com
2、JDK的安装
-
安装步骤:
-
双击
jdk-8u202-windows-x64.exe
文件,并单击下一步
,如图所示: -
取消独立JRE的安装,单击
公共JRE前的下拉列表
,选择此功能将不可用
如图所示: -
修改安装路径,单击更改,如图所示:
-
将安装路径修改为
D:\develop\Java\jdk1.8.0_202\
,并单击确定,如图所示: -
单击下一步,如图所示:
-
稍后几秒,安装完成,如图所示:
-
目录结构,如图所示:
-
3、配置环境变量
为什么配置path?
希望在命令行使用javac.exe等工具时,任意目录下都可以找到这个工具所在的目录。
例如:我们在C:\Users\Irene目录下使用java命令,结果如下:
我们不可能每次使用java.exe,javac.exe等工具的时候都进入到JDK的安装目录下,太麻烦了。我们希望在任意目录下都可以使用JDK的bin目录的开发工具,因此我们需要告诉操作系统去哪里找这些开发工具,这就需要配置path环境变量。
配置 JAVA_HOME+Path
-
步骤:
-
打开桌面上的计算机,进入后在左侧找到
计算机
,单击鼠标右键
,选择属性
,如图所示: -
选择
高级系统设置
,如图所示: -
在
高级
选项卡,单击环境变量
,如图所示: -
在
系统变量
中,单击新建
,创建新的环境变量,如图所示: -
变量名输入
JAVA_HOME
,变量值输入安装路径D:\develop\Java\jdk1.8.0_202
,并单击确定
,如图所示: -
选中
Path
环境变量,双击
或者点击编辑
,如图所示: -
点击新建,键入
%JAVA_HOME%\bin
,最后点击确定 。如图所示: -
环境变量配置完成,重新开启DOS命令行,在任意目录下输入
javac
命令,运行成功。
-
1.5 HelloWorld
1.5.1 开发说明
1、程序开发步骤说明
JDK安装完毕,可以开发我们第一个Java程序了。
Java程序开发三步骤:编写、编译、运行。
2、编写Java源程序保存.java源文件
-
在电脑中目录新建文本文件,完整的文件名修改为
HelloWorld.java
,其中文件名为HelloWorld
,后缀名必须为.java。 -
用vscode文本编辑器打开(虽然是记事本也可以,但是不够没有关键字颜色标识,不利于初学者学习)
-
在文件中输入如下代码,并且保存:
public class HelloWorld { public static void main(String[] args) { System.out.println("HelloWorld"); } }
友情提示:
每个字母和符号必须与示例代码一模一样。
第一个HelloWord
源程序就编写完成了,但是这个文件是程序员编写的,JVM是看不懂的,也就不能运行,因此我们必须将编写好的Java源文件
编译成JVM可以看懂的字节码文件
,也就是.class文件。
3、编译Java源文件生成.class字节码文件
在DOS命令行中,进入 目录,使用javac
命令进行编译。
方式一:使用文件资源管理器打开目录,然后在地址栏输入cmd。
方式二:在vscode软件的文件菜单-->在集中终端中打开-->命令行
命令:
javac Java源文件名.后缀名
举例:
javac HelloWorld.java
编译成功后,命令行没有任何提示。打开D:\atguigu\javaee\JavaSE20190624\code\day01_code
目录,发现产生了一个新的文件 HelloWorld.class
,该文件就是编译后的文件,是Java的可运行文件,称为字节码文件,有了字节码文件,就可以运行程序了。
Java源文件的编译工具
javac.exe
4、运行Java程序
在DOS命令行中,在字节码文件目录下,使用java
命令进行运行。
命令:
java 主类名
主类是指包含main方法的类,main方法是Java程序的入口:
public static void main(String[] args){
}
举例:
java HelloWorld
友情提示:
java HelloWord 不要写 不要写 不要写 .class
Java字节码文件的运行工具:java.exe
1.5.2 常见错误
1、书写错误
-
单词拼写问题
-
正确:class 错误:Class
-
正确:String 错误:string
-
正确:System 错误:system
-
正确:main 错误:mian Java语言是一门严格区分大小写的语言 标点符号使用问题
-
不能用中文符号,英文半角的标点符号(正确)
-
括号问题,成对出现
-
2、Java程序的结构与格式
结构:
类{
方法{
语句;
}
}
格式:
(1)每一级缩进一个Tab键
(2){}的左半部分在行尾,右半部分单独一行,与和它成对的"{"的行首对齐
3、字符编码问题
当cmd命令行窗口的字符编码与.java源文件的字符编码不一致,如何解决?
解决方案一:
在vscode编辑器中,修改源文件的字符编码
解决方案二:
在使用javac命令式,可以指定源文件的字符编码
javac -encoding utf-8 HelloWorld.java
4、大小写问题
(1)源文件名:
在Windows操作系统中.java的源文件名不区分大小写,我们建议大家养成区分大小写的习惯。
(2)字节码文件名与类名
严格区分大小写
(3)代码中
严格区分大小写
5、源文件名与类名一致问题?
(1)源文件名是否必须与类名一致?public呢?
如果这个类不是public,那么源文件名可以和类名不一致。但是不便于代码维护。 如果这个类是public,那么要求源文件名必须与类名一致。否则编译报错。 我们建议大家,不管是否是public,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为了好维护。
(2)一个源文件中是否可以有多个类?public呢?
一个源文件中可以有多个类,编译后会生成多个.class字节码文件。 但是一个源文件只能有一个public的类。
(3)main方法必须在public的类中吗?
不是。 但是后面写代码时,基本上main方法(主方法)习惯上都在public类中。
第2章 Java基础语法
2.1 注释
-
注释:就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,是十分必须要的,它不影响程序的编译和运行。
-
Java中有
单行注释
、多行注释
和文档注释
-
单行注释以
//
开头,以换行
结束,格式如下:// 注释内容
-
多行注释以
/*
开头,以*/
结束,格式如下:/* 注释内容 */
-
文档注释以
/**
开头,以*/
结束,Java特有的注释,结合/** 注释内容 */
-
//单行注释
/*
多行注释
*/
/**
文档注释演示
@author Lee
*/
public class Comments{
/**
Java程序的入口
@param String[] args main方法的命令参数
*/
public static void main(String[] args){
System.out.println("hello");
}
}
常见的几个注释:
-
@author 标明开发该类模块的作者,多个作者之间使用,分割
-
@version 标明该类模块的版本
-
@see 参考转向,也就是相关主题
-
@since 从哪个版本开始增加的
-
@param 对方法中某参数的说明,如果没有参数就不能写(后面再学)
-
@return 对方法返回值的说明,如果方法的返回值类型是void就不能写(后面再学)
-
@throws/@exception 对方法可能抛出的异常进行说明 ,如果方法没有用throws显式抛出的异常就不能写(后面再学)
使用javadoc工具可以基于文档注释生成API文档。
用法: javadoc [options] [packagenames] [sourcefiles] [@files]
例如:
javadoc -author -d doc HelloWorld.java
2.2 关键字
关键字:是指在程序中,Java已经定义好的单词,具有特殊含义。
-
HelloWorld案例中,出现的关键字有
public
、class
、static
、void
等,这些单词已经被Java定义好 -
关键字的特点:全部都是
小写字母
。 -
关键字比较多,不需要死记硬背,学到哪里记到哪里即可。
关键字一共50个,其中const和goto是保留字。
true,false,null看起来像关键字,但从技术角度,它们是特殊的布尔值和空值。
2.3 标识符
简单的说,凡是程序员自己命名的部分都可以称为标识符。
即给类、变量、方法、包等命名的字符序列,称为标识符。
1、标识符的命名规则(必须遵守的硬性规则)
(1)Java的标识符只能使用26个英文字母大小写,0-9的数字,下划线_,美元符号$
(2)不能使用Java的关键字(包含保留字)和特殊值
(3)数字不能开头
(4)不能包含空格
(5)严格区分大小写
2、标识符的命名规范(建议遵守的软性规则,否则容易被鄙视和淘汰)
(1)见名知意
(2)类名、接口名等:每个单词的首字母都大写,形式:XxxYyyZzz,
例如:HelloWorld,String,System等
(3)变量、方法名等:从第二个单词开始首字母大写,其余字母小写,形式:xxxYyyZzz,
例如:age,name,bookName,main
(4)包名等:每一个单词都小写,单词之间使用点.分割,形式:xxx.yyy.zzz,
例如:java.lang
(5)常量名等:每一个单词都大写,单词之间使用下划线_分割,形式:XXX_YYY_ZZZ,
例如:MAX_VALUE,PI
更多细节详见《Java开发手册(泰山版)》
2.4 初识数据类型
Java的数据类型分为两大类:
-
基本数据类型:包括
整数
、浮点数
、字符
、布尔
。 -
引用数据类型:包括
数组
、类
、接口
、枚举
、注解
。
2.5 常量值
-
常量值:在程序执行的过程中,其值不可以发生改变
-
常量值的分类:
类型 举例 整数常量值 12,-23, 1567844444557L 浮点常量值 12.34F,12.34 字符常量值 ‘a’,'0',‘尚’ 布尔常量值 true,false 字符串常量值 ”HelloWorld“
-
整数常量值,超过int范围的必须加L或l(小写L)
-
小数常量值,无论多少,不加F,就是double类型。要表示float类型,必须加F或f
-
char常量值,必须使用单引号
-
String字符串常量值,必须使用双引号
/*
常量值:
代码里面写死的,固定不变的。
一目了然的值。
整数常量值:1 或 1L
小数常量值:1.5 或 1.5F
单字符常量值:'a'
布尔型常量值:true,false
字符串常量值:"hello"
*/
public class ConstantValue{
public static void main(String[] args){
System.out.println(1);//识别为int
System.out.println(1L);//识别为long,数字后面加L或l
System.out.println(1.5);//识别为double
System.out.println(1.5F);//识别为float类型,数字后面加F或f
System.out.println('a');//识别为char类型,单引号
System.out.println(true);//识别为boolean类型
System.out.println(false);//识别为boolean类型
System.out.println("helloworld");//识别为String类型,双引号
System.out.println("1");//识别为String类型,双引号
}
}
2.6 变量
2.6.1 变量的概念
变量:在程序执行的过程中,其值可以发生改变的量
变量的作用:用来存储数据,代表内存的一块存储区域,这块内存中的值是可以改变的。
2.6.2 变量的声明
数据类型 变量名;
例如:
//存储一个整数类型的年龄
int age;
//存储一个小数类型的体重
double weight;
//存储一个单字符类型的性别
char gender;
//存储一个布尔类型的婚姻状态
boolean marry;
//存储一个字符串类型的姓名
String name;
//声明多个同类型的变量
int a,b,c; //表示a,b,c三个变量都是int类型。
注意:变量的数据类型可以是基本数据类型,也可以是引用数据类型。
2.6.3 变量的赋值
给变量赋值,就是把“值”存到该变量代表的内存空间中。
1、变量赋值的语法格式
变量名 = 值;
-
给变量赋值,变量名必须在=左边,值必须在=右边
-
给变量赋的值类型必须与变量声明的类型一致或兼容(<=)
2、可以使用合适类型的常量值给变量赋值
int age = 40;
double weight = 126.4;
char gender = '女';
boolean marry = true;
String name = "小明";
long类型:如果赋值的常量整数超过int范围,那么需要在数字后面加L。
float类型:如果赋值为常量小数,那么需要在小数后面加F。
char类型:使用单引号''
String类型:使用双引号""
3、可以使用其他变量或者表达式给变量赋值
int m = 1;
int n = m;
int x = 1;
int y = 2;
int z = 2 * x + y;
2.6.4 变量值的输出
//输出变量的值
System.out.println(age);
//输出变量的值
System.out.println("年龄:" + age);
System.out.println("age:" + age);
System.out.println("name" + name + ",age = " + age + ",gender = " + gender + ",weight = " + weight + ",marry = " + marry);
如果()中有多项内容,那么必须使用 + 连接起来
如果某些内容想要原样输出,就用""引起来,而要输出变量中的内容,则不要把变量名用""引起来
2.6.5 变量可以反复赋值
-
变量的第一次赋值称为初始化;
-
变量的再赋值称为修改变量的值;
//先声明,后初始化
char gender;
gender = '女';
//声明的同时初始化
int age = 18;
System.out.println("age = " + age);///age = 18
//给变量重新赋值,修改age变量的值
age = 19;
System.out.println("age = " + age);//age = 19
2.6.6 变量的三要素
1、数据类型
-
变量的数据类型决定了在内存中开辟多大空间
-
变量的数据类型也决定了该变量可以存什么值
2、变量名
-
见名知意非常重要
-
给这块内存区域赋值,例如:我们现在在”XX科技园“,我们住的校区叫做”新芒果春天“
3、值
-
基本数据类型的变量:存储数据值
-
引用数据类型的变量:存储地址值,即对象的首地址。例如:String类型的变量存储的是字符串对象的首地址(关于对象后面章节再详细讲解)
2.6.7 变量的使用应该注意什么?
1、先声明后使用
如果没有声明,会报“找不到符号”错误
2、在使用之前必须初始化
如果没有初始化,会报“未初始化”错误
3、变量有作用域
如果超过作用域,也会报“找不到符号”错误
4、在同一个作用域中不能重名
5、变量值的类型必须与变量声明的类型一致或兼容(<=)
一致:一样
int age = 18; 18是int类型的常量值,age也是int类型
int = int
兼容:可以装的下,=右边的值要 小于等于 =左边的变量类型
long bigNum =18; 18是int类型的常量值,bigNum是long类型
int < long
int age = 18L; 错误 18L是long类型的常量值,age是int类型
long > int
2.6.8 练习
public class MyInfo{
public static void main(String[] args){
//存储姓名用String类型
//=左边是变量名,右边是常量值,给变量赋值
String name = "好谷";
System.out.println("name");//原样显示字符串常量值"name"
System.out.println(name);//把变量name中的值输出
int age = 40;
char gender = '女';
double weight = 148.5;
boolean marry = true;
System.out.println(age);
System.out.println(gender);
System.out.println(weight);
System.out.println(marry);
System.out.println("----------------");
// + 表示拼接,把"姓名:"字符串常量 和name字符串变量的值,拼接起来,构成一个字符串值
System.out.println("姓名:" + name);
System.out.println("name=" + name);
//System.out.println("姓名:",name);//错误
System.out.println("----------------");
System.out.println("name" + name + ",age = " + age + ",gender = " + gender + ",weight = " + weight + ",marry = " + marry);
}
}
2.7 最终变量/常量(final)
最终变量习惯上也称为常量,因为它是通过在声明变量的数据类型前面加final的方式实现的,所以叫最终变量。加final修饰后,这个变量的值就不能修改了,一开始赋值多少,就是多少,所以此时的变量名通常称为常量名。常量名通常所有字母都大写,每一个单词之间使用下划线分割,从命名上和变量名区分开来。
这样做的好处,就是可以见名知意,便于维护。
public class FinalVariableDemo {
public static void main(String[] args){
//定义常量
final int FULL_MARK = 100;//满分
// FULL_MARK = 150;//错误,final修饰的变量,是常量,不能重新赋值
//输出常量值
System.out.println("满分:" + FULL_MARK);
//小好的成绩比满分少1分
int hao = FULL_MARK - 1;
//小谷得了满分
int gu = FULL_MARK;
//小李得了一半分
int lee = FULL_MARK/2;
//输出变量值
System.out.println("小好成绩:" + hao);
System.out.println("小古成绩:" + gu);
System.out.println("小李成绩:" + lee);
}
}