前言

JAVA的三大版本

JAVA最大的特点:

Java的主要优势在于其做出的WORA:即一次编写(Write Once)、随处运行(Run Anywhere)。简 单来讲,这意味着开发团队能够利用Java编写一款应用程序,并将其编译为可执行形式,而后将其运行 在任何支持Java的平台之上。这显然能够极大提高编程工作的实际效率,这种优势来源于Java Virtual Machine(JAVA虚拟机的缩写),JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在 实际的计算机上仿真模拟各种计算机功能来实现的。JAVA语言的一个非常重要的特点就是与平台的无关 性,而使用Java虚拟机是实现这一特点的关键。

JAVA的三大版本:

  1. JAVA SE:它是JAVA的标准版,是整个JAVA的基础和核心,这是我们主要学习的一个部分,也是 JAVAEE和JAVAME技术的基础,主要用于开发桌面应用程序。学会后可以做一些简单的桌面应用 如:扫雷,连连看等。
  2. JAVA ME:它是JAVA的微缩版,主要应用于嵌入式开发,比如手机程序的开发。目前来说就业范围 不是很广,在一些城市可能相对的不好找工作。
  3. JAVA EE:也叫JAVA的企业版,它提供了企业级应用开发的完整解决方案,比如开发网站,还有企 业的一些应用系统,是JAVA技术应用最广泛的领域。主要还是偏向于WEB的开发,而JAVA EE的基 础就是JAVA SE,所以我们在学习JAVA SE的时候,基础一定要打好,因为这是最基本的,也是最核 心的。

p1.png (3840×2160) (wuzhentao.com)

JDK 和 KRE

**JDK: **

Java 2 SDK (Development Kit)包含:JRE的超集,包含编译器和调试器等用于程序开发的文件

JRE:

Java Runtime Environment (JRE) 包含:Java虚拟机、库函数、运行Java应用程序和Applet所必须文件

Java运行环境的三项主要功能:

  • 加载代码: 由class loader完成
  • 校验代码:由bytecode verifier 完成;
  • 执行代码:由 runtime interpreter完成。

区别和联系

sdk(也就是jdk)是jre的超集,是在jre的基础上增加了编译器及其他一些开发工具。

jre就是java运行时环境,包括了jvm和其它一些java核心api,任何一台电脑,只有安装了jre才可以运行 java程序.

如果只是要运行JAVA程序,之需要JRE就可以。

JRE通常非常小,也包含了JVM. 如果要开发JAVA程序,就需要安装JDK。

初时JVM(JAVA Virtual Machine)

JVM是一种规范,可以使用软件来实现,也可以使用硬件来实现,就是一个虚拟的用于执行bytecodes 字节码的计算机。他也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。

JVM负责将java字节码解释运行,边解释边运行,这样,速度就会受到一定的影响。JAVA提供了另一种 解释运行的方法JIT(just in time),可以一次解释完,再运行特定平台上的机器码,高级的JIT可以只能 分析热点代码,并将这些代码转成本地机器码,并将结果缓存起来,下次直接从内存中调用,这样就大 大提高了执行JAVA代码的效率。这样就实现了跨平台、可移植的功能。

  1. . JVM是指在一台计算机上由软件或硬件模拟的计算机;它类似一个小巧而高效的CPU。
  2. byte-code代码是与平台无关的是虚拟机的机器指令。
  3. . java字节代码运行的两种方式:
  • 方式interpreter(解释)
  • Just-in-time(即时编译):由代码生成器将字节代码转换成本机的机器代码,然后可以以较高速度执行。
  • JAVA的跨平台实现的核心是不同平台使用不同的虚拟机 不同的操作系统有不同的虚拟机。
  • Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处 运行”

编写 Java 程序时,应注意以下几点:

  • 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
  • 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首 字母应该大写,例如 MyFirstJavaClass 。
  • 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字 母大写。
  • 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错 误)。
  • 主方法入口:所有的 Java 程序由 public static void main(String []args) 方法开始执行。

