JDK:Java Development Kit
JRE:Java Runtime Environment
JRE运行java字节码的虚拟机
JDK包含JRE、编译器、调试器等开发工具
JSR规范:Java Specification Request
JCP组织:Java Community Process
RI:Reference Implementation
TCK:Technology Compatibility Kit
后缀文件:
.java:这个可执行程序其实就是JVM,运行Java程序,就是启动
.JVM,然后让JVM执行指定的编译后的代码;
.javac:这是Java的编译器,它用于把Java源码文件(以.java后缀结尾)编译为Java字节码文件(以.class后缀结尾);
.jar:用于把一组.class文件打包成一个.jar文件,便于发布;
.javadoc:用于从Java源码中自动提取注释并生成文档;
.jdb:Java调试器,用于开发阶段的运行调试。
IDE是集成开发环境:Integrated Development Environment
class :定义类
public :表示类公开
static :静态
名为main
的方法
public static void main(String[] args) {
...
}
此定义为java程序的固定入口(从main开始执行)
其中String[] args参数必须有(规定),为外界传入main方法的参数
若写为其他形式,则为方法重载
为什么main方法定义在类里面?(C语言中main为主函数在外界)
java源码文件运行过程:
为什么只能定义一个public?
java是面向对象的语言,程序基本单位为class
(面向对象基本单位都是class?)
类名要求:
public表示class公开,不写也能正确编译,但是这个类将无法从命令行执行(什么意思?)
定义变量:int x=1;
无初始值时默认为0
整数类型:byte、short、int、long
浮点数类型:float、double
字符类型:char
布尔类型:boolean
浮点型:
float类型,需要加上后缀 f
float类型可最大表示 3.4 3.4 3.4x 1 0 38 10^{38} 1038
double类型可最大表示 1.79 1.79 1.79x 1 0 308 10^{308} 10308
**布尔型:**ture(1)or false(0)
Java语言对布尔类型的存储并没有做规定,理论上存储布尔类型只需要1 bit,但是通常JVM内部会把boolean表示为4字节整数。
**字符类型:**char使用单引号‘’
字符串string为双引号“”
引用类型(类似于c指针)
**常量:**定义变量时加final
如final double PI = 3.14;
常量在定义初始化后不可再赋值
(根据习惯,常量名通常全部大写)
var关键字:
类型名太长写起来麻烦
StringBuilder sb = new StringBuilder();
省略变量类型为
var sb = new StringBuilder();
编译器会自动根据赋值语句判断类型
变量作用范围与c语言类似
位运算:
&与 |或 ~非
多位时 按二进制位运算
运算优先级
在Java的计算表达式中,运算优先级从高到低依次是:
()
! ~ ++ --
*/ %
+-
<< >> >>>
&
|
+= -= *= /=
类型自动提升与强制转型(同C语言)
NaN表示Not a Number
Infinity表示无穷大
Infinity表示负无穷大
要显示一个字符的Unicode编码,只需将char类型直接赋值给int类型即可,如:
int n2 = '中'; // 汉字“中”的Unicode编码是20013
可直接用转义字符\u+Unicode编码来表示一个字符,如:
char c4 = '\u4e2d'; // '中',因为十六进制4e2d = 十进制20013
字符串类型:String
null
空值不等于 空字符串“”
关键字new:
定义数组类型:
int[] ns = new int[5];
可用数组变量.length
获取数组大小
定义时直接初始化
int[] ns = new int[] { 68, 79, 91, 85, 62 };
简写int[] ns = { 68, 79, 91, 85, 62 };
输出:
System.out.println()
(println是print line的缩写)
若不换行可用print
格式化输出:
System.out.printf()
通过占位符%?
把后面参数 格式化为指定格式
占位符 | |
---|---|
%d | 格式化输出整数 |
%x | 格式化输出十六进制整数 |
%f | 格式化输出浮点数 |
%e | 格式化输出科学计数法表示的浮点数 |
%s | 格式化字符串 |
输入:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象
System.out.print("Input your name: "); // 打印提示
String name = scanner.nextLine(); // 读取一行输入并获取字符串
System.out.print("Input your age: "); // 打印提示
int age = scanner.nextInt(); // 读取一行输入并获取整数
System.out.printf("Hi, %s, you are %d\n", name, age); // 格式化输出
}
}
Scanner
会自动转换数据类型,不必手动转换(???这句的意义在哪?)
判断值类型变量是否相等 用==
但==
在引用类型中表示引用是否相等(相当于地址)而不是内容
判断内容用***.equals();
如:s1.equals(s2);
(注: 如果变量s1
为null
,会报NullPointerException
)
要避免,可用:
if(s1 != null && s1.equals(s2));
或将可能是null的引用类型放在后面括号内
什么时候需要new
?
对象实例化的时候——————还不确定
new解释
for each
循环,遍历数组:
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 4, 9, 16, 25 };
for (int n : ns) {
System.out.println(n);
}
}
}
循环变量n不是计数器,而是直接对应数组每个元素。(无法指定遍历顺序,也无法获取数组索引)
break
语句总是跳出自己所在的那一层循环
Arrays.toString()
,可以快速打印数组内容:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 1, 2, 3, 5, 8 };
System.out.println(Arrays.toString(ns));
}
}
Arrays.sort()
排序(从小到大):
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] ns = { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 };
Arrays.sort(ns);
System.out.println(Arrays.toString(ns));
}
}
要打印一个二维数组,可以使用两层嵌套的for循环:
for (int[] arr : ns) {
for (int n : arr) {
System.out.print(n);
System.out.print(', ');
}
System.out.println();
}
Java标准库的Arrays.deepToString()
打印多维数组:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][] ns = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
System.out.println(Arrays.deepToString(ns));
}
}
命令行参数:
命令行参数类型是String[]
数组;
命令行参数由JVM接收用户输入并传给main
方法;