Java诞生于SUN(Stanford University Network),09年SUN被Oracle(甲骨文)收购。
Java之父是詹姆斯.高斯林(James Gosling)。
1996年发布JDK1.0版。大约26年。
目前最新的版本是Java21。
(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语言开发网站或应用系统的需要一定的经济实力。
很多时候,我们写的程序可能要在**多个**操作系统运行,这个时候就要求我们的程序需要在尽可能**不改动**的情况下完实现这个目标。不同的语言实现**跨平台**的方式不同。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程序可以实现一次编译处处运行。
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。

下载网址:www.oracle.com
安装步骤:
双击jdk-8u202-windows-x64.exe文件,并单击下一步,如图所示:

取消独立JRE的安装,单击公共JRE前的下拉列表,选择此功能将不可用如图所示:

修改安装路径,单击更改,如图所示:

将安装路径修改为D:\develop\Java\jdk1.8.0_202\,并单击确定,如图所示:

单击下一步,如图所示:

稍后几秒,安装完成,如图所示:

目录结构,如图所示:

希望在命令行使用javac.exe等工具时,任意目录下都可以找到这个工具所在的目录。
例如:我们在C:\Users\Irene目录下使用java命令,结果如下:

我们不可能每次使用java.exe,javac.exe等工具的时候都进入到JDK的安装目录下,太麻烦了。我们希望在任意目录下都可以使用JDK的bin目录的开发工具,因此我们需要告诉操作系统去哪里找这些开发工具,这就需要配置path环境变量。
步骤:
打开桌面上的计算机,进入后在左侧找到计算机,单击鼠标右键,选择属性,如图所示:

选择高级系统设置,如图所示:

在高级选项卡,单击环境变量,如图所示:

在系统变量中,单击新建 ,创建新的环境变量,如图所示:

变量名输入JAVA_HOME,变量值输入安装路径 D:\develop\Java\jdk1.8.0_202 ,并单击确定,如图所示:

选中Path 环境变量,双击或者点击编辑 ,如图所示:

点击新建,键入%JAVA_HOME%\bin,最后点击确定 。如图所示:

环境变量配置完成,重新开启DOS命令行,在任意目录下输入javac 命令,运行成功。

JDK安装完毕,可以开发我们第一个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文件。
在DOS命令行中,进入 目录,使用javac 命令进行编译。
方式一:使用文件资源管理器打开目录,然后在地址栏输入cmd。

方式二:在vscode软件的文件菜单-->在集中终端中打开-->命令行

命令:
javac Java源文件名.后缀名
举例:
javac HelloWorld.java

编译成功后,命令行没有任何提示。打开D:\atguigu\javaee\JavaSE20190624\code\day01_code目录,发现产生了一个新的文件 HelloWorld.class,该文件就是编译后的文件,是Java的可运行文件,称为字节码文件,有了字节码文件,就可以运行程序了。
Java源文件的编译工具
javac.exe
在DOS命令行中,在字节码文件目录下,使用java 命令进行运行。
命令:
java 主类名
主类是指包含main方法的类,main方法是Java程序的入口:
- public static void main(String[] args){
-
- }
举例:
java HelloWorld
友情提示:
java HelloWord 不要写 不要写 不要写 .class

Java字节码文件的运行工具:java.exe
单词拼写问题
正确:class 错误:Class
正确:String 错误:string
正确:System 错误:system
正确:main 错误:mian Java语言是一门严格区分大小写的语言 标点符号使用问题
不能用中文符号,英文半角的标点符号(正确)
括号问题,成对出现
结构:
- 类{
- 方法{
- 语句;
- }
- }
格式:
(1)每一级缩进一个Tab键
(2){}的左半部分在行尾,右半部分单独一行,与和它成对的"{"的行首对齐
当cmd命令行窗口的字符编码与.java源文件的字符编码不一致,如何解决?

解决方案一:
在vscode编辑器中,修改源文件的字符编码

解决方案二:
在使用javac命令式,可以指定源文件的字符编码
javac -encoding utf-8 HelloWorld.java
(1)源文件名:
在Windows操作系统中.java的源文件名不区分大小写,我们建议大家养成区分大小写的习惯。
(2)字节码文件名与类名
严格区分大小写
(3)代码中
严格区分大小写
(1)源文件名是否必须与类名一致?public呢?
如果这个类不是public,那么源文件名可以和类名不一致。但是不便于代码维护。 如果这个类是public,那么要求源文件名必须与类名一致。否则编译报错。 我们建议大家,不管是否是public,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为了好维护。
(2)一个源文件中是否可以有多个类?public呢?
一个源文件中可以有多个类,编译后会生成多个.class字节码文件。 但是一个源文件只能有一个public的类。
(3)main方法必须在public的类中吗?
不是。 但是后面写代码时,基本上main方法(主方法)习惯上都在public类中。
注释:就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,是十分必须要的,它不影响程序的编译和运行。
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
关键字:是指在程序中,Java已经定义好的单词,具有特殊含义。
HelloWorld案例中,出现的关键字有 public 、class 、 static 、 void 等,这些单词已经被Java定义好
关键字的特点:全部都是小写字母。
关键字比较多,不需要死记硬背,学到哪里记到哪里即可。

关键字一共50个,其中const和goto是保留字。
true,false,null看起来像关键字,但从技术角度,它们是特殊的布尔值和空值。
简单的说,凡是程序员自己命名的部分都可以称为标识符。
即给类、变量、方法、包等命名的字符序列,称为标识符。
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开发手册(泰山版)》
Java的数据类型分为两大类:
基本数据类型:包括 整数、浮点数、字符、布尔。
引用数据类型:包括数组、 类、接口、枚举、注解。

常量值:在程序执行的过程中,其值不可以发生改变
常量值的分类:
| 类型 | 举例 |
|---|---|
| 整数常量值 | 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类型,双引号
-
- }
- }
变量:在程序执行的过程中,其值可以发生改变的量
变量的作用:用来存储数据,代表内存的一块存储区域,这块内存中的值是可以改变的。
- 数据类型 变量名;
- 例如:
- //存储一个整数类型的年龄
- int age;
-
- //存储一个小数类型的体重
- double weight;
-
- //存储一个单字符类型的性别
- char gender;
-
- //存储一个布尔类型的婚姻状态
- boolean marry;
-
- //存储一个字符串类型的姓名
- String name;
-
- //声明多个同类型的变量
- int a,b,c; //表示a,b,c三个变量都是int类型。
注意:变量的数据类型可以是基本数据类型,也可以是引用数据类型。
给变量赋值,就是把“值”存到该变量代表的内存空间中。
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;
- //输出变量的值
- 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);
如果()中有多项内容,那么必须使用 + 连接起来
如果某些内容想要原样输出,就用""引起来,而要输出变量中的内容,则不要把变量名用""引起来
变量的第一次赋值称为初始化;
变量的再赋值称为修改变量的值;
- //先声明,后初始化
- char gender;
- gender = '女';
-
- //声明的同时初始化
- int age = 18;
- System.out.println("age = " + age);///age = 18
-
- //给变量重新赋值,修改age变量的值
- age = 19;
- System.out.println("age = " + age);//age = 19
1、数据类型
变量的数据类型决定了在内存中开辟多大空间
变量的数据类型也决定了该变量可以存什么值
2、变量名
见名知意非常重要
给这块内存区域赋值,例如:我们现在在”XX科技园“,我们住的校区叫做”新芒果春天“
3、值
基本数据类型的变量:存储数据值
引用数据类型的变量:存储地址值,即对象的首地址。例如:String类型的变量存储的是字符串对象的首地址(关于对象后面章节再详细讲解)
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
- 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);
-
- }
- }
最终变量习惯上也称为常量,因为它是通过在声明变量的数据类型前面加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);
- }
- }