JAVA程序运行机制

计算机的高级编程语言类型: 编译型 ,解释型. Java 语言是两种类型的结合;

1
2
3
4
5
6
7
8
9
10
11
//从字面上看,“编译”和“解释”的确都有“翻译”的意思,它们的区别则在于翻译的时机安排不大一样。

//我们先看看编译型:有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器Compiler)。就类似于把一本中文书直接翻译成英文版进行出售。

//现在再看看解释型:打个比方:假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读(编译型);或者,你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。(解释型)

//编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/ObjectPascal(Delphi)、VB等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python等等。

//Java语言虽然比较接近解释型语言的特征,但在执行之前已经预先进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执行。它既保留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比“纯解释型”程序要快许多。

//总之,随着设计技术与硬件的不断发展,编译型与解释型两种方式的界限正在不断变得模糊。

第一步:编译

利用编译器(javac)源程序编译成字节码,字节码文件名:源文件名.class

第二步:运行

利用虚拟机(解释器,java)解释执行class字节码文件。

JAVA基础

注释

注释并不会被执行,是给我们写代码的人看的,书写注释是一个非常好的习惯,在很多大公司都是强制 要求各位去进行编写注释!。

我们来看一下Java中的注释怎么写,看以下代码:

java中的注释有三种:

单行注释:

只能注释当前行, 以//开始,知道行结束

1
//输出HelloWorld

多行注释:

注释一段文字,以/*开始,*/结束!

1
2
3
4
/*
多行
注释
*/

文档注释:

用于生产API文档, 配合javaDoc

1
2
3
4
/*
* @Description HelloWorld类
* @Author Diamond 吴稳健QQ:1023217219
**/

注意:

平时写代码一定要注意注释的规范性,一个好的程序员,一定是有非常良好的编码习惯 的,我希望大家能够从小事开始锻炼自己的行为习惯!

标识符

JAVA自己定义好的关键字

abstract assert boolean break byte
case catch char class const
continue default do double else
for goto long if goto
native public void try switch
new int this finally return

还有很多就不一一赘述了,这些关键字也不需要刻意去记忆,只需要知道我们不能拿关键字当作变量名使用就行了

JAVA所有组成部分都需要名字,类名、变量名以及方法名都被称为标识符

表示类名的标识符单词第一个字母用大写

1
如:Man,CoodMan

表示方法和变量的表示符用驼峰命名法

1
如:eatFood()

关于Java标识符,有以下几点需要注意

  • 所有标识符都应该以字母(A-Z或者a-z), 美元符($), 或者下划线( _ )开始
  • 不能用关键字
  • 对大小写敏感
  • 合法标识符举例:age、$salary、_value、__1_value
  • 非法标识符举例: 123abc、-salary、#abc

注意:

JAVA不采用通常语言使用的ASCII字符集, 而是使用unicode这样的标准国际字符集. 因此可以使用中文命名,但是一般不建议这样去做, 也不建议使用拼音, 很Low

1
2
3
4
public static void main(String[] args) {
String 王者荣耀 = "最强王者";
System.out.println(王者荣耀);
}

数据类型

强弱类型语言

  1. 强类型语言也称为强类型定义语言。

    • 要求变量的使用要严格符合规定,所有变量都必须先定义后才能使 用。 Java、.NET、C++等都是强制类型定义的。
    • 也就是说,一旦一个变量被指定了某个数据类型,如果 不经过转换,那么它就永远是这个数据类型了。
    • 安全性高,运行效率相对较慢,鱼和熊掌不可兼得!强类型定义语言在速度上可能略逊色于弱类型定义 语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。
  2. 弱类型语言也称为弱类型定义语言。

    • 与强类型定义相反。像vb,php等就属于弱类型语言·
    • 在VBScript中,可以将字符串‘12’和整数3进行连接得到字符串‘123’,也可以把它看成整数123,而不需 要显示转换。是不是十分的随便,我们Java就不是这样的。
    • 但其实它们的类型没有改变,VB只是在判断出一个表达式含有不同类型的变量之后,自动在这些变 量前加了一个clong()或(int)()这样的转换函数而已。能做到这一点其实是归功于VB的编译器的 智能化而已,这并非是VB语言本身的长处或短处

