JAVA学习第二天之SE入门

学习目的

  1. 了解JDK在操作系统环境中的配置
  2. 了解各个环境变量的作用
  3. 掌握java在操作系统下的常用命令
  4. 掌握java的四大基本特性
  5. 掌握java的基础知识点(标识符、变量、数据类型)
  6. 了解基本的进制转换

一.入门前奏--环境变量

1.1 path系统变量

  1. 定义
    填写操作系统搜索某个命令文件的路径依据,指定操作系统可执行文件的完整路径。
  2. 原理
    计算机系统在底层执行 可执行命令.exe文件时,会先根据path变量搜索可执行文件的路径,若执行文件不在当前目录下,会依次搜索path中设置的其他路径。
  3. 用法
    path一般指定jdk和jre在系统变量中的加载路径,可以使其bin目录下的javac编译程序和java运行程序能被系统执行。


    系统变量path路径.png

1.2 classpath字节码文件路径

  1. 定义
    classpath是字节码路径,隶属于 java 语言,专门给jvm的类加载器指路,给jvm引入其它第三方类库,指定当前路径.
  2. 原理
    指定-搜索程序中所使用到的类包的文件路径(常有已编写好的类:rt.jar基础类库,dt.jar运行环境类库,tools.jar工具类库),编译器在该路径下查找.class字节码文件,然后加载执行。
  3. 用法
    一般在使用集成开发环境时配置,用DOS命令行窗口编写和运行时则不用配置classpath路径。一旦配置则“锁定”为classpath相对路径下执行,JVM就是通过CLASSPATH来寻找类的.class文件
    字节码路径classpath路径.png

1.3 JAVA_HOME

  1. 定义
    JAVA_HOME即java的家目录,供需要运行 JAVA程序使用的路径,通常是配置集成开发环境或Tomcat时指定查找的JDK路径。
  2. 分类
  • 用户变量:指定可以由当前的用户运行的程序路径和变量路径。
  • 系统变量:指定可以由系统直接运行的程序路径和变量路径。

1.4 常见问题

  1. 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基本特性

  1. 简单性
    java是面向对象的语言,Java在面世前已封装好各种类和接口,java程序员只需要通过创建对象、调用接口方法即可,不需要关注过程的细节。
  2. 面向对象
    Java 中提供了封装、继承、多态等面向对象的机制。
  3. 健壮性
    Java 引入了自动垃圾回收机制(GC 机制),Java 程序启动了一个单独的垃圾回收线程,时刻监测内存使用情况,在特定时机会回收/释放垃圾数据,让内存时刻处于最好的状态。
  4. 多线程
    Java 语言支持多个线程同时并发执行,同时也提供了多线程环境下的安全机制。
  5. 可移植性/跨平台
    可移植性/跨平台表示 Java 语言只需要编写/编译一次,即可处处运行。Java 代码既可以运行在 windows 的环境下,又可以运行在 Linux 的环境下,而不需要修改Java 源程序。


    java跨平台.png

2.2 注释

  1. 定义
    注释是对java代码的解释和说明,良好且规范的注释,让程序员更加快速的理解代码。
  2. 要求
    编写注释是程序员最基本的素质,养成编写注释的好习惯,要有编写注释的意识。不多不少,恰到好处,可以描述清楚程序的核心功能。
  3. 编写位置
  • 类和接口上:文档注释创建者,创建时间,版本,以及该类的作用
  • 方法中:单行注释参数的类型,方法的返回值
  • 常量:多行注释,标明该常量的用途

2.3 标识符

  1. 定义
    标识符是用来标识某个实体、对象、类、方法名、变量、常量、语句块的一个字符符号。
  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 变量

  1. 变量本质
    变量是一块拥有名字的内存空间,不同的变量在JVM不同的内存空间中,变量即保存内存地址。
  2. 变量定义
    变量是内存当中存储数据最基本的单元,将数据(字面量)放到内存当中,给这块内存空间起一个名字后就是变量。
  3. 变量三要素
  • 数据类型:指定变量的字面量的数值类型,分八大基础数据类型和引用数据类型。
  • 变量名:变量的名称,一般见名知意;存储在虚拟机栈中的栈帧局部变量区
  • 字面量:区分不同数据类型变量的数值,存储在虚拟机栈中的栈帧操作数区

