学习目的
了解JDK在操作系统环境中的配置
了解各个环境变量的作用
掌握java在操作系统下的常用命令
掌握java的四大基本特性
掌握java的基础知识点(标识符、变量、数据类型)
了解基本的进制转换
一.入门前奏--环境变量
1.1 path系统变量
定义
填写操作系统搜索某个命令文件的路径依据,指定操作系统可执行文件的完整路径。
原理
计算机系统在底层执行 可执行命令.exe文件时,会先根据path变量搜索可执行文件的路径,若执行文件不在当前目录下,会依次搜索path中设置的其他路径。
用法
path一般指定jdk和jre在系统变量中的加载路径,可以使其bin目录下的javac编译程序和java运行程序能被系统执行。
系统变量path路径.png
1.2 classpath字节码文件路径
定义
classpath是字节码路径,隶属于 java 语言,专门给jvm的类加载器指路,给jvm引入其它第三方类库,指定当前路径.。
原理
指定-搜索程序中所使用到的类包的文件路径(常有已编写好的类:rt.jar基础类库,dt.jar运行环境类库,tools.jar工具类库),编译器在该路径下查找.class字节码文件,然后加载执行。
用法
一般在使用集成开发环境时配置,用DOS命令行窗口编写和运行时则不用配置classpath路径。一旦配置则“锁定”为classpath相对路径下执行,JVM就是通过CLASSPATH来寻找类的.class文件。
字节码路径classpath路径.png
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 源程序。
java跨平台.png
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得到。计算机底层在任何情况下都是采用二进制补码的形式存储数据。
五 运算符(以二进制数进行运算)
赋值运算符
= 号(从右往左,将右边字面量赋给左边变量)
扩展运算符
+=、-=、*=、\=、%=,(运算前后不改变数据类型)
算数运算符
+、-、*、\(除,取整数商)、%(按模取余,取余数)
关系运算符
>、>=、
逻辑运算符(运算操作数为布尔型,运算结果也为布尔型)
逻辑与(&):操作数为布尔型,同真为真,一假则假;
逻辑或(|):操作数为布尔型,一真则真,同假才假
短路与(&&):左边为真判断右边,左边为假直接是假。
短路或(||):左边为真直接为真,左边为假判断右边。
位运算符
按位与(&):操作数为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)则会使用缓存池中已存在的对象,多次调用会取得同一个对象的引用,而不会另外创建新的对象。