JAVA的数据类型

java的数据类型分为两大类: **基本类型(primitive type) **和 引用类型(reference type)

image-20230317142835617

image-20230317142846262

如果你看到这一堆头疼的话,没关系,不用记,JDK中类型对应的包装类都帮忙写好了,我们需要时候可 以直接看到!可以把以下代码拷贝进行查看结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public static void main(String[] args) {
// byte
System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
System.out.println("包装类:java.lang.Byte");
System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
System.out.println();

// short
System.out.println("基本类型:short 二进制位数:" + Short.SIZE);
System.out.println("包装类:java.lang.Short");
System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
System.out.println();

// int
System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
System.out.println("包装类:java.lang.Integer");
System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println();

// long
System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
System.out.println("包装类:java.lang.Long");
System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();

// float
System.out.println("基本类型:float 二进制位数:" + Float.SIZE);
System.out.println("包装类:java.lang.Float");
System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
System.out.println();

// double
System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
System.out.println("包装类:java.lang.Double");
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();

// char
System.out.println("基本类型:char 二进制位数:" + Character.SIZE);
System.out.println("包装类:java.lang.Character");
// 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
System.out.println("最小值:Character.MIN_VALUE="
+ (int) Character.MIN_VALUE);
// 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
System.out.println("最大值:Character.MAX_VALUE="
+ (int) Character.MAX_VALUE);

科普字节相关知识

  1. 位(bit):是计算机 内部数据 储存的最小单位,11001100是一个八位二进制数。
  2. 字节(byte):是计算机中 数据处理 的基本单位,习惯上用大写 B 来表示, 1B(byte,字节)= 8bit(位) 字符:是指计算机中使用的字母、数字、字和符号

ASCIIS码:

  • 1个英文字母(不分大小写)= 1个字节的空间
  • 1个中文汉字 = 2个字节的空间
  • 1个ASCII码 = 一个字节

UTF-8编码:

  • 1个英文字符 = 1个字节

  • 英文标点 = 1个字节

  • 1个中文(含繁体) = 3个字节

  • 中文标点 = 3个字节

Unicode编码:

  • 1个英文字符 = 2个字节
  • 英文标点 = 2个字节
  • 1个中文(含繁体) = 2个字节
  • 中文标点 = 2个字节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1bit表示1位, 

1Byte表示一个字节 1B=8b。

1024B=1KB 1024KB=1M

1024M=1G.
32位操作系统只可以使用32位的cpu,而64位的CPU既可以安装32位操作系统也可以安装64位操作系统。

寻址能力简单点说就是支持的内存大小能力,64位系统最多可以支达128 GB的内存,而32位系统最多只可以支持4G内存。

32位操作系统只可以安装使用32位架构设计的软件,而64位的CPU既可以安装使用32位软件也可以安装使用64位软件。

现在的电脑都是64位了!

整型拓展

在我们计算机中存在很多进制问题,十进制,八进制,十六进制等等的问题,他们怎么表示呢?

  1. 十进制整数,如:99, -500, 0。
  2. 八进制整数,要求以 0 开头,如:015。
  3. 十六进制数,要求 0x 或 0X 开头,如:0x15 。
  4. 二进制整数, 0b开头
1
2
3
4
5
6
7
8
9
//整型
int i=10;
int i2=010;
int i3=0x10;
int i4 = 0b0101
System.out.println(i); //10
System.out.println(i2); //8
System.out.println(i3); //16
System.out.println(i4); //5

在实际开发和学习中,如果遇到特别长的数字,读懂它令人头疼!JDK7为我们提供了下划线分隔符,可 以按照自己的习惯进行分割。

1
int b = 1_2234_5678;

我们很容易就知道这是1亿2234万5678啦! 非常符合国人的习惯!

1
2
3
4
5
6
public static void main(String[] args) {
int a = 0b0101;
int b = 1_2345_7893;
System.out.println(a); //5
System.out.println(b); //123457893
}

浮点型拓展

提问: 银行金融业务用的什么类型表示?

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

  • 如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。

由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很 多数字无法精确表示,其结果只能是接近,但不等于;

大数值Java.math下面的两个有用的类:BigIntegerBigDecimal,这两个类可以处理任意长度的数 值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。

用法可以自行百度搜索

浮点数使用总结:

  1. 默认是double
  2. 浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。
  3. 避免比较中使用浮点数

字符型拓展

单引号用来表示字符常量。例如‘A’是一个字符,它与“A”是不同的,“A”表示一个字符串。

char 类型用来表示在Unicode编码表中的字符。.

Unicode编码被设计用来处理各种语言的所有文字,它占2个字节,可允许有65536个字符;

【科普:2字节=16位, 2的16次方=65536,我们用的Excel原来就只有这么多行,并不是无限的】

演示:

1
2
3
4
5
6
7
8
public static void main(String[] args) {
char c1 = 'a';
char c2 = '中';
System.out.println(c1);
System.out.println((int) c1); //97
System.out.println(c2);
System.out.println((int) c2); //20013
}

Unicode具有从0到65535之间的编码,他们通常用从’u0000’到’uFFFF’之间的十六进制值来表示(前缀为 u表示Unicode)

1
2
char c3 = '\u0061';
System.out.println(c3); //a

Java 语言中还允许使用转义字符 ‘’ 来将其后的字符转变为其它的含义,有如下常用转义字符:

image-20230317144437604

布尔型拓展

boolean类型(一位,不是一个字节),就是0 | 1 ,boolean类型有两个值,true和false,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。

类型转换

由于Java是强类型语言,所以要进行有些运算的时候的,需要用到类型转换。

整型、实型(常量)、字符型数据可以混合运算。

运算中,不同类型的数据先转化为同一类型,然后进行运算。

转换从低级到高级(根据容量来看)。

1
2
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double

数据类型转换必须满足如下规则:

  • 不能对boolean类型进行类型转换。
  • 不能把对象类型转换成不相关类的对象。
  • 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。 转
  • 换过程中可能导致溢出或损失精度,例如:
1
2
int i =128;
byte b = (byte)i;

因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。

浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:

1
2
(int)23.7 == 23;
(int)-45.89f == -45

自动类型转换

自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型。

例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为 32,可以自动转换为64位的double类型

1
2
3
4
5
6
7
8
9
10
public class ZiDongLeiZhuan{
public static void main(String[] args){
char c1='a';//定义一个char类型
int i1 = c1;//char自动类型转换为int
System.out.println("char自动类型转换为int后的值等于"+i1);
char c2 = 'A';//定义一个char类型
int i2 = c2+1;//char 类型和 int 类型计算
System.out.println("char类型和int计算后的值等于"+i2);
}
}

强制类型转换

强制类型转换,又被称为造型,用于显式的转换一个数值的类型.

在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。

强制类型转换的语法格式:(type)var ,运算符“()”中的type表示将值var想要转换成的目标数据类 型。 条件是转换的数据类型必须是兼容的。

1
2
3
4
5
6
7
8
public static void main(String[] args) {
double x = 3.14;
int nx = (int)x; //值为3
char c = 'a';
int d = c+1;
System.out.println(d); //98
System.out.println((char)d); //b
}

当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同 的值,溢出。

1
2
3
4
5
public static void main(String[] args) {
int x = 300;
byte bx = (byte)x; //值为44
System.out.println(bx);
}

【Java语言的整型常数默认为int型,浮点数默认是Double】