2.5.1 变量分类

  1. 常量
    常量指的是 static 和 final修饰的变量,只允许赋值一次,一旦赋值,不可以再修改,存储在方法区。
  2. 静态变量
    静态变量又叫类变量,属于类级别的变量,与类一起加载到方法区内存当中。静态变量是static修饰的属性,在编译期初始化,且只初始化一次到方法区中。静态变量不需要对象就可以直接调用。
  3. 非静态变量
    非静态变量是不使用static关键字修饰的变量,需要创建对象后才能使用。
  4. 实例变量<成员变量>
    实例变量又叫成员变量,属于类级别变量,编写在方法体外,类体内。需要 类在堆内存中实例化、创建对象后,才能使用(运行期)。
  5. 局部变量
    定义在方法体内的变量,只在方法体当中有效,方法开始执行,局部变量的内存才会被分配;当方法执行结束之后,局部变量的内存就释放了。
  6. 注意
    静态方法中不能直接调用或引用非静态的变量和方法,因为初始化和运行期对不上。而非静态的可以直接调用静态的。

2.5.2 变量在内存的存储方式

  1. 局部变量
    局部变量存在于:方法体内--栈内存栈帧局部变量区,使用前必须初始化
  2. 成员变量
    成员变量存在于:类体内--随类加载信息而加载,使用前若不初始化,系统赋默认值

