从头学习Java
环境搭建:
1.1三个关系
JDK = JRE + 开发工具集
JRE = JVM + javaSE 标准类库
1.2 path
1.2.1 为什么需要配置path 环境变量
what : windowsOS 执行命令时所要搜寻的路径(未配置,提示java 命令不存在等)
why: 希望java的开发工具,在任何文件路径下都可以执行成功
detail:
JAVA_HOME = D:\Java\jdk1.8.0
Path =%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; (用于编译)
CLASSPATH= %JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; (用于执行)
1.2.2 为什么不需要系统配置CLASSPATH
what :Java编译型语言,编译后的.class(字节码)文件才可真正被JVM执行,若要加载 'HelloWord'类,JVM需要知道去哪里搜索对应的HelloWord.class ,因此classpath用来指示JVM如何搜索class
how to find: JVM 加载 HelloWord 类时,查找顺序
当前目录
CLASSPATH指定路径
suggest:不推荐在系统环境变量中设置classpath,那样会污染整个系统环境。在启动JVM时设置classpath才是推荐的做法。实际上就是给java命令传入-classpath或-cp参数:
java -classpath .;C:\work\project1\bin;C:\shared com.starry.Hello
在IDE中运行Java程序,IDE自动传入 -cp 参数是当前工程的bin目录和引入的jar包
eg: 在IDEA中,文件目录结构:target则存编译后的字节码
1.3 编程运行
1.3.1 编写
创建一个java源文件: HelloWord.java,所在包com.example
public class HelloWord{
public static void main(String []args){
System.out.println("Hello,World");
}
}
1.3.2 编译
javac com.example.HelloWord.java
1.3.3运行
java com.example.HelloWord
1.3.4 运行出错
javac 错误: 类HelloWord是公共的, 应在名为 HelloWord.java 的文件中声明
public 类的类名应该与文件名一致 (若无public,编译可以过)
java 错误: 找不到或无法加载主类 HelloWord.class
类文件名错误: 文件名与类名不一致.
如果类在包里,应该带上包名
1.4 Jar
1.4.1
what: 把package组织的目录层级,以及各个目录下的所有文件(包括.class文件和其他文件)都打成一个jar文件(本质是一个zip压缩包)
how to run : 当项目打包成jar包时,运行命令:java -jar HelloWorld.jar
how to achieve : /META-INF/MANIFEST.MF文件,可以指定Main-Class和其它信息,JVM会自动读取这个MANIFEST.MF文件,如果存在Main-Class ,则可以用Java- jar执行.
1.4.2
Spring项目,Maven 打包成jar包的结构:
Question :
JDK,JRE,JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些:
JDK: JRE + 开发工具集 (javac.exe , java.exe ,javadoc.exe)
JRE: JVM + JavaSE 标准类库
下载JDK1.8时有两个文件夹
JDK1.8中还有一个jre
example: 编写一个 .java文件时,通过JDK中编译程序(javac.exe),将java文件编译成java字节码, 在jre运行字节码文件, JVM 解析字节码,映射到CPU指令集
为什么要配置path 环境变量 ? 如何配置?
为了java开发工具在任意位置可以成功执行java相关的命令.
JAVA_HOME = bin的上一级
path = %JAVA_HOME%\bin
CLASSPATH:系统变量 不是必须配置.IDE 在执行程序会自动带上-cp 指定路径寻找字节码文件.
基本语法:
基本类型
大小(字节)
默认值
封装类
byte
1
(byte)0
Byte
short
2
(short)0
Short
int
4
0
Integer
long
8
0L
Long
float
4
0.0f
Float
double
8
0.0d
Double
boolean
-
false
Boolean
char
2
\u0000(null)
Character
1.1运算符
算术运算符 +, -, *, /, %
++i :先自增1,后运算
i++ :先运算,后自增1
连接符:+:只能使用在String与其他数据类型变量之间使用。
赋值运算符 : = , += , -= , *= , /= ,%=
比较运算符: == ,!=, >, = , <= , instanceof
逻辑运算符: &, && ,| , ||, ! , ^
& && : A&B , A&&B ,当A为False时,& 会继续执行B ,而&&不在执行B (同理 | ,||)
位运算符 : 左<< >>右 2<
三元运算符: (条件表达式)? 表达式1 : 表达式2
1.2流程控制
分支:if else
switch(表达式){
case A:
xxx
break;
case B:
xxx
break;
case C:
xxx
break;
default:
}
循环:略
关键字:略
1.3 Scanner
Scanner scan = new Sacnner (System.in);
String name = scan.next();//String类型
int age = scan.nextInt();//int类型
double weight = scan.nextDouble();//
boolean isLove = scan.nextBoolean();
String gender = scan.next();//"男"//scanner无char转型;
char genderChar = gender.charAt(0);
Question
说明基本数据类型变量之间自动类型提升的运算规则
byte ->short > int >long >float ->double
自动类型提升:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型
容量:表示数的范围大小,不是占用字节的大小 因此float(4) >long(8)
底层原因: long存放的是数值类型,浮点数存放的是一种逻辑规则
数组:
1.1初始化
int []arr = new int[]{1000,2000,3000};
String []arr1 = new String [4];
int [][]arr = new int [][]{{1,2,3},{1,2,3},{1,2,3}}
String [][] arr1 = new String [3][];
1.2Arrays
//1.判断两个数组是否相等。
Arrays.isEquals(a,b)
//2.输出数组信息, 区别与a.toString()->地址
Arrays.toString(a);
//3.将指定值填充到数组之中。
Arrays.fill(a,10);
//4.对数组进行排序。
Arrays.sort(a)
//5.二分查找
Arrays.binarySearch(a,10);
1.3Question
不同类型的一维数组元素的默认初始化值各是多少?
整型 : 0
浮点型:0.0
char:' ' (空格)
boolean :false
引用类型:null