- 参考书:《Java语言程序设计与数据结构(基础篇)》—— 梁勇
文章目录
一、基础概念
(1)Java语言规范、JDK、JRE、JVM、IDE
-
Java语言规范:是对Java语言语法和语义的技术定义
-
Java的三个版本
-
J2SE/JavaSE【Java的标准版本】
- 基础,无论是以后走EE还是ME,SE是必须要精通的。
- J2SE是SUN公司为java程序员准备的一套“基础类库”,这套基础类库学习之后,可以完成最基本的操作
- 例如,文件的读写、线程的控制…
-
J2EE/JavaEE【Java的企业版本】
- 这是SUN公司为程序员专门准备的一套“类库”,这套类库可以协助程序员完成企业级软件的开发
- 企业级软件:OA办公系统、进销存系统、超市系统…
-
J2ME/JavaME【Java的微型版本】
- 这是SUN公司为java程序员专门准备的另一套“类库”,这套类库可以协助程序员完成微型设备的嵌入式开发,
- Java最初就是做微型设备嵌入式开发的。
-
-
JDK(Java开发工具包):JDK由一组程序组成,由Oracle配合每个Java版本提供,包括编译器、调试器和其它工具。每个程序都是从命令行调用的,用于编译、运行和测试Java程序
-
JRE(Java的运行时环境):运行Java程序的程序。它包括Java虚拟机JVM、Java核心类库和支持文件。
-
JVM(Java虚拟机):JVM是一个解释Java字节码的程序。
.java
后缀的java源文件经过编译成为.class
后缀的java字节码文件,这可以用JVM解释执行。在不同的平台上有不同的JVM,他们都能解释.class
文件,这就实现了跨平台特性,即 “一次编译,到处执行” -
IDE(集成开发环境):一个图形界面软件,把程序编辑、编译、构建、调试等集中在一起,便于快速开发程序。如Eclipse、NetBeans等
(2)Java的加载与执行
- 程序员在
xxx.java
文件中编写源代码,源代码必须符合java的语法,这些源代码就是高级语言。存放源代码的文件被称为Java源文件。 - 使用JDK中自带的javac.exe命令对以上的java源程序进行编译。DOS命令:
javac 源文件路径
。如果语法没问题,编译通过,生成字节码文件xxx.class
- 源文件路径可以是绝对路径,也可以是相对路径。
- 编译之后,其实java源文件删除不会影响程序的执行。
- 最好不要将java源文件删除,因为程序最终运行效果不是预期效果的时候,需要重新修改java源代码,然后进行重新编译生成全新的class字节码文件,再重新运行字节码程序。
- 在一个安装了JVM的平台上,利用java.exe命令解释运行java字节码。DOS命令:
java 类名
- 这个类名是源文件中public class的名字
- 以上程序的执行原理:
- java.exe命令执行会启动JVM
- JVM启动之后,马上启动“类加载器-Class Loader”
- ClassLoader负责去硬盘的“某个位置”上搜索“类名.class”字节码文件。
- 找不到这个.class文件,一定会出现程序异常现象。
- 找到了这个.class文件之后将.class文件转换成"二进制",操作系统可以直接识别二进制,操作系统执行二进制码和底层的硬件平台进行交互。
(3)java中的源文件名、类名和main方法
- 一个java源文件当中可以定义多个class
- 一个java源文件当中public的class不是必须的
- 一个class定义在编译后生成一个xxx.class字节码文件(如果一个源文件中定义了多个class,就会生成多个字节码文件)
- 一个java源文件中,最多定义一个
public class
- 如果定义了
public class
,该类名称必须和java源文件名称一致。如果此源文件中有main
方法,也必须放在这个public class
里 - 如果没有定义
public class
,则不必要求类名和源文件同名。如果有main方法,可以任意放在某个类中
- 如果定义了
main
方法是程序的入口,每一个class当中都可以编写main方法。- 想执行X.class当中的main方法:
java X
- 如果执行命令
java X
,而X.class
中没有main方法,会出现运行阶段的错误。 - 同一个java源文件的不同类中可以包含多个
main
方法。当JVM进行编译时,会提示选择其中一个main方法作为编译的入口。
- 想执行X.class当中的main方法:
(4)关于packet
- 包PACKET 就是一个文件夹,包下的CLASS互相访问如一个文件。
- java 编译器在编译时,直接根据package指定的信息直接将生成的class 文件生成到对应目录下。例如package aaa.bbb.ccc 编译器就将该 .java 文件下的各个类生成到 /aaa/bbb/ccc/ 这个目录下。
- 可以把Java中的一个package(包)看成一个类库单元,包内包含有一组类,它们在单一的名称空间之下被组织在了一起,这个名称空间就是包名。
- 带package的java编译与不带package的java编译
二、基础语法规范
(1)java中的标识符
- 标识符必须由字母、数字、下划线、美元符号($)组成
- 标识符不能以数字开头
- 标识符不能是保留字
- 标识符不能是true/false/null
- 标识符可以是任意长度
(2)良好的命名习惯
- 变量/方法:小驼峰 carName
- 类名:大驼峰 CarName
- 常量:全大写 CAR_NAME
(3)java支持的数据类型
- int / double / byte / short / long / float / char / boolean
- byte:8位有符号数
- short:16位有符号数
- int:32位有符号数
- long:64位有符号数
- float:32位标准IEEE754
- double:64位标准IEEE754
- boolean:取值 true 或 false
(4)显示表示数据类型
- 表示二进制:加
前缀0b
或0B
- 表示十六进制:加
前缀0x
或0X
- 浮点数加
后缀f/F
:指出是float型,如3.0f - 浮点数加
后缀d/D
:指出是double型(默认是这个) ,如3.0d
(5)常量
- 用
final
修饰变量定义语句,类似C中const
final double PI = 3.1415926;
(6)基本操作
1. 用Scanner从控制台读取输入
-
System.out
用来表示标准输出设备;
System.in
用来表示标准输入设备; -
创建一个
Scanner
类对象来读取来自System.in
的输入,如:
Scanner input = new Scanner(System.in);
- Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,它判断读取结束的标示是 空白符,比如空格,回车,tab 等等
- Scanner类在
包java.util
中- 明确导入:
import java.util.Scanner
(导入java.util包中的Scanner类) - 通配导入:
import java.util.*
(导入java.util包中的所有类)- 注意:除非代码中用到了某个类,否则通配导入中的其他类不会在编译运行时被读入,所以性能上没什么区别
- 明确导入:
- Scanner中的方法:
-
.nextByte()
:返回一个byte数据 -
.nextShort()
:返回一个Short数据 -
.nextInt()
:返回一个int数据 -
.nextLong()
:… -
.nextFloat()
:… -
.nextDouble()
:… -
.next()
:返回一个字符串,读到第一个空白符结束,不读空白符 -
.nextLine()
:返回一个字符串,读到回车结束,回车也读走,但是返回的字符串中无回车
-
double r = input.nextDouble();
2. 向控制台输出
- 四种常见输出形式
System.out.println(1111); //换行打印
System.out.print(1111); //不换行打印
System.out.write(2222); //字节输出
System.out.printf("%+8.3f\n", 3.14);//按格式输出
- 引用自:Java的常用输入输出语句
- System.out.println(); 是最常用的输出语句,它会把括号里的内容转换成字符串输出到输出窗口(控制台),并且换行,当输出的是一个基本数据类型时,会自动转换成字符串,如果输出的是一个对象,会自动调用对象的toString();方法,将返回值输出到控制台
- System.out.print(); 与第一个很相似,区别就是上一个输出后会换行,而这个命令输出后并不换行。
- System.out.printf(); 这个方法延续了C语言的输出方式,通过格式化文本和参数列表输出
3. 基本运算
+ - * / % += -= ++ --
和C的特性一样- 其中对负数进行
%
计算,相当于对正数用%再取负数 - 对整形进行
/
运算,舍去小数部分
- 其中对负数进行
- 幂运算:用
Math.pow(a,b)
计算a的b次方。pow
方法定义在JAVA API中的Math类
中,可以直接用
4. 类型转换
- 显式数字间直接强制转换:
double y = 3/4.0; //自动转为 3.0/4.0
int x = 3
double z = x*4.5; //自动转为 3.0*4.5
- 强制类型转换:
(int)1.7 = 1
(double)1/2 = 1.0/2 = 0.5
- 利用类型转换进行四舍五入:
- 四舍五入到整数:
(int)(x+0.5)
- 向上四舍五入保留两位:
(int)(x*100+0.5)/100.0
- 向下四舍五入保留两位:
(int)(x*100)/100.0
- 四舍五入到整数:
5. 赋值语句
- 赋值时必须数据类型一致,不能自动类型转换
- 特殊的赋值
//以下两种写法等价
System.out.println(x=1); // 1
x = 1 // 2
System.out.println(x);
//以下两种写法等价
i = j = k = 1; // 1
k = 1 // 2
j = k
i = j