三 java数据类型

  1. 数据概念
    在计算机中,所有的java文件都是以数据的形式存在的。而存储的数据分为不同的数据类型,每一种数据类型存储不一样大小的数据。数据的最小单位是位--bit,又称比特;存储容量的基本单位是字节--byte。
  2. 计算机数据形式
    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 数据类型分类

  1. 整数型默认int:byte(1字节)、short(2字节)、int(4字节)、long(8字节)
  2. 浮点型默认double:float(4字节)、double(8字节)
  3. 字符型:char(2字节)
  4. 布尔型: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 数据类型转换

  1. 转换范围
    八种基本数据类型中,除 boolean类型不能转换,剩下七种类型之间都可以进行转换;
  2. 转换要求
    如果int型字面量没有超出 byte(128)、short(32767)、char (65535)的取值范围,可以直接将其赋值给byte、short、char 类型的变量;
  3. 小转大
  • 小容量向大容量转换称为自动类型转换
  • 原理:小容量在左边补0补齐位数到大容量
  • 容量从小到大排序:byte < short(char) < int < long < float < double,其中 short 和 char 都占用两个字节,但是 char 可以表示更大的正整数;
  1. 大转小
  • 大容量转换成小容量称为强制类型转换
  • 原理:大容量在左边删除位数到小容量),编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用;
  1. 短整型转换
  • byte、short、char 类型混合运算时,先各自转换成 int 类型再做运算;
  • 隐藏错误:byte b1= 12 和 byte b1 += 12 正确;byte = b1 + 2 编译错误。b1直接赋值时不超过范围可以直接赋,而做+运算时b1是int类型,大转小编译错误。
  1. 混合转换
    多种数据类型混合运算,各自先转换成容量最大的那一种再做运算。(多类型混合运算经常编译不通过
  2. 注意
    对于基本数据类型的赋值运算,经常因为字面量会出现超出范围而最终赋值了补码的数。

3.4 编码转换

  1. 编码
    从字符类型转换到二进制数的过程称为编码
  2. 解码
    从二进制数到字符类型数据的过程称为解码
  3. 字符编码
  • 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

四 进制数

  1. 概念
    进制数指的是使用不同基底的数来表示日常生活的十进制数的数制,其中以2为基底表示的是二进制数,以8为基底表示的是八进制数,以16为基底表示的是十六进制数

4.1 常见进制数

  1. 二进制
    0b开始,以2为基底来表示十进制数的进制数。所有执行代码和指令在计算机底层的实现都是二进制,每一个程序都由代码片段组成,代码片段由标识符、变量、数据类型等组成,根据数据类型的不同,可以转换为二进制0、1底层实现。
  2. 十进制
    现实中最常见的数,任何进制数都可以转换为十进制数。
  3. 八进制
    0开始,以8为基底来表示十进制数的进制数。
  4. 十六进制
    0x开始,以16为基底来表示十进制数的进制数。

4.2 码制数(最高位0为正,1为负)

  1. 概念
    码制数指的是计算机底层用来表示数据的都是二进制数,但二进制数也有正负区分,为了方便区分则采用了码制数表示不同大小的二进制数。计算机底层统一采用补码来表示数据。

4.2.1 常见码制数

  1. 原码
    直接将字面量数值转换为二进制的数值就是原码。正数的原码、反码、补码都是同一个。
  2. 反码
    对于负数的反码,是将转换后的二进制最高位取1,其余位数按位取反所得。(如-15原码=1000 1111,反码=1111 0000)
  3. 补码
    在负数的二进制反码基础上末位加1,而反码也可根据补码减1得到。计算机底层在任何情况下都是采用二进制补码的形式存储数据。

五 运算符(以二进制数进行运算)

  1. 赋值运算符
    = 号(从右往左,将右边字面量赋给左边变量)
  2. 扩展运算符
    +=、-=、*=、\=、%=,(运算前后不改变数据类型
  3. 算数运算符
    +、-、*、\(除,取整数商)、%(按模取余,取余数)
  4. 关系运算符
    >、>=、<、<=、==、!=(运算结果为Boolean布尔类型)
  5. 逻辑运算符(运算操作数为布尔型,运算结果也为布尔型)
  • 逻辑与(&):操作数为布尔型,同真为真,一假则假
  • 逻辑或(|):操作数为布尔型,一真则真,同假才假
  • 短路与(&&):左边为真判断右边,左边为假直接是假。
  • 短路或(||):左边为真直接为真,左边为假判断右边。
  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
  1. 位移运算符(对补码进行移动变化,最高位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. 三目运算符:布尔表达式?表达式 1:表达式 2,判断式为真执行表达式1,为假执行表达式2。
  2. 字符串连接运算符:+、new
  3. 按位取反(~):对一个二进制数按位取反,即将0变1,1变0
  4. 自增运算符
  • n++(先赋值再自增加1)
  • n--(先赋值再自减去1)
  • ++n(先自增加1再赋值)
  • --n(先自减去1再赋值)

常见面试题

  1. java常见的数据类型有哪些?
    java常见数据类型分为基本数据类型和引用数据类型。
  • 基本数据类型包括:数值型(byte、short、int、long、float、double),布尔型(boolean)以及字符型(char)。
  • 除了基本类型外,其他数据类型都属于引用类型,包括类(自定义类和本地类)、接口、数组等都是引用数据类型。
  1. 什么是自动装箱?什么是自动拆箱?
    答:
    基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
  • 基本数据类型数值转换为对应的包装类型,称为自动装箱,如int转换为Integer
  • 包装类型转换为对应的基本数据类型称为拆箱,如Double转换为double。
  1. 什么是自动类型转换?什么是强制类型转换?
    答:
    在八大基本数据类型中,除了boolean类型,其他的数据类型由小容量向大容量转型,称为自动类型转换,自动类型转换是根据小容量位数的高位补全转换为大容量。而大容量向小容量转型称为强制类型转换,强制类型转换是根据大容量需要丢掉高位的数换为小容量,因而容易造成精度和数据丢失。

  2. 描述一下n++和++n的区别?
    答:
    n++先进行赋值运算,再自增加1;
    ++n先进行自增加1,再进行赋值运算。

  3. 在静态方法里可以访问非静态变量吗?
    答:
    Java 中的 static变量归相应的类所有,它的值对于类的所有实例都是相同的。static 变量是在 JVM 加载类的时候就已经初始化的,而非静态变量需要先创建或实例化对象才能调用。如果代码试图访问非静态的变量,而且不是通过类的实例(或对象)去访问,编译器会报错。因为非静态变量在加载时,对象还没有被创建,并且没有与实例相关联。

  4. 什么是包装类?Java 中都有哪些包装类?
    答:
    基本数据类型都有对应的包装类型,当一个方法中的参数需要传入对象形式的数值时,基本数据类型就不能满足需求,因此提供对应的包装类型。包装类型一共有八种。

  5. 什么是实例变量?什么是局部变量?什么是类变量?什么是final 变量?
    答:

  6. 谈谈new Integer(123) 与 Integer.valueOf(123) 的区别?
    答:
    new Integer(123) 每次都会新建一个对象;Integer.valueOf(123)则会使用缓存池中已存在的对象,多次调用会取得同一个对象的引用,而不会另外创建新的对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341