学习目的
- 了解JDK在操作系统环境中的配置
- 了解各个环境变量的作用
- 掌握java在操作系统下的常用命令
- 掌握java的四大基本特性
- 掌握java的基础知识点(标识符、变量、数据类型)
- 了解基本的进制转换
一.入门前奏--环境变量
1.1 path系统变量
- 定义
填写操作系统搜索某个命令文件的路径依据,指定操作系统可执行文件的完整路径。 - 原理
计算机系统在底层执行 可执行命令.exe文件时,会先根据path变量搜索可执行文件的路径,若执行文件不在当前目录下,会依次搜索path中设置的其他路径。 -
用法
path一般指定jdk和jre在系统变量中的加载路径,可以使其bin目录下的javac编译程序和java运行程序能被系统执行。
1.2 classpath字节码文件路径
- 定义
classpath是字节码路径,隶属于 java 语言,专门给jvm的类加载器指路,给jvm引入其它第三方类库,指定当前路径.。 - 原理
指定-搜索程序中所使用到的类包的文件路径(常有已编写好的类:rt.jar基础类库,dt.jar运行环境类库,tools.jar工具类库),编译器在该路径下查找.class字节码文件,然后加载执行。 - 用法
一般在使用集成开发环境时配置,用DOS命令行窗口编写和运行时则不用配置classpath路径。一旦配置则“锁定”为classpath相对路径下执行,JVM就是通过CLASSPATH来寻找类的.class文件。
1.3 JAVA_HOME
- 定义
JAVA_HOME即java的家目录,供需要运行 JAVA程序使用的路径,通常是配置集成开发环境或Tomcat时指定查找的JDK路径。 - 分类
- 用户变量:指定可以由当前的用户运行的程序路径和变量路径。
- 系统变量:指定可以由系统直接运行的程序路径和变量路径。
1.4 常见问题
-
DOS 窗口中找不到命令
操作系统是如何搜索命令文件的?实际上是先在当前路径下找,找不到的时候自动去环境变量 path的路径中查找,找到则执行该命令,找不到则在 DOS 窗口中提示错误信息。
1.5 java常用命令行
命令 | 作用 | 书写格式 |
---|---|---|
javac | 编译源文件成.class字节码文件 | javac xxx.java |
java | 运行字节码文件 | java xxx.class |
运行jar文件 | java -jar xxx.jar | |
javap | 解析字节码文件/反编译工具 | java -[参数] 类名/字节码文件名 |
-help 输出 javap 的帮助信息 | java -help | |
-l 输出行及局部变量表 | java -l | |
-public 只显示 public 类及成员 | java -public | |
-private 显示所有类和成员 | java -private | |
-s 输出内部类型签名 | java -s | |
-verbose 输出堆栈大小、各方法的args 数 | java -verbose | |
-c 输出类中各方法未解析的代码 | java -c | |
-s 输出内部类型签名 | java | |
jdb | 命令行调试环境/查错工具 | jdb .class类名 |
jar | jar 打包 | javaws |
jconsole | java监测和管理控制台 | jconsole |
javaws | 查看java应用程序高速缓存 | javaws |
jps | java虚拟机进程状态工具 | jps 进程名 |
jstat | JVM统计监视工具(监控工具) | jstat -help |
二、 java基础
2.1 java基本特性
- 简单性
java是面向对象的语言,Java在面世前已封装好各种类和接口,java程序员只需要通过创建对象、调用接口方法即可,不需要关注过程的细节。 - 面向对象
Java 中提供了封装、继承、多态等面向对象的机制。 - 健壮性
Java 引入了自动垃圾回收机制(GC 机制),Java 程序启动了一个单独的垃圾回收线程,时刻监测内存使用情况,在特定时机会回收/释放垃圾数据,让内存时刻处于最好的状态。 - 多线程
Java 语言支持多个线程同时并发执行,同时也提供了多线程环境下的安全机制。 -
可移植性/跨平台
可移植性/跨平台表示 Java 语言只需要编写/编译一次,即可处处运行。Java 代码既可以运行在 windows 的环境下,又可以运行在 Linux 的环境下,而不需要修改Java 源程序。
2.2 注释
- 定义
注释是对java代码的解释和说明,良好且规范的注释,让程序员更加快速的理解代码。 - 要求
编写注释是程序员最基本的素质,养成编写注释的好习惯,要有编写注释的意识。不多不少,恰到好处,可以描述清楚程序的核心功能。 - 编写位置
- 类和接口上:文档注释创建者,创建时间,版本,以及该类的作用
- 方法中:单行注释参数的类型,方法的返回值
- 常量:多行注释,标明该常量的用途
2.3 标识符
- 定义
标识符是用来标识某个实体、对象、类、方法名、变量、常量、语句块的一个字符符号。 - 命名规则
标识符只能由数字、字母、下划线、美元符号$组成,但不能以数字开始,也不建议用下划线开始,$符号开头的标识符具有特别意义。 - 命名规范
驼峰命名方式,具体参考阿里巴巴java编程规约
- 类名、接口名:首字母大写,后面每个单词首字母大写,不能以数字开头(pulic修饰的类名和接口名与字节码命名相同)
- 变量名、方法名:首字母小写,后面每个单词首字母大写
- 常量名:全部大写,单词和单词之间使用下划线_衔接,如:大写_大写,LOGIN_SUCCESS、ACCESS_TOKEN 等。
2.4 关键字
关键字 | 作用 |
---|---|
abstract | 表明类或者成员方法具有抽象属性 |
boolean | 基本数据类型,布尔类型 |
break | 提前跳出一个块 |
byte | 基本数据类型,字节类型 |
case | 用在 switch 语句之中,表示其中的一个分支 |
catch | 用在异常处理中,用来捕捉异常 |
char | 基本数据类型,字符类型 |
class | 声明一个类 |
continue | 回到一个块的开始处 |
default | 默认,用在 switch 语句中表明一个默认的分支 |
do | 用在 do-while 循环结构中 |
double | 基本数据类型,双精度浮点数类型 |
else | 用在条件语句中,表明当条件不成立时的分支 |
enum | 枚举,和class一样,定义枚举类 |
extends | 继承,表面一个类或接口是另外一个的子类 |
final | 表示不可变,最终的 |
finally | 处理异常,声明一个肯定会被执行到的语句块 |
float | 基本数据类型,单精度浮点数类型 |
for | 循环结构 |
goto | 保留关键字,没有具体含义,java中不支持 |
if | 条件语句 |
implements | 表明一个类实现了给定的接口 |
import | 表明要访问指定的类或包 |
instanceof | 判断符,测试一个对象是否是指定类型的实例对象 |
int | 基本数据类型,整数类型 |
interface | 接口 |
long | 基本数据类型,长整数类型 |
native | 声明一个方法底层由 C/C++语言实现,可被计算机执行 |
new | 创建新实例对象 |
package | 包 |
private | 访问控制方式:私用模式 |
protected | 访问控制方式:保护模式 |
public | 访问控制方式:共用模式 |
return | 从成员方法中返回数据 |
short | 基本数据类型,短整数类型 |
static | 静态属性 |
super | 表明当前对象的父类型引用或者父类型的构造方法 |
switch | 分支语句结构的引导词 |
synchronized | 表明一段代码需要同步执行,线程安全标志 |
this | 指向当前实例对象的引用 |
throw | 抛出一个异常 |
throws | 声明在当前定义的成员方法中所有需要抛出的异常 |
transient | 声明不用序列化的成员域 |
try | 尝试一个可能抛出异常的程序块 |
void | 声明当前成员方法没有返回值 |
volatile | 表明两个或者多个变量必须同步地发生变化 |
while | 用在循环结构中 |
2.5 变量
- 变量本质
变量是一块拥有名字的内存空间,不同的变量在JVM不同的内存空间中,变量即保存内存地址。 - 变量定义
变量是内存当中存储数据最基本的单元,将数据(字面量)放到内存当中,给这块内存空间起一个名字后就是变量。 - 变量三要素
- 数据类型:指定变量的字面量的数值类型,分八大基础数据类型和引用数据类型。
- 变量名:变量的名称,一般见名知意;存储在虚拟机栈中的栈帧的局部变量区。
- 字面量:区分不同数据类型变量的数值,存储在虚拟机栈中的栈帧的操作数区。
2.5.1 变量分类
- 常量
常量指的是 static 和 final修饰的变量,只允许赋值一次,一旦赋值,不可以再修改,存储在方法区。 - 静态变量
静态变量又叫类变量,属于类级别的变量,与类一起加载到方法区内存当中。静态变量是static修饰的属性,在编译期初始化,且只初始化一次到方法区中。静态变量不需要对象就可以直接调用。 - 非静态变量
非静态变量是不使用static关键字修饰的变量,需要创建对象后才能使用。 - 实例变量<成员变量>
实例变量又叫成员变量,属于类级别变量,编写在方法体外,类体内。需要 类在堆内存中实例化、创建对象后,才能使用(运行期)。 - 局部变量
定义在方法体内的变量,只在方法体当中有效,方法开始执行,局部变量的内存才会被分配;当方法执行结束之后,局部变量的内存就释放了。 -
注意
静态方法中不能直接调用或引用非静态的变量和方法,因为初始化和运行期对不上。而非静态的可以直接调用静态的。
2.5.2 变量在内存的存储方式
- 局部变量
局部变量存在于:方法体内--栈内存栈帧局部变量区,使用前必须初始化 - 成员变量
成员变量存在于:类体内--随类加载信息而加载,使用前若不初始化,系统赋默认值
三 java数据类型
- 数据概念
在计算机中,所有的java文件都是以数据的形式存在的。而存储的数据分为不同的数据类型,每一种数据类型存储不一样大小的数据。数据的最小单位是位--bit,又称比特;存储容量的基本单位是字节--byte。 - 计算机数据形式
1byte = 8bit
1字节=8位:00000000
2字节=16位:00000000 00000000
4字节=32位:00000000 00000000 00000000 00000000
8字节=64位:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3.1 数据类型分类
- 整数型默认int:byte(1字节)、short(2字节)、int(4字节)、long(8字节)
- 浮点型默认double:float(4字节)、double(8字节)
- 字符型:char(2字节)
- 布尔型:boolean(1字节),JVM 支持 boolean 数组,但是数组底层也是通过读写 byte数组来实现的。
3.2 数据类型取值范围
在二进制位当中,最左边的二进制位是符号位,0 表示正数,1 表示负数。每种数据类型根据其占用空间大小,最大值是左边一个0右边n个1,如byte最大值01111111,short最大值01111111 11111111
基本数据类型 | 占用字节(位数) | 范围 |
---|---|---|
byte | 1字节(8位) | 11111111、(-128~127) |
short | 2字节(16位) | 11111111 11111111、(-32768~32767) |
int | 4字节(32位) | 11111111..11111111、(-2147483648~2147483647) |
long | 8字节(64位) | 11111111 ...... 11111111 |
float | 4字节(32位) | 11111111..11111111、(-2147483648~2147483647) |
double | 8字节(64位) | 11111111 ...... 11111111 |
boolean | 1字节(8位) | true、false |
char | 2字节(16位) | 0~65535、(2^16-1) |
引用数据类型 | 占用字节(位数) | 范围 |
---|---|---|
String | 多个char型 | char数组 |
Object | 所有类的父类 | |
BigDecimal | 超大精度的数据 | |
System | 系统类 | 输入流in、输出流out、错误输出流err |
file | 文件对象 | 实际存在的文件和目录 |
FileInputStream | 文件输入流 | 文件 |
FileOutputStream | 文件输出流 | 文件 |
3.3 数据类型转换
- 转换范围
八种基本数据类型中,除 boolean类型不能转换,剩下七种类型之间都可以进行转换; - 转换要求
如果int型字面量没有超出 byte(128)、short(32767)、char (65535)的取值范围,可以直接将其赋值给byte、short、char 类型的变量; - 小转大
- 小容量向大容量转换称为自动类型转换
- 原理:小容量在左边补0补齐位数到大容量
- 容量从小到大排序:byte < short(char) < int < long < float < double,其中 short 和 char 都占用两个字节,但是 char 可以表示更大的正整数;
- 大转小
- 大容量转换成小容量称为强制类型转换
- 原理:大容量在左边删除位数到小容量),编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用;
- 短整型转换
- byte、short、char 类型混合运算时,先各自转换成 int 类型再做运算;
- 隐藏错误:byte b1= 12 和 byte b1 += 12 正确;byte = b1 + 2 编译错误。b1直接赋值时不超过范围可以直接赋,而做+运算时b1是int类型,大转小编译错误。
- 混合转换
多种数据类型混合运算,各自先转换成容量最大的那一种再做运算。(多类型混合运算经常编译不通过) -
注意
对于基本数据类型的赋值运算,经常因为字面量会出现超出范围而最终赋值了补码的数。
3.4 编码转换
- 编码
从字符类型转换到二进制数的过程称为编码 - 解码
从二进制数到字符类型数据的过程称为解码 - 字符编码
- Unicode编码<国际统一字符编码>:\u 后面的十六进制表示中文汉字的 unicode编码,如\u4e2d的4e2d就是字符编码集的 中 字对应的十六进制。
常见字符 | 对应ASCLL码 | 二进制数 |
---|---|---|
a | 97 | 01100001 |
b | 98 | 01100010 |
c | 99 | 01100011 |
d | 100 | |
e | 101 | |
...z | 123 | |
A | 65 | |
B | 66 | |
C | 67 | |
D | 68 | |
...Z | 91 | |
0 | 48 | |
1 | 49 | |
2 | 50 |
四 进制数
- 概念
进制数指的是使用不同基底的数来表示日常生活的十进制数的数制,其中以2为基底表示的是二进制数,以8为基底表示的是八进制数,以16为基底表示的是十六进制数
4.1 常见进制数
- 二进制
以0b开始,以2为基底来表示十进制数的进制数。所有执行代码和指令在计算机底层的实现都是二进制,每一个程序都由代码片段组成,代码片段由标识符、变量、数据类型等组成,根据数据类型的不同,可以转换为二进制0、1底层实现。 - 十进制
现实中最常见的数,任何进制数都可以转换为十进制数。 - 八进制
以0开始,以8为基底来表示十进制数的进制数。 - 十六进制
以0x开始,以16为基底来表示十进制数的进制数。
4.2 码制数(最高位0为正,1为负)
- 概念
码制数指的是计算机底层用来表示数据的都是二进制数,但二进制数也有正负区分,为了方便区分则采用了码制数表示不同大小的二进制数。计算机底层统一采用补码来表示数据。
4.2.1 常见码制数
- 原码
直接将字面量数值转换为二进制的数值就是原码。正数的原码、反码、补码都是同一个。 - 反码
对于负数的反码,是将转换后的二进制最高位取1,其余位数按位取反所得。(如-15原码=1000 1111,反码=1111 0000) - 补码
在负数的二进制反码基础上末位加1,而反码也可根据补码减1得到。计算机底层在任何情况下都是采用二进制补码的形式存储数据。
五 运算符(以二进制数进行运算)
- 赋值运算符
= 号(从右往左,将右边字面量赋给左边变量) - 扩展运算符
+=、-=、*=、\=、%=,(运算前后不改变数据类型) - 算数运算符
+、-、*、\(除,取整数商)、%(按模取余,取余数) - 关系运算符
>、>=、<、<=、==、!=(运算结果为Boolean布尔类型) - 逻辑运算符(运算操作数为布尔型,运算结果也为布尔型)
- 逻辑与(&):操作数为布尔型,同真为真,一假则假;
- 逻辑或(|):操作数为布尔型,一真则真,同假才假
- 短路与(&&):左边为真判断右边,左边为假直接是假。
- 短路或(||):左边为真直接为真,左边为假判断右边。
- 位运算符
- 按位与(&):操作数为int型,两个二进制数的相应位值全为1才为1,其他都为0。11=1、10=0、01=0、00=0
- 按位或(|):操作数为int型,两个二进制数的相应位值一个为1即为1,两个0才为0。11=1、10=1、01=1、00=0
- 逻辑异或(^):相同为假,相异为真,两个二进制数的相应位值不同时,该位运算结果为1,否则为0。10=1、01=1、11=0、00=0
- 位移运算符(对补码进行移动变化,最高位0为正,1为负)
正数移:三码(源码、反码、补码)相同,所以无论左移还是右移都是补0.(左移则表示放大2的N次方,右移表示缩小2的N次方)
负数移:对负数的补码移动,左移在右边补0,右移需要在左边补1
左移(<<):将一个数的二进制位左移若干位,移动位数由右操作数指定<操作数为非负值>,左移后右边空出位填补0,高位左移溢出则舍弃该高位。如a=15,二进制数为00001111,a<<2表示左移2位,移动后得00111100。
带符号右移(>>):将运算符左边的运算对象,向右移动右操作数指定的位数。若是正数,高位补零;若是负数,高位补1,即符号位不变,缺位补符号位。如16>>2 = 4,00010000右移动2位为00000100;-16>>2 = -4,10010000右移动2位为10000100。
无符号右移(>>>):将运算符左边的运算对象,向右移动右操作数指定的位数。但忽略符号位扩展,0补最高位,缺位不管左边数字是正是负都补0,无符号右移运算只针对负数计算。
- 三目运算符:布尔表达式?表达式 1:表达式 2,判断式为真执行表达式1,为假执行表达式2。
- 字符串连接运算符:+、new
- 按位取反(~):对一个二进制数按位取反,即将0变1,1变0
- 自增运算符:
- n++(先赋值再自增加1)
- n--(先赋值再自减去1)
- ++n(先自增加1再赋值)
- --n(先自减去1再赋值)
常见面试题
- java常见的数据类型有哪些?
java常见数据类型分为基本数据类型和引用数据类型。
- 基本数据类型包括:数值型(byte、short、int、long、float、double),布尔型(boolean)以及字符型(char)。
- 除了基本类型外,其他数据类型都属于引用类型,包括类(自定义类和本地类)、接口、数组等都是引用数据类型。
- 什么是自动装箱?什么是自动拆箱?
答:
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
- 基本数据类型数值转换为对应的包装类型,称为自动装箱,如int转换为Integer
- 包装类型转换为对应的基本数据类型称为拆箱,如Double转换为double。
什么是自动类型转换?什么是强制类型转换?
答:
在八大基本数据类型中,除了boolean类型,其他的数据类型由小容量向大容量转型,称为自动类型转换,自动类型转换是根据小容量位数的高位补全转换为大容量。而大容量向小容量转型称为强制类型转换,强制类型转换是根据大容量需要丢掉高位的数换为小容量,因而容易造成精度和数据丢失。描述一下n++和++n的区别?
答:
n++先进行赋值运算,再自增加1;
++n先进行自增加1,再进行赋值运算。在静态方法里可以访问非静态变量吗?
答:
Java 中的 static变量归相应的类所有,它的值对于类的所有实例都是相同的。static 变量是在 JVM 加载类的时候就已经初始化的,而非静态变量需要先创建或实例化对象才能调用。如果代码试图访问非静态的变量,而且不是通过类的实例(或对象)去访问,编译器会报错。因为非静态变量在加载时,对象还没有被创建,并且没有与实例相关联。什么是包装类?Java 中都有哪些包装类?
答:
基本数据类型都有对应的包装类型,当一个方法中的参数需要传入对象形式的数值时,基本数据类型就不能满足需求,因此提供对应的包装类型。包装类型一共有八种。什么是实例变量?什么是局部变量?什么是类变量?什么是final 变量?
答:谈谈new Integer(123) 与 Integer.valueOf(123) 的区别?
答:
new Integer(123) 每次都会新建一个对象;Integer.valueOf(123)则会使用缓存池中已存在的对象,多次调用会取得同一个对象的引用,而不会另外创建新的对象。