Java的前身是Oak,詹姆斯·高斯林是java之父。
Java是一种与平台无关的语言,其源代码可以被编译成一种结构中立的中间文件(.class,字节码文件)于Java虚拟机上运行。
因范围JDK>JRE>JVM,所以只需要安装JDK即可。
Java字节码的格式通用,具有跨平台的特性,但这种跨平台建立在JVM虚拟机上,只有通过JVM处理之后,才可以将字节码转换为机器码运行。
JVM虚拟机使Java具有“一次编译,随处运行”的特质:
Java字节码的两种执行方式:
GC实现动态回收垃圾,可以自动识别不再被程序引用的对象加以回收,可以通过将某对象的引用变量置空来加速对于该对象的回收。垃圾回收一般是在CPU空闲或内存不足时自动进行的,程序员无法确定GC回收的时间和顺序,虽然可以通过调用对象的finalize()来建议,但仍不能保证。此外,由于JRE会使用后台进程检测和控制GC,所以必然会对系统产生一定影响。
所有代码都写在类体之中,因为Java是一个纯面向对象语言,一个完整的Java程序至少有一个类。一个Java文件只能有一个公共类,且该公共类的类名与Java文件名必须相同,但可以有多个非公共类。
public class HelloWord {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
编译Java程序:
javac HelloWorld.java
运行Java程序:
javac HelloWorld
System.out.println("Hello world!"); // 打印一行
System.out.print("Hello World!"); // 打印一段
// 单行注释
/*
* 这是多行注释
*/
/**
* 这是文档注释
* 可以通过javacdoc将注释的内容生成HTML格式JavaAPI文档
*/
除了下划线"_"和"$"符号以外,不包含任何其他特殊字符,如空格。
基本类型 | 关键字 | 大小 |
---|---|---|
布尔型 |
boolean | 1位 |
字节型 | byte | 8位 |
短整型 | short | 16位 |
字符型 | char | 16位 |
整型 | int | 32位 |
浮点型 | float 后面加F/f | 32位 |
长整型 | long 后面加L/l | 64位 |
双精度 | double 后面加D/d | 64位 |
字符型可以直接使用Unicode值来表示,比如'\u00FF'等。
Java包括5种引用类型:
自动类型转换:
不损失精度——
byte——>short——>int——>long/double
char——>int
float——>double
损失精度(整型转空间不大于的浮点数)——
int---->float
long---->float/double
强制类型转换:
数据类型变量1 = (数据类型)变量2;
一元操作符:++、--、!、~、(type)强转
对于/和%来讲,如果其中至少有一个操作数是浮点数,就可以允许除数为0,结果是Infinity和(-Infinity);而如果是对0取余,那任何操作数结果都是NaN(非数)。
位运算:
操作符 | 描述 | 示例(均原码) |
---|---|---|
& | 按位与,1与1返回1 | 001 & 111 = 001 |
| | 按位或,存在1返回1 | 001 | 101 = 101 |
^ | 按位异或,相同返回0反之返回1 | 001 ^ 101 = 100 |
<< | 左移,右边空出补0,等价乘方 | 10011010 << 1 = 10110100 |
>> | 右移,左边空出补0/1(看符号),等价开方 | 10011010 >> 1 = 10001101 |
>>> | 无符号右移,无视正负号左边空出补0 | 10011010 >> 1 = 01001101 |
关系运算:
==使用过程中,如果比较的两个都是数值型,那只要值相等都返回true,即使是字符和整型、整型和浮点比较
break和标签语句配合使用可以跳出任意循环/程序块。
outer : for(int i = 0; i < 5; i ++) {
for(int j = 0; j < 5; j ++) {
System.out.println(i+" ");
if(j == 2) break outer;
}
}
直接输出数组名的时候,会输出数组对象的哈希码,但是如果是字符数组,则会输出一个”“空字符串,这是因为Java内部会将一个字符型数组看成一个字符串。数组变量名储存在栈中,也就是首地址,而在堆中储存数组元素。
数组初始化:
// 静态初始化:
int[] a1 = {1, 2, 3};
int[] a2 = new int[] {1, 2, 3};
int a3[] = {1, 2, 3};
// 动态初始化:
int[] a4 = new int[2];
a4[0] = 1;
如果是二维数组,则可以不必要求每个数据元素的长度相等,也就是内部的一维数组的长度可以不必相同,使用动态初始化即可。