Java文件命名和main函数
在上一章的教程中,我们创建了一个Main.java文件,然后我们使用以下的代码打印出”Hello World”:
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
那我们来简单了解一下以上的代码:其中Main是类的名字(要注意,Java是会区别对待大小写的,所以Main和main是有区别的),文件名也必须是Main.java,因为Java中的文件和类的名字必须一致。
紧接着类的定义之后,我们有一个main函数。在任何的Java程序中,我们都会看到此函数,在main函数中的代码都会被执行 。(我会在之后的章节讲解函数,现在只要知道如何使用函数就好了)
public static void main(String[] args)
在main函数中,我们使用println函数打印出字符串“Hello World!”。
从这段代码我们学到重要的Java语法特征便是:每个Java程序都必须要有一个类,类的名字必须和文件名字一致。如果想要运行此程序,程序中必须要有一个main函数,运行程序时,main函数中的代码就会被执行。
注释
在进入正式的语法教学之前,我想聊聊注释。注释是编辑代码中不可或缺的一部分,表面上,注释只是对我们的代码起到解释说明的作用。可是当我们的代码写了很多之后,好的注释则能帮助我们了解代码的功能和目的。不写注释的话,很容易造成我们完全忘记某个代码块的意义。所以我们需要注释来帮助我们更好地理解和维护代码。
在Java中有两种方法编辑注释,一种是单行注释,就是使用 // 开头,紧接着注释:
System.out.println("Hello World!.") // 打印出'Hello World!'
另一种是多行注释以 /** 开头,每一行的开头都以 * 开头,并最终以*/ 结尾:
/**
* 这是类的作用就是打印出 Hello World
*/
public class Main ...
变量
程序的作用简单来说就是通过输入一些数据,计算这些数据后,输出新的数据。所以储存数据是一个程序至关重要的功能。在Java中,变量就是一个指向储存数据的引用。每当我们创建变量的时候,我们都会让此变量指向一个数值,而下次我们需需要那个数值的时候,我们直接访问变量名就好了。
以下是创建变量的语法,一开始是数据的类型,然后是变量的名字,紧跟着是数值,最后必须以分号( ; )结尾:
type variable = value;
那我们来看一个具体的例子:
String name = "Enoch";
System.out.println(name);
在上面的代码中,我创建了一个变量叫做name,然后创建另一个字符串叫做”Enoch”,并将此字符串分配给name。当我们想要打印出此字符串的时候,只需要将name变量传给println函数即可。
这里要注意的是,变量的名字不能是Java中已被占用的关键词,比如class, public等等,以下是Java中关键词的一些链接:
Java中变量的命名方式也有讲究,最好是以小写字母为开头,不能以数字作为开头,也不能包含特殊字符 (&, $, _),如果一个名字中包含多个单词,那么第一个单词后的其他单词需要将首字母大写,以下的变量命名都是合理的:
idNumber
newVar1
student25
studentIdNumber
简单来说,变量是一个名字,我们让这个名字指向一个一组数据,那么这个名字中便隐含了数据在电脑中的真实物理地址,每当我们需要数据的时候,通过解析变量名指向的地址我们就能找到那组数据。
内置数据类型
除了字符串,Java中有8种基本内置数据类型,这些数据类型的大小和作用各不相同:
数据类型 | 数据大小 | 具体描述 |
byte | 1 byte | -128到127之间的整数 |
short | 2 bytes | -32,768到32,767之间的整数 |
int | 4 bytes | 整数(-2,147,483,648 ~ 2,147,483,647) |
long | 8 bytes | 长整数(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807) |
float | 4 bytes | 浮点数(小数后6到7位) |
double | 8 bytes | 浮点数(小数后15位) |
boolean | 1 bit | true 或 false(正或否) |
char | 2 bytes | 单个字符或字母(ASCII数值) |
在以下的代码中,我们就创建了两个数字,并将他们相加,然后将结果打印出来:
int num1 = 100, num2 = 200;
int sum = num1 + num2;
System.out.println(sum) // 300
以下是不同类型数据的赋值方法:
int intNum = 10;
float floatNum = 5.99;
boolean bool = true;
char letter = 'A';
常量是一旦被赋值后就不能改变的变量,在创建常量的时候必须要在数据类型前加上 final 关键词:
final int myNum = 15;
这个时候如果你再赋值其他的数据给myNum,编译器就会报错:
myNum = 20 // Error
类型转换
类型转换的意思就是你把一个数值转换成另一个数据类型。在Java中,你有两种转换方式:自动类型转换和强制类型转换。
自动类型转换:转换前的数据的位数(数据大小)要低于转换后的数据类型,比如 int 数据类型的位数是4 bytes,就可以转换为位数是位数是8 bytes的long数据类型。
byte -> short -> char -> int -> long -> float -> double
以下的代码就是把低位数char转换成高位数int的演示:
char c1 = 'z';
int i1 = c1; // char自动转换成int
与自动类型转换相反的便是强制类型转换,将位数大的数据类型转换成位数小的数据类型。
double -> float -> long -> int -> char -> short -> byte
在实际的编码中,我们需要在转换的数据类型前添加括号:
double doubleNum = 9.9;
int intNum = (int)doubleNum; // 9
操作符
计算机最基础的用途之一就是执行数学运算,在Java中,必然也提供了丰富的运算法。我们可以把运算符分类以下几个类型:
- 算数运算符:用于数学表达中,比如加减乘除
- 关系运算符:用于比较大小或相等性
- 位运算符:作用于所有的二进制位上
- 逻辑运算法:用于进行布尔运算(真或真,真和假)
- 赋值运算法:用于给变量进行重新赋值
- 其他运算法:条件运算法(?:),instanceof运算符
算数运算符
操作符 | 描述 | 例子 |
+ | 加法:相加操作符两侧的值 | x + y |
– | 减法:操作符左侧的数减去右侧的数 | x – y |
* | 乘法:相乘操作符两侧的值 | x * y |
/ | 除法:操作符左侧的数除以右侧的数 | x / y |
% | 取余:操作符左侧的数除以右侧的数得到的余数 | x % y |
++ | 自增:操作数的值增加1 | x++ |
— | 自减:操作数的值减少1 | x– |
下面的代码简单演示了基本的逻辑运算:
int a = 5;
int b = 10;
int c = 15;
int d = a + b; // 15
int e = c % a; // 0
a++; // 6
关系运算符
操作符 | 描述 | 例子 |
== | 检查如果两个操作数的值是否相等,如果相等条件为真 | x == y |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真 | x != y |
> | 检查左操作数是否大于右操作数,如果是条件为真 | x > y |
< | 检查左操作数是否小于右操作数,如果是条件为真 | x < y |
>= | 检查左操作数的值是否大于或等于右操作数的值 | x >= y |
<= | 检查左操作数的值是否小于或等于右操作数的值 | x <= y |
下面是简单的运算符演示:
int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a <= b); // true
位运算符
操作符 | 描述 | 例子 |
& | 如果操作符左右两侧相对应数都在是1,则结果为1,否则为0 | x & y |
| | 如果相对应位都是0,则结果为0,否则为1 | x | y |
^ | 如果相对应位置相同,则结果为0,否则为1 | x ^ y |
~ | 按位取反运算符:翻转操作数的每一位,既0变为1,1变为0 | ~x |
<< | 按位左移运算符:左操作数按位左移右操作符指定的位数 | x << 2 |
>> | 按位右移运算符:左操作数按位右移右操作符制定的位数 | x >> 2 |
>>> | 按位右移补零运算符:左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 | x >>> 2 |
逻辑运算符
操作符 | 描述 | 例子 |
&& | 逻辑与运算符:当且仅当两个操作数都为真,条件才为真 | x && y |
|| | 逻辑或操作符:如果两个操作数其中任何一个为真,条件为真 | x || y |
! | 逻辑非运算符:用来反转操作数的逻辑状态。如果条件为true,则非运算符后得到false | !x |
赋值操作符
操作符 | 描述 | 例子 |
= | 将右操作数的值赋值与左操作数 | x = y |
+= | 加和赋值操作符:将左操作数和右操作数相加,并赋值与左操作数 | x += y等于x = x + y |
-= | 减和赋值操作符:将左操作书和右操作数相减,并将结果赋值与左操作数 | x -= y |
*= | 乘和赋值操作符,将左操作数和右操作数相乘赋值给左操作数 | x *= y |
/= | 除和赋值操作符,将左操作数和右操作数相除赋值给做操作数 | x /= y |
<<= | 左移位赋值操作符 | x <<= 2等于x = x << 2 |
>>= | 右移位赋值操作符 | x >>= 2 |
&= | 按位与赋值操作符 | x &= 2 |
^= | 按位异或赋值操作符 | x ^= 2 |
|= | 按位或赋值操作符 | x |= 2 |
接下来我们来聊聊两个特殊的运算符,一个是条件运算符(?:),另一个是 instanceof 运算符,这两个涉及到的内容在后面的章节会深入探讨,这里我们只需要简单了解即可:
条件运算符(三元运算符)会根据布尔表达式的判断,来决定将哪个值赋给变量:
variable x = (expression) ? value1 if true: value2 if false
以下是代码实例,以下的代码根据score变量的数值,来赋值reward变量。如果score大于或等于80,那么reward就是100,不然就是50
int score = 80;
int reward = (store >= 80) ? 100 : 50;
instanceof 能够对实例进行判断,检查该实例是否是一个特定的类型(类或接口),这方面的内容我们后面的章节会深入
Main a = new Main();
boolean isMain = a instanceof Main;
System.out.println(isMain); // true
数组
数组是一种特殊的数据类型,它可以用来存储多个相同数据类型的数值,从而达到使用一个变量操作多个数值的作用。声明一个数组类型变量要使用方括号([ ]),数组中的数据则需要使用尖括号括起来:
int[] numbers = {10 20, 30, 40};
要拿到特定的数值,则可以使用数值的索引号,索引号从0开始,直到n – 1(n是数组的长度)。索引号必须放在变量之后,并放在方括号中:
String[] names = {"Alice", "David", "Enoch", "Alex"};
System.out.println(names[0]); // Alice
System.out.println(names[3]); // Alex
上面的代码的作用就是打印出第一个值和最后一个值。如果要改变数组中的值,则需要通过索引号另外赋值:
names[0] = "Daniel" // 将Alice换成Daniel
一个数组也有其内置的变量,就是length,通过length可以拿到数组的长度:
String[] cars = {"BMW", "Ford", "Porsche", "Ferrari"};
System.out.prinln(cars.length); // 4
数组的升级版便是多维数组,多维数组是一个包含一个或多个数组的数组,一个二维数组就是一个矩阵,可以用以下的方式定义:
int[][] numMatrix = { {1, 2, 3, 4}, {5, 6, 7, 8}};
要拿到多维数组的值则需要使用多个方括号:
int num = numMatrix[0][3]; // 4
numMatrix[1][2] = 3; // 将7变为3
数组是个重要的数据类型,在循环的章节我们会继续讲到如何使用for循环语句遍历数组。
字符串和数学
字符串String和数学Math是两个java内置的类,也是最常用的类,我们接下来就来聊聊如果使用它们。
如果想创建一个字符串,我们只需要在变量名的前面加上 String 即可:
String message = "Hello World";
而每个类都有自己的函数(function),在String中,有很多常用内置的函数供我们使用:
- length – 长度
- toUpperCase – 转换为大写
- indexOf(x) – 找到特定字符串的位置
System.out.println(message.length()); // 11
System.out.println(message.toUpperCase()); // HELLO WORLD
System.out.println(message.indexOf("World")); // 6
Math类则提供了很多帮助我们执行数学任务的函数:
- max(x, y) – 判断较大的值
- abs(x) – 得到绝对值
- sqrt(x) – 平方根
- random() – 得到一个随机的在0和1之间的浮点数(不包括1)
System.out.println(Math.max(2, 20)); // 20
System.out.println(Math.abs(-25)); // 25
System.out.println(Math.sqrt(25)); // 5.0
System.out.println(Math.random()); // 0.52434....
String和Math的函数还有很多,可以参考以下的官方文档:
课后练习
创建一个Calculator类,在main函数中创建两个变量,并分别赋予不同的整数,最后使用Math的内置函数打印出较大的那一个。