一. Java运行机制及运行过程
1. java核心机制- java虚拟机 JVM java virtual machine
1.1 基本介绍
JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域,负责执行指令,,管理数据,内存,寄存器,包含在JDK中
对于不同的平台,有不同的虚拟机
java虚拟机机制屏蔽了底层运行平台的差别,实现了"一次编译,到处运行"

1.2. JDK
-
JDK 的全称 Java decelopment KIt java开发工具包,JDK=JRE+java开发工具 [java,javac,javadoc,javap等]
-
JDK 是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE,所以安装了JDK,就不用在单独安装JRE了
1.3.JRE
- JRE(Java Runtime Environment java 运行环境)
JRE = JVM +java 的核心类库(类)
- 包括java虚拟机和java程序所需的核心类库等,如果想要运行一个开发好的java程序,计算机中值需要安装JRE即可
1.4 JDK,JRE 和JVM 的包含关系
- JDK=JRE + 开发工具集(例如javac ,java编译工具等)
- JRE = JVM + Java SE标准类库(Java核心类库)
- 如果只想运行开发好的 .class文件 只需要JRE
二. java 快速入门
2.1. 使用Sublime Text 编写代码
1. 编写代码
java
public class Hello{
//编写一个main方法
public static void main(string[] args){
System.out.println("hellow,world");
}
}
-
public class Hello 表示Hello是一个类,是一个public 公有的类
-
hello { } 表示一个类的开始和结束
-
public static void main(String[] args) 表示一个主方法,即我们程序的入口
-
main() { } 表示方法的开始和结束
-
System.out.println("hellow,word"); 表示输出 hello,world 到屏幕
6 ; 表示语句结束
2. 通过终端javac 命令对该java文件进行编译,生成.class文件
javac Hello.java
3. 通过java命令对生成的class文件进行运行

windows: 文件有中文时, 如何处理
在文件 -> 设置文件编码 -> GBK 需要重新保存即可
2.2 什么是编译
Javac Hello.java
-
有了java源文件, 通过编译器将其编译成JVM可以识别的字节码文件
-
在该源文件目录下,通过javac编译工具对Hello.java文件进行编译
-
如果程序没有出错,没有任何提示,但在当前目录下会出现一个Hello.class文件,该文件成为字节码文件,也是可以执行的java的程序
2.3 什么是运行
-
有了可执行的java程序(Hello.class字节码文件)
-
通过运行工具java.exe 对字节码文件进行执行,本质就是.class装载到jvm机执行
Java程序开发注意事项:
对修改后的Hello.java 源文件需要重新编译,生成新的class文件后,再进行执行,才能生效
2.4 Java 开发注意事项和细节说明
-
Java源文件以 .java为扩展名. 源文件的基本组成部分是类 class,如本类中的Hello类
-
Java应用程序的执行入口是main()方法,它有固定的书写格式:
public static void main(String[] args){...}
- Java语言严格区分大小写
4, java方法由一条条语句构成,每个语句以 ":" 结束.
-
大括号都是成对出现的,缺一不可,习惯,先写{}在写代码
-
一个源文件中最多只能有一个public类,其它类的个数不限
-
如果源文件包含一个public类,则文件名必须按该类名命名!
-
一个源文件中最多只能有一个public类,其它类的个数不限,也可以将main方法写在非public类中,然后指定运行非public类,这样入口方法就是非public的main方法
三. java常用转义字符
- \t: 一个制表位,实现对齐的功能
- \n: 换行符
- \\ : 输出一个\
- \" : 输出一个"
- \' : 输出一个'
- \r : 一个回车
java
//演示转移字符的使用
public class ChangeChar{
//编写一个main方法
public static void main(String[] args){
// \t :一个制表位,实现对齐功能
System.out.println("北京\t天津\t上海");
// \n : 换行符
System.out.println("jack\nsmith\nmary");
// 输出\
System.out.println("C:\\s");
// 输出 双引号 " "
System.out.println("学习:\"java\"");
// 输出 单引号 ' '
System.out.println("学习:\'学习java\'");
// \r: 一个回车
System.out.println("韩顺平教育\r北京");
//解读
//1. 先输出韩顺平教育然后回车
//2. 回车后光标回到韩顺平教育前面
//3 输出北京,会把韩顺替换掉
System.out.println("书名\t作者\t价格\t销量\n三国\t罗 贯中");
}
}
四. 注释
4.1 单行注释 //
4.2 多行注释 /* */
4.3 文档注释
注释内容可以被JDK提供的工具 javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档,一般写在类
javascript
/**
* 这是类的注释
* @author wufeng
* @version 1.0
*/
public class Comment02 {
/**
* 主方法
* @param args 参数
*/
public static void main(String[] args) {
System.out.println("Hello");
}
}
运行命令
在当前目录新建 doc 文件夹,把所有javadoc文档全部生成进去
javadoc -d ./doc -author -version Comment02.java
生成文档

