JAVA教程
前言
JAVA的三大版本
JAVA最大的特点:
Java的主要优势在于其做出的WORA:即一次编写(Write Once)、随处运行(Run Anywhere)。简 单来讲,这意味着开发团队能够利用Java编写一款应用程序,并将其编译为可执行形式,而后将其运行 在任何支持Java的平台之上。这显然能够极大提高编程工作的实际效率,这种优势来源于Java Virtual Machine(JAVA虚拟机的缩写),JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在 实际的计算机上仿真模拟各种计算机功能来实现的。JAVA语言的一个非常重要的特点就是与平台的无关 性,而使用Java虚拟机是实现这一特点的关键。
JAVA的三大版本:
- JAVA SE:它是JAVA的标准版,是整个JAVA的基础和核心,这是我们主要学习的一个部分,也是 JAVAEE和JAVAME技术的基础,主要用于开发桌面应用程序。学会后可以做一些简单的桌面应用 如:扫雷,连连看等。
- JAVA ME:它是JAVA的微缩版,主要应用于嵌入式开发,比如手机程序的开发。目前来说就业范围 不是很广,在一些城市可能相对的不好找工作。
- JAVA EE:也叫JAVA的企业版,它提供了企业级应用开发的完整解决方案,比如开发网站,还有企 业的一些应用系统,是JAVA技术应用最广泛的领域。主要还是偏向于WEB的开发,而JAVA EE的基 础就是JAVA SE,所以我们在学习JAVA SE的时候,基础一定要打好,因为这是最基本的,也是最核 心的。
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代码的效率。这样就实现了跨平台、可移植的功能。
- . JVM是指在一台计算机上由软件或硬件模拟的计算机;它类似一个小巧而高效的CPU。
- byte-code代码是与平台无关的是虚拟机的机器指令。
- . java字节代码运行的两种方式:
- 方式interpreter(解释)
- Just-in-time(即时编译):由代码生成器将字节代码转换成本机的机器代码,然后可以以较高速度执行。
- JAVA的跨平台实现的核心是不同平台使用不同的虚拟机 不同的操作系统有不同的虚拟机。
- Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处 运行”
编写 Java 程序时,应注意以下几点:
- 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
- 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首 字母应该大写,例如 MyFirstJavaClass 。
- 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字 母大写。
- 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错 误)。
- 主方法入口:所有的 Java 程序由
public static void main(String []args)
方法开始执行。
JAVA程序运行机制
计算机的高级编程语言类型: 编译型 ,解释型. Java 语言是两种类型的结合;
1 | //从字面上看,“编译”和“解释”的确都有“翻译”的意思,它们的区别则在于翻译的时机安排不大一样。 |
第一步:编译
利用编译器(javac)源程序编译成字节码,字节码文件名:源文件名.class
第二步:运行
利用虚拟机(解释器,java)解释执行class字节码文件。
JAVA基础
注释
注释并不会被执行,是给我们写代码的人看的,书写注释是一个非常好的习惯,在很多大公司都是强制 要求各位去进行编写注释!。
我们来看一下Java中的注释怎么写,看以下代码:
java中的注释有三种:
单行注释:
只能注释当前行, 以//
开始,知道行结束
1 | //输出HelloWorld |
多行注释:
注释一段文字,以/*
开始,*/
结束!
1 | /* |
文档注释:
用于生产API文档, 配合javaDoc
1 | /* |
注意:
平时写代码一定要注意注释的规范性,一个好的程序员,一定是有非常良好的编码习惯 的,我希望大家能够从小事开始锻炼自己的行为习惯!
标识符
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 | public static void main(String[] args) { |
数据类型
强弱类型语言
强类型语言也称为强类型定义语言。
- 要求变量的使用要严格符合规定,所有变量都必须先定义后才能使 用。 Java、.NET、C++等都是强制类型定义的。
- 也就是说,一旦一个变量被指定了某个数据类型,如果 不经过转换,那么它就永远是这个数据类型了。
- 安全性高,运行效率相对较慢,鱼和熊掌不可兼得!强类型定义语言在速度上可能略逊色于弱类型定义 语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。
弱类型语言也称为弱类型定义语言。
- 与强类型定义相反。像vb,php等就属于弱类型语言·
- 在VBScript中,可以将字符串‘12’和整数3进行连接得到字符串‘123’,也可以把它看成整数123,而不需 要显示转换。是不是十分的随便,我们Java就不是这样的。
- 但其实它们的类型没有改变,VB只是在判断出一个表达式含有不同类型的变量之后,自动在这些变 量前加了一个clong()或(int)()这样的转换函数而已。能做到这一点其实是归功于VB的编译器的 智能化而已,这并非是VB语言本身的长处或短处
JAVA的数据类型
java的数据类型分为两大类: **基本类型(primitive type) **和 引用类型(reference type)
如果你看到这一堆头疼的话,没关系,不用记,JDK中类型对应的包装类都帮忙写好了,我们需要时候可 以直接看到!可以把以下代码拷贝进行查看结果:
1 | public static void main(String[] args) { |
科普字节相关知识
- 位(bit):是计算机 内部数据 储存的最小单位,11001100是一个八位二进制数。
- 字节(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 | 1bit表示1位, |
整型拓展
在我们计算机中存在很多进制问题,十进制,八进制,十六进制等等的问题,他们怎么表示呢?
- 十进制整数,如:99, -500, 0。
- 八进制整数,要求以 0 开头,如:015。
- 十六进制数,要求 0x 或 0X 开头,如:0x15 。
- 二进制整数, 0b开头
1 | //整型 |
在实际开发和学习中,如果遇到特别长的数字,读懂它令人头疼!JDK7为我们提供了下划线分隔符,可 以按照自己的习惯进行分割。
1 | int b = 1_2234_5678; |
我们很容易就知道这是1亿2234万5678啦! 非常符合国人的习惯!
1 | public static void main(String[] args) { |
浮点型拓展
提问: 银行金融业务用的什么类型表示?
浮点类型float, double的数据不适合在不容许舍入误差的金融计算领域。
如果需要进行不产生舍入误差的精确数字计算,需要使用
BigDecimal
类。
由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很 多数字无法精确表示,其结果只能是接近,但不等于;
大数值:Java.math
下面的两个有用的类:BigInteger
和BigDecimal
,这两个类可以处理任意长度的数 值。BigInteger
实现了任意精度的整数运算。BigDecimal
实现了任意精度的浮点运算。
用法可以自行百度搜索
浮点数使用总结:
- 默认是double
- 浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。
- 避免比较中使用浮点数
字符型拓展
单引号用来表示字符常量。例如‘A’是一个字符,它与“A”是不同的,“A”表示一个字符串。
char 类型用来表示在Unicode编码表中的字符。.
Unicode编码被设计用来处理各种语言的所有文字,它占2个字节,可允许有65536个字符;
【科普:2字节=16位, 2的16次方=65536,我们用的Excel原来就只有这么多行,并不是无限的】
演示:
1 | public static void main(String[] args) { |
Unicode具有从0到65535之间的编码,他们通常用从’u0000’到’uFFFF’之间的十六进制值来表示(前缀为 u表示Unicode)
1 | char c3 = '\u0061'; |
Java 语言中还允许使用转义字符 ‘’ 来将其后的字符转变为其它的含义,有如下常用转义字符:
布尔型拓展
boolean类型(一位,不是一个字节),就是0 | 1 ,boolean类型有两个值,true和false,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。
类型转换
由于Java是强类型语言,所以要进行有些运算的时候的,需要用到类型转换。
整型、实型(常量)、字符型数据可以混合运算。
运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级(根据容量来看)。
1 | 低 ------------------------------------> 高 |
数据类型转换必须满足如下规则:
- 不能对boolean类型进行类型转换。
- 不能把对象类型转换成不相关类的对象。
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。 转
- 换过程中可能导致溢出或损失精度,例如:
1 | int i =128; |
因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
1 | (int)23.7 == 23; |
自动类型转换
自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型。
例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为 32,可以自动转换为64位的double类型
1 | public class ZiDongLeiZhuan{ |
强制类型转换
强制类型转换,又被称为造型,用于显式的转换一个数值的类型.
在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
强制类型转换的语法格式:(type)var
,运算符“()”中的type表示将值var想要转换成的目标数据类 型。 条件是转换的数据类型必须是兼容的。
1 | public static void main(String[] args) { |
当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同 的值,溢出。
1 | public static void main(String[] args) { |
【Java语言的整型常数默认为int型,浮点数默认是Double】