Skip to main content

Java 学习记录-入门内容

· 7 min read
小卡
大家好,这里是好学爱摸鱼的小卡!

Java 学习记录-入门内容

入口程序规定

Java 入口程序规定的方法必须是静态方法,方法名必须为main,括号内的参数必须是 String 数组。

public class Hello {
public static void main(String[] args) { // 方法名是main
// 方法代码...
} // 方法定义结束
}

注释

// 这是注释...
/*
这是注释
blablabla...
这也是注释
*/
/**
- 可以用来自动创建文档的注释
*
- @auther liaoxuefeng
*/

数据类型

基本数据类型
  • 整数类型:byte, short, int, long
  • 浮点数类型:float, double
  • 字符类型:char
  • 布尔类型:boolean

计算机内存的最小存储单元是字节(byte),一个字节就是一个 8 位二进制数,即 8 个 bit。

注意char类型使用单引号',且仅有一个字符,要和双引号"的字符串类型区分开。

引用数据类型

除了上述基本类型的变量,剩下的都是引用类型。

  • 字符串
  • ...

引用类型的变量类似于 C 语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置。

常量

常量在定义时进行初始化后就不可再次赋值,再次赋值会导致编译错误。 常量的作用是用有意义的变量名来避免魔术数字(Magic number),例如,不要在代码中到处写3.14,而是定义一个常量。如果将来需要提高计算精度,我们只需要在常量的定义处修改,例如,改成3.1416,而不必在所有地方替换3.14。 根据习惯,常量名通常全部大写。


整数运算

运算优先级

在 Java 的计算表达式中,运算优先级从高到低依次是:

  • ()

  • ! ~ ++ --

  • * / %

  • + -

  • > >>>

  • &

  • |

  • += -= *= /=

记不住也没关系,只需要加括号就可以保证运算的优先级正确。

浮点数运算

浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算。

溢出

整数运算在除数为0时会报错,而浮点数运算在除数为0时,不会报错,但会返回几个特殊值:

  • NaN表示 Not a Number
  • Infinity表示无穷大
  • -Infinity表示负无穷大
double d1 = 0.0 / 0; // NaN
double d2 = 1.0 / 0; // Infinity
double d3 = -1.0 / 0; // -Infinity

布尔运算

对于布尔类型boolean,永远只有truefalse两个值。 布尔运算是一种关系运算,包括以下几类:

  • 比较运算符:>>=,``,>=,` 0); // false
boolean result = true || (5 / 0 > 0); // true
三元运算符

Java 还提供一个三元运算符b ? x : y,它根据第一个布尔表达式的结果,分别返回后续两个表达式之一的计算结果。


字符和字符串

在 Java 中,字符和字符串是两个不同的类型。

字符(基本数据类型)

单引号表示字符。 字符类型char是基本数据类型,它是character的缩写。一个char保存一个 Unicode 字符:

char c1 = 'A';
char c2 = '中';

因为 Java 在内存中总是使用 Unicode 表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。要显示一个字符的 Unicode 编码,只需将char类型直接赋值给int类型即可:

int n1 = 'A'; // 字母“A”的Unicodde编码是65
int n2 = '中'; // 汉字“中”的Unicode编码是20013

还可以直接用转义字符\u+Unicode 编码来表示一个字符: // 注意是十六进制:

char c3 = '\u0041'; // 'A',因为十六进制0041 = 十进制65
char c4 = '\u4e2d'; // '中',因为十六进制4e2d = 十进制20013
字符串类型(引用数据类型)

char类型不同,字符串类型String是引用类型,我们用双引号"..."表示字符串。一个字符串可以存储 0 个到任意个字符。 常见的转义字符包括:

  • \"  表示字符"
  • \'  表示字符'
  • \\  表示字符\
  • \n  表示换行符
  • \r  表示回车符
  • \t  表示 Tab
  • \u####  表示一个 Unicode 编码的字符
字符串连接

Java 的编译器对字符串做了特殊照顾,可以使用+连接任意字符串和其他数据类型,这样极大地方便了字符串的处理。 如果用+连接字符串和其他数据类型,会将其他数据类型先自动转型为字符串,再连接。

多行字符串

从 Java 13 开始,字符串可以用"""..."""表示多行字符串(Text Blocks)了。

不可变特性

Java 的字符串除了是一个引用类型外,还有个重要特点,就是字符串内容不可变。

空值 null

引用类型的变量可以指向一个空值null,它表示不存在,即该变量不指向任何对象。


数组类型

定义一个数组类型的变量,使用数组类型“类型[]”,例如,int[]。和单个基本类型变量不同,数组变量初始化必须使用new int[5]表示创建一个可容纳 5 个int元素的数组。 Java 的数组有几个特点:

  • 数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false
  • 数组一旦创建后,大小就不可改变。

要访问数组中的某一个元素,需要使用索引。数组索引从0开始,例如,5 个元素的数组,索引范围是0~4。 可以修改数组中的某一个元素,使用赋值语句,例如,ns[1] = 79;。 可以用数组变量.length获取数组大小。 int[] ns = new int[5]; 数组是引用类型,在使用索引访问数组元素时,如果索引超出范围,运行时将报错 也可以在定义数组时直接指定初始化的元素,这样就不必写出数组大小,而是由编译器自动推算数组大小。 int[] ns = new int[] { 68, 79, 91, 85, 62 }; 简写 int[] ns = { 68, 79, 91, 85, 62 }; 注意数组是引用类型(比如字符串类型),并且数组大小不可变。

数组操作

遍历数组

通过for循环就可以遍历数组。

int[] ns = { 1, 4, 9, 16, 25 };
for (int i=0; i<ns.length; i++) {
int n = ns[i];
System.out.println(n);
}

第二种方式是使用for each循环,直接迭代数组的每个元素:

int[] ns = { 1, 4, 9, 16, 25 };
for (int n : ns) {
System.out.println(n);
}
打印数组内容

使用for each循环来打印它:

for (int n : ns) {
System.out.print(n + ", ");
}

Java 标准库提供了Arrays.toString(),可以快速打印数组内容:

System.out.println(Arrays.toString(ns));
数组排序

对数组进行排序是程序中非常基本的需求。常用的排序算法有冒泡排序、插入排序和快速排序等。 实际上,Java 的标准库已经内置了排序功能,我们只需要调用 JDK 提供的Arrays.sort()就可以排序: int[] ns = { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 }; Arrays.sort(ns); 必须注意,对数组排序实际上修改了数组本身。

多维数组(跳过)
命令行参数

Java 程序的入口是main方法,而main方法可以接受一个命令行参数,它是一个String[]数组。 我们可以利用接收到的命令行参数,根据不同的参数执行不同的代码。例如,实现一个-version参数,打印程序版本号:

public class Main {
public static void main(String[] args) {
for (String arg : args) {
if ("-version".equals(arg)) {
System.out.println("v 1.0");
break;
}
}
}
}

` 上面这个程序必须在命令行执行,我们先编译它:

$ javac Main.java

然后,执行的时候,给它传递一个-version参数:

$ java Main -version
v 1.0

` 这样,程序就可以根据传入的命令行参数,作出不同的响应。


流程控制(跳过)