五. 代码规范
-
类,方法的注释,要以javadoc的方式来写
-
非java Doc的注释,往往是给代码的维护者看的,着重告述读者为什么这么写,如何修改,注意什么问题等
-
选中文本后,按 Tab 键整体向右移动缩进;按 Shift + Tab 键整体向左移动缩进。
-
运算符和 = 两边习惯性各加一个空格,比如: 2 + 4 * 5 + 345 - 89
-
源文件使用utf-8编码
-
行宽度不要超过80字符
-
代码编写次行风格和行尾风格

六. Windows DOS(命令)
Dos: Disk Operating System 磁盘操作系统
1.补充: 相对路径: 从当前目录开始定位,形成的一个路径
绝对路径: 从顶级目录D盘,开始定位形成的路径

需求: 从abc\test100 访问 hello.txt
相对路径: ..\..\abc2\test200\hello.txt
绝对路径: d:\abc2\test200\hello.txt
2.常用的dos命令
- 查看当前目录是有什么内容
(DOS) dir dir d:\abc2\test200
(Mac/Linux) ls /Users/你的用户名/abc2/test200
- 切换到其他盘下: 盘符号cd
(DOS) cd cd/D c:
(Mac/Linux) cd /Users/ 用户名 /abc2/test200
3, 切换到当前盘的其他目录下
DOS)
cd 文件夹名(Mac/Linux)
cd 文件夹名
- 切换到上一级
(DOS) cd..
(Mac/Linux) cd ..
- 切换到根目录
(DOS) cd
(Mac/Linux) cd /
- 查看指定的目录下所有的子集目录
(DOS) tree D:
(Mac/Linux) ls -R /Users/ 用户名
- 清屏
(DOS) cls
(Mac/Linux) clear
- 退出
(DOS) exit
(Mac/Linux) exit
七. 变量
变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)
1. 变量使用的基本步骤
声明变量 int a;
赋值 a=60; 把6赋值给a
通常是 int a=60;
打印 System.out.println(a);
2. 变量使用注意事项
-
变量表示内存中的一个存储区域[不同的变量,类型不同,占用的空间大小不同],比如int 4个字节,double 就是8个字节
-
该区域有自己的名称[变量名]和类型[数据类型]
-
变量必须先声明,后使用,就有顺序
-
该区域的数据可以在同一类型范围内不断变化
-
变量在同一个作用域内不能重名
-
变量=变量名+值+数据类型
3. 程序中 + 号的使用
- 当左右两边都是数值型时,则做加法运算
java
int a = 10;
int b = 20;
int res = a + b;
System.out.println(res); // 输出:30
- 当左右两边有一方为字符串,则做拼接运算
java
String name = "用户";
int age = 22;
String info = name + age;
System.out.println(info); // 输出:用户22
八. 数据类型
8.1 基本数据类型
1.整数类型
- byte 1字节 -128 ~ 217(取值范围)
- short 2字节 -32768 ~32768
- int 4字节 常用默认整型
- long 8字节 超大整数,结尾要加L
java
byte a =10;
short b = 10;
int c = 1000;
long d = 9999999999L
2. 浮点类型
- float 4字节 单精度,结尾加F
- double 8字节 双精度,小数默认用它
java
float f = 3.14F;
double d = 3.14159;
3. 字符类型
- char : 2字节,存单个字符,用单引号 ' '
java
char ch = 'A'
4.布尔类型
- boolean: 只有两个值true / false, 不能和数字互换
java
boolean flag = true;
boolean b = false;
8.2 引用数据类型
1.字符串String 保存一串文本字符 双引号"内容" 默认值: null
特点:
- 引用类型
- 一旦创建不可修改
-
- 号可以和任意类型做字符串拼接
2. 数组
| 类型 | 定义格式 | 作用 | 下标规则 | 默认值 |
|---|---|---|---|---|
| 数组 | 类型[] 数组名 |
存放同类型一组数据 | 从 0 开始 | 基本类型给 0 / 假,引用给 null |
分类:
- 基本类型数组: int[ ] byte[ ] double [ ]
- 引用类型数组: String [ ] 类名[ ]
java
int[] arr = {10,20,30};
String[] strArr = {"a","b","c"};
8.3.类 / 接口 / 抽象类
1. 类 class
| 类型 | 关键字 | 作用 | 创建对象方式 | 默认值 |
|---|---|---|---|---|
| 自定义类 | class |
封装属性和方法 | new 类名() |
成员变量默认 null |
java
//1. 定义普通类
class Person{
String name;
int age;
}
//使用
public class demo {
public static void main(String[] args){
// new 创建对象
Person p =new Person();
p.name = "张三";
p.age = 20;
System.out.println(p.name + p.age);
}
}
2. 接口(interface)
| 类型 | 关键字 | 作用 | 使用方式 |
|---|---|---|---|
| 接口 | interface |
定义行为规范、规则 | 类用 implements 实现 |
java
//1. 定义接口
interface Play {
//接口方法默认抽象
void game();
}
//2. 类实现接口
class Student implements Play{
@Override
public void game(){
System.out.println("学生玩游戏");
}
}
//使用
public class demo{
public static void main(String[] args){
Student s = new Student();
s.game();
}
}
3. 抽象类 (abstract class)
| 类型 | 关键字 | 作用 | 特点 |
|---|---|---|---|
| 抽象类 | abstract class |
半模板、有抽象方法 | 不能直接 new,只能被继承 |
java
// 1. 定义抽象类
abstract class Animal {
//抽象方法 : 没有方法体
public abstract void eat();
}
// 2.子类继承抽象类
class Cat extends Animal{
// 必须重写重写方法
@Override
public void eat(){
System.out.println("猫吃鱼");
}
}
//使用
public class demo{
public static void main(String[ ] args){
Cat c = new Cat();
c.eat();
}
}
九. 基本数据类型使用细节
9.1. 整数类型
- Java各整数类型有固定的范围和字段长度,不受具体操作系统的影响,以包整java程序的可移植性,
- Java的整型常量默认为int型,声明long型常量须加 'l' 或 'L'
- Java程序中变量常声明为int型,除非不足以表示大数,才使用long
- bit: 计算机中的最小存储单位, byte: 计算机中基本存储单位, 1byte = 8 bit
9.2. 浮点类型
- 与整数类型类似,Java浮点类型也有固定的范围和字段长度,不受具体OS的影响 [float 4个字节, double 是8个字节]
- Java的浮点型常量默认为double型,声明float型常量,须后加 'f' 或 'F'
- 浮点型常量有两种表示形式
十进制数形式: 如: 5.12 512.0f .512(必须有小数点)
科学计数法形式: 如: 5.12e2[ ] 5.12E-2 [ ] - 通常情况下,应该使用double型,因为它比float型更精确
double num9 = 2.1234567851;
float num1 = 2.1234567851F; - 浮点数使用陷阱: 2.7 和8.1 / 3 比较
double num11 = 2.7;
double num12 = 8.1 / 3;
System.out.println(number11); //1.7
System.out.println(num12); //接近2.7 2.6999999999999997
注意: 当我们对运算结果是小数的进行相等的判断时,要注意. 应该是以两个数的差值的绝对值,在某个精度范围类判断
正确写法 :
差值非常小,到我的规定精度,认为相等
if(Math. abs(num11 - num12) < 0.0000001){
}
System.out.println(Math.abs(num11 - num12)); //4.440892098500626E-16
9.3. 字符类型(char)
- 字符量是用单引号(' ')括起来的单个字符,例如: char c1 = 'a'; char c2 = '中'; char c3 = '9';
- java中还允许使用转移字符 '\' 来将其后的字符转变为特殊字符型常量, 例如: char c3 = '/n'; // '\n' 表示换行符
- 在java中,char的本质是一个整数,在输出时,是unicode码对应的字符
- 可以直接给char赋一个整数,然后输出时,会按照对应的unicode 字符输出
- char类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码
java
public class CharDemo {
public static void main(String[] args) {
// 1. 单引号括起来的 单个字符
char c1 = 'a';
// 2. 转义字符 \n 换行
char c4 = '\n';
System.out.println("\n2. 转义字符换行:");
System.out.println("第一行" + c4 + "第二行");
// 3. char 本质是整数,直接赋值数字输出对应字符
char c5 = 97;
System.out.println("\n3. 赋值整数97:");
System.out.println(c5); // 输出 a
// 4. 赋值汉字对应的Unicode数字
char c6 = 20013;
System.out.println("\n4. 赋值Unicode 20013:");
System.out.println(c6); // 输出 中
// 5. char 可以运算,相当于整数
char c7 = 'a';
int result = c7 + 10;
System.out.println("\n5. char运算:");
System.out.println("'a' 本身的值:" + (int)c7);
System.out.println("'a' + 10 = " + result);
}
}
9.4.字符类型本质
1. 字符型存储到计算机中, 需要将字符对应的码值(整数) 找出来,比如 'a'
存储: 'a' ===> 码值 97==> 二进制 ==>存储
读取: 二进制 => 97 ===> 'a' => 显示
2. 字符和码值的对应关系是通过字符编码表决定的(是规定好的)
介绍一下字符编码表[sublime测试]
ASCll (ASCll) 编码表 一个字节表示,一个128 个字符
Unicode (Unicode 编码表 固定大小的编码 使用两个字节来表示字符,字母和汉字统一都是占用两个字节,这样浪费空间)
utf-8(编码表,大小可变的编码字母使用1个字节,汉字使用3个字节)
gbk(可以表示汉字,而且范围广,字母使用1个字节,汉字2个字节)
gb2312(可以表示汉字,gb2312 < gbk)
big5码(繁体中文,台湾,香港)
9.5.布尔类型
- 布尔类型也叫boolean类型,boolean类型数据只允许取值true和false,无null
- boolean类型占1个字节.
- boolean 类型适于逻辑运算,一般用于流程控制[这个后面会详细介绍]:
if条件控制语句;
while循环控制语句;
do-while循环控制语句;
for循环控制语句 - 不可以0 或非0的整数替代false 和true
十. 基本数据类型转换
10.1 自动类型转换
当java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换
数据类型按精度(容量)大小排序为(规则)

