JVM(Java Virtual Machine ):Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在JVM 之上。
跨平台:任何软件的运行,都必须要运行在操作系统之上,而我们用Java编写的软件可以运行在任何的操作系统上,这个特性称为Java语言的跨平台特性。java语言不是直接运行在CPU上,而是在JVM虚拟机上运行的,每个系统都有自己的虚拟机,所以java语言能够实现跨平台 如图所示,Java的虚拟机本身不具备跨平台功能的,每个操作系统下都有不同版本的虚拟机。
JRE (Java Runtime Environment) :是Java程序的运行时环境,包含JVM和运行时所需要的核心类库。 JDK (Java Development Kit):是Java程序开发工具包,包含JRE和开发人员使用的工具。 我们想要运行一个已有的Java程序,那么只需安装JRE即可。 我们想要开发一个全新的Java程序,那么必须安装JDK。
编写、编译、运行。 javac负责编译 启动java编译器程序,将.java文件编译成.class文件(字节码文件) 字节码文件可以被jvm识别
java负责运行的部分,会启动jvm,加载运行时所需的类库,对class文件进行执行
我知道很多人没学过C++,但是面试官就是没事喜欢拿咱们Java和C++比呀!没办法!!!就算没学过C++,也要记下来!
都是面向对象的语言,都支持封装、继承和多态Java不提供指针来直接访问内存,程序内存更加安全Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。java有自动内存管理机制,不需要程序员手动释放无用内存文件名必须是HelloWorld,保证文件名和类的名字是一致的,注意大小写。
main方法:称为主方法。写法是固定格式不可以更改。main方法是程序的入口点或起始点,无论我们编写多少程序,JVM在运行的时候,都会从main方法这里开始执行。
命名规则: 硬性要求 标识符可以包含英文字母26个(区分大小写) 、0-9数字 、$(美元符号) 和_(下划线) 。 标识符不能以数字开头。 标识符不能是关键字。
Java中的默认类型:整数类型是int、浮点类型是double。
在定义变量的时候 long类型:建议数据后加L表示。 float类型:建议数据后加F表示。
将取值范围小的类型自动提升为取值范围大的类型 。
public static void main(String[] args) { int i = 1; byte b = 2; // byte x = b + i; // 报错 //int类型和byte类型运算,结果是int类型 int j = b + i; System.out.println(j); }范围小的类型向范围大的类型提升, byte、short、char 运算时直接提升为int 。
byte、short、char‐‐>int‐‐>long float‐‐>double强制类型转换:将取值范围大的类型强制转换成取值范围小的类型。 转换格式: 数据类型 变量名 = (数据类型)被转数据值;
// double类型数据强制转成int类型,直接去掉小数点。 int i = (int)1.5;强烈注意 浮点转成整数,直接取消小数点,可能造成数据损失精度。 int 强制转成short 砍掉2个字节,可能造成数据丢失。
笔试题:
public static void main(String[] args) { //short类型变量,内存中2个字节 short s = 1; /* 出现编译失败 s和1做运算的时候,1是int类型,s会被提升为int类型 s+1后的结果是int类型,将结果在赋值会short类型时发生错误 short内存2个字节,int类型4个字节 必须将int强制转成short才能完成赋值 */ s = s + 1;//编译失败 s = (short)(s+1);//编译成功 }+、 -、 *、 /、%、++、 --
=、 +=、 *=、 /=、%=
==、<、 >、 <=、 >=、 !=
数据类型 变量名 = 布尔类型表达式?结果1:结果2
布尔类型表达式结果是true,三元运算符整体结果为结果1,赋值给变量。 布尔类型表达式结果是false,三元运算符整体结果为结果2,赋值给变量。
if if… else… if … else if … else…
switch…case语句格式
switch(表达式) { case 常量值1: 语句体1; break; case 常量值2: 语句体2; break; ... default: 语句体n+1; break; }在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。
面试题 switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。for while do{…} while();
for 和 while 的小区别: 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。 在已知循环次数的时候使用推荐使用for,循环次数未知的时推荐使用while。
break
使用场景:终止switch或者循环
在选择结构switch语句中在循环语句中离开使用场景的存在是没有意义的 public static void main(String[] args) { for (int i = 1; i<=10; i++) { //需求:打印完两次HelloWorld之后结束循环 if(i == 3){ break; } System.out.println("HelloWorld"+i); } }continue 使用场景:结束本次循环,继续下一次的循环
public static void main(String[] args) { for (int i = 1; i <= 10; i++) { //需求:不打印第三次HelloWorld if(i == 3){ continue; } System.out.println("HelloWorld"+i); } }数组初始化
public static void main(String[] args) { int[] arr1 = new int[5]; //动态初始化 int[] arr2 = new int[]{1,2,3,4,5}; int[] arr3 = {1,2,3,4,5}; }数组的访问 索引: 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引 (index),可以通过数组的索引访问到数组中的元素。
数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为: 数组名.length,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为数组名.length-1 。
数组的遍历
public class HelloWorld { public static void main(String[] args) { int[] arr = {15,3,48,1,6,45}; // 根据数组的length属性来遍历 for(int i=0;i<arr.length;i++){ arr[i]=i; System.out.println(arr[i]); } // 如果获取的元素在数组中根本不存在,例如获取第11个元素,会出现数组下标越界异常 // 使用增强for循环进行遍历 for(int i:arr){ // int i 遍历数据的时候所使用的的容器 // arr 表示你要遍历的数组或集合是哪一个 System.out.println(i); } } }传统的for循环遍历 既可以对元素赋值 也可以遍历数组元素 增强for循环遍历 不可以对元素进行赋值 底层使用的是iteratoer迭代器进行遍历