例如 :
int a ='c' ; //可以自动转换 char - > int
double d = 80; // 对 int => double
System.out.println(num) ; //97
System.out.println(d1) ; //80.0
10.2 自动转换注意和细节
-
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后进行计算
-
当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之就会进行自动类型转换
-
(byte,short) 和 char之间不会相互自动转换
-
byte,short,char 他们三者可以计算,在计算时首先转换为int类型
-
boolean 不参与转换
-
自动提升原则: 表达式结果的类型自动提升为操作数中最大的类型
10.3 基本数据类型转换 练习题
java
// 基本数据类型转换-练习题
// 判断是否能够通过编译
// 1.
short s = 12; // ok
s = s - 9; // 错误 int -> short
// 2.
byte b = 10; // ok
b = b + 11; // 错误 int -> byte
b = (byte)(b + 11); // 正确, 使用强转
// 3.
char c = 'a'; // ok
int i = 16; // ok
float d = .314F; // ok
double result = c + i + d; // ok float -> double
// 4.
byte b = 16; // ok
short s = 14; // ok
short t = s + b; // 错误 int->short
10.4 基本数据类型和String类型的转换
在程序开发中,我们经常需要将基本数据类型转成String类型,或者将String类型转成基本数据类型
1. 基本数据类型转String
语法: 将基本类型的值 + " " 即可
java
public class demo {
public static void main(String[] args) {
int n1 = 100;
float f1 = 1.1F;
double d1 = 4.5;
boolean b1 = true;
// 全部转成字符串 拼接
String s1 = n1 + ""; // int → String
String s2 = f1 + ""; // float → String
String s3 = d1 + ""; // double → String
String s4 = b1 + ""; // boolean → String
String all = n1 + "" + f1 + "" + d1 + "" + b1;
System.out.println(all); //1001.14.5true
}
}
- String类型转换基本数据类型
语法: 通过基本类型的包装类调用parseXX方法即可
java
public class demo {
public static void main(String[] args) {
String s5 = "123";
// 1. 字符串 → int
int num1 = Integer.parseInt(s5);
// 2. 字符串 → double
double num2 = Double.parseDouble(s5);
// 3. 字符串 → float
float num3 = Float.parseFloat(s5);
// 4. 字符串 → long
long num4 = Long.parseLong(s5);
// 5. 字符串 → byte
byte num5 = Byte.parseByte(s5);
// 6. 字符串 → short
short num6 = Short.parseShort(s5);
// 7. 字符串 → boolean
boolean b = Boolean.parseBoolean("true");
// 输出所有结果
System.out.println("int 类型:" + num1); //123
System.out.println("double 类型:" + num2);//123.0
System.out.println("float 类型:" + num3); //123.0
System.out.println("long 类型:" + num4);//123
System.out.println("byte 类型:" + num5); //123
System.out.println("short 类型:" + num6);//123
System.out.println("boolean 类型:" + b);// true
//怎么把字符串转成字符char -> 含义是指 把字符串的第一个字符得到
//解读 s5.charAt(0) 得到s5字符串的第一个字符 '1'
System.out.println(s5,charAt(0));
}
}
注意:
- 在将String类型转成基本数据类型时,要确保String类型能够转成有效的数据,比如我们可以把 '123',转成一个整数,但是不能把'hello'
- 如果格式不正确,就会抛出异常,程序就会终止
十一. 强制类型转换
11.1 强制类型转换
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型,使用时要加上强制转换符( ),但可能造成精度降低或溢出,格外要注意.
java
// 自动类型转换细节
public class demo{
public static void main(String[] args){
int i =(int)1.9;
System.out.println(i); //1
int j=100;
byte b1=(byte)j;
System.out.println(b1); //100
int n2=2000;
byte b2=(byte)n2;
System.out.println(b2);//-48 精度损失
}
}
注意:
-
当进行数据的大小 大---> 小,就需要使用到强制转换
-
强转符号只针对于最近的操作数有效,往往会使小括号提升优先级
int x =(int) 10*3.5 +6*1.5; //编译错误: double->int
//正确写法
int y=(int)(10*3.5 +6*3.5);
System.out.println(x); //44 -
char类型可以保存int的常量值,但不能保存int的变量值,需要强转
java// 自动类型转换细节 public class demo{ public static void main(String[] args){ char c1=100; //ok int m=100; // ok //char c2=m;//错误 char c3=(char)m; //ok System.out.println(c3); //100对应